2010-11-16 166 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/

相关问题