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

时间:2010-11-16 11:02:47

标签: c# .net windows

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

该链接显示在dir上,因此存在。

可以是权限吗?

注意:

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

澄清:

  • 代码如下:

    public void Execute(){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 x64。

5 个答案:

答案 0 :(得分:7)

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

经过一番搔痒,结果发现VS11 +中有一个名为"首选32位" 的新编译器标志,默认情况下已经检查过。即使我的操作系统是64位且平台设置为AnyCPU,这也迫使EXE输出为32位。在我取消选中并重新编译之后,问题就解决了。

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

答案 1 :(得分:6)

发现了这个问题。

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

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

答案 2 :(得分:2)

这实际上可能与您的情况无关,但您可以使用

启动IIS管理器
Process.Start("inetmgr.exe")

如果您想继续使用快捷方式,如果您使用ProcessStartInfo启动流程并将ProcessStartInfo.UseShellExecute设置为true

,则可能会有效

答案 3 :(得分: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来运行传递的文件。正如Raymond Chen所描述的,shell函数需要一个STA线程:

  

<强> One possible reason why ShellExecute returns SE_ERR_ACCESSDENIED and ShellExecuteEx returns ERROR_ACCESS_DENIED

答案 4 :(得分:0)

这有点像黑客,但尝试启动它:

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

请注意保存路径中的空格所需的 double 引号。 这样,您可能会在命令环境中看到更准确的错误消息和/或随后走动以查看路径的错误。