Process.Start(“IIS Manager.lnk”)失败,“系统找不到指定的文件”

我通过Process.Start启动pathC:\ProgramData\Microsoft\Windows\Start Menu\Programs\Administrative Tools\IIS Manager.lnk ,但是失败, The system cannot find the file specified

该链接显示在一个dir ,所以它存在。

它可以是权限?

笔记:

  • 通过迭代Start Menu目录来自动发现path。
  • 我可以通过资源pipe理器和命令行启动它。

澄清:

  • 代码如下:

    public void Execute(){Process.Start(_shortcut.FullName);}

  • _shortcut是FileInfotypes

  • _shortcut.Exists是真的,所以可以find该文件
  • 使用显式path@“C:\ ProgramData \ Microsoft \ Windows \ Start Menu \ Programs \ Administrative Tools \ IIS Manager.lnk”replace_shortcut.FullName具有相同的效果。
  • 这是一个使用Caliburn和MEF的WPF应用程序。
  • 以pipe理员身份运行具有相同的效果。

另一方面,这里似乎工作:

  [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 x64中工作。

发现问题。

WPF应用程序被编译为x86(所有其他dll被编译为AnyCPU),并在64位机器启动一些可执行文件或链接时失败。

将“平台目标”更改为AnyCPU可修复此问题。

我最近碰到了这个。 基于Windows Forms的解决方案,VS2013,x64机器。 Process.Start()无法通过.lnk文件启动应用程序。 使用进程资源管理器,似乎在.lnk文件中指定的目标不正确地解析为c:\ program files(x86)…而不是c:\ program files …我遵循Bruno的出色建议, Target已经标记为“AnyCPU”。

经过一番搔头之后,发现VS11 +中新增了一个名为“Prefer 32-bit”的编译器标志,默认情况下会被选中。 这是迫使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/

这实际上可能与您的情况无关,但您可以使用启动IIS管理器

 Process.Start("inetmgr.exe") 

如果要继续使用该快捷方式,则可能会使用ProcessStartInfo启动进程并将ProcessStartInfo设置为true

你能确定你正在尝试从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来运行传递的文件。 如Raymond Chen所述,shell函数需要一个STA线程:

为什么ShellExecute返回SE_ERR_ACCESSDENIED和ShellExecuteEx的一个可能的原因返回ERROR_ACCESS_DENIED

这是一个黑客,但尝试启动它是这样的:

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

请注意保存路径中的空格所需的引号。 这样,您可能会看到一个更精确的错误消息,或者在命令环境中四处走动,以查看路径出了什么问题。