2010-11-16 79 views
1

我正在通過Process.Start啓動路徑C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Administrative Tools\IIS Manager.lnk,但它以失敗爲The system cannot find the file specifiedProcess.Start(「IIS Manager.lnk」)失敗,並顯示「系統找不到指定的文件」

該鏈接顯示在dir,所以它存在。

它可以是權限?

注:

  • 的路徑是通過遍歷Start Menu目錄自動發現。
  • 我可以通過資源管理器和命令行啓動它。

澄清:

  • 代碼如下:

    公共無效執行(){的Process.Start(_shortcut.FullName);}

  • _shortcut是類型的FileInfo

  • _shortcut.Exists爲true,所以文件可以被找到
  • 用顯式路徑替換_shortcut.FullName @「C:\ ProgramData \ Microsoft \ Windows \ Start Menu \ Programs \ Administrative Tools \ IIS Manager.lnk」具有相同的效果。
  • 這是一個使用Caliburn和MEF的WPF應用程序。
  • 以管理員身份運行具有相同的效果。

在這裏,這從另一方面似乎工作:

[Fact] 
    public void TestIisManager() 
    { 
     var path = new FileInfo(@"C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Administrative Tools\IIS Manager.lnk"); 
     Process.Start(path.FullName); 
    } 

它似乎是基於一個有點「環境」。

二澄清:

  • 似乎在Windows 7 x86的而不是在Windows 7 64位系統的工作。
+0

它爲我,所以我認爲它與你的環境有問題。你有沒有使用'Process.Start()'的更多選項?你在使用完整路徑嗎?你是否以另一個用戶的身份運行你的應用 – 2010-11-16 11:12:43

+1

這適用於我。讓我們看看你調用'Process.Start()'的代碼部分。 – 2010-11-16 11:14:33

+0

您可以使用Sysinternals的進程監視器找出您的進程實際上正在查找該文件的位置。 – 2010-11-16 13:25:46

回答

6

發現的問題。

WPF應用程序編譯爲x86(所有其他dll編譯爲AnyCPU),並且在64位計算機上啓動某些可執行文件或鏈接時失敗。

將「平臺目標」更改爲AnyCPU可修復此問題。

+0

也必須禁用「首選32位」選項。請參閱Sat Thiru的答案。 – 2017-05-16 12:31:45

0

這是一個黑客攻擊的一位,但嘗試啓動它是這樣的:

string path = @"C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Administrative Tools\IIS Manager.lnk"; 
Process.Start("cmd.exe", String.Format("/k \"\"{0}\"\"",path)); 

注意雙引號節省空間的路徑所需。 這樣,您可能會看到更精確的錯誤消息和/或之後在命令環境中四處走動,以查看路徑出了什麼問題。

2

這可能不是真正涉及到你的情況,但你可以通過使用

Process.Start("inetmgr.exe") 

如果你想繼續使用該快捷方式,它可能會工作,如果你使用一個啓動該進程啓動IIS管理器ProcessStartInfo並將ProcessStartInfo.UseShellExecute設置爲true

+0

我認爲默認ProcessStartInfo.UseShellExecute設置爲true,因爲其他鏈接似乎工作。但無論如何我仍然試過,它仍然會拋出異常 – 2010-11-16 15:58:10

1

您可以確保您正在從STA線程嘗試此操作嗎?你可以看到公寓狀態是否是一個問題,如果下面的示例成功:

using System; 
using System.Diagnostics; 

public class Program 
{ 
    // make sure to call Process.Start from an STA thread 
    [STAThread] 
    static void Main(string[] args) 
    { 
     Process.Start(@"C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Administrative Tools\IIS Manager.lnk"); 
    } 
} 

Process.Start電話ShellExecute引擎蓋運行傳遞的文件下。正如雷蒙德陳所描述的,外殼功能需要一個STA線程:

One possible reason why ShellExecute returns SE_ERR_ACCESSDENIED and ShellExecuteEx returns ERROR_ACCESS_DENIED

5

我最近碰到這個。基於Windows Forms的解決方案,VS2013,x64機器。 Process.Start()無法通過.lnk文件啓動應用程序。使用進程資源管理器,似乎在.lnk文件中指定的目標不正確地解析爲c:\ program files(x86)...而不是c:\ program files ...我遵循Bruno的出色建議,但後來我再次目標已被標記爲「AnyCPU」。

經過一些頭部劃痕之後,結果發現VS11 +中有一個新的編譯器標誌,稱爲「首選32位」默認情況下已選中。這迫使EXE輸出爲32位,即使我的操作系統是64位,並且平臺設置爲AnyCPU。我沒有選中並重新編譯後,問題就解決了。

更多閱讀在:http://blogs.microsoft.co.il/sasha/2012/04/04/what-anycpu-really-means-as-of-net-45-and-visual-studio-11/

相關問題