【问题标题】:Process.Start("IIS Manager.lnk") fails with "The system cannot find the file specified"Process.Start("IIS Manager.lnk") 失败并显示“系统找不到指定的文件”
【发布时间】:2010-11-16 11:02:46
【问题描述】:

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

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

可以是权限吗?

注意事项:

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

说明:

  • 代码如下:

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

  • _shortcut 的类型为 FileInfo

  • _shortcut.Exists 为真,所以可以找到文件
  • 将 _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。

【问题讨论】:

  • 它对我有用,所以我认为这是您的环境的问题。您是否使用Process.Start() 的其他选项?您是否使用完整路径?您是否以其他用户的身份运行您的应用?
  • 这对我来说很好用。让我们看看你调用Process.Start()的代码部分。
  • 您可以使用 Sysinternals 的 Process Monitor 找出您的进程实际在哪里寻找该文件。

标签: c# .net windows


【解决方案1】:

我最近遇到了这个问题。基于 Windows 窗体的解决方案,VS2013,x64 机器。 Process.Start() 无法通过 .lnk 文件启动应用程序。使用进程资源管理器,似乎 .lnk 文件中指定的目标错误地解析为 c:\program files (x86)... 而不是 c:\program files... 我遵循了 Bruno 的出色建议,但又一次我的目标已被标记为“AnyCPU”。

经过一番摸索,结果发现在 VS11+ 中有一个名为 "Prefer 32-bit" 的新编译器标志,默认选中。即使我的操作系统是 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/

【讨论】:

    【解决方案2】:

    发现问题。

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

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

    【讨论】:

    • 还必须禁用“首选 32 位”选项。请参阅 Sat Thiru 的回答。
    【解决方案3】:

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

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

    如果您想继续使用快捷方式,如果您使用ProcessStartInfo 启动进程并将ProcessStartInfo.UseShellExecute 设置为true,它可能会起作用

    【讨论】:

    • 我认为默认情况下 ProcessStartInfo.UseShellExecute 设置为 true,因为其他链接似乎有效。但是我还是尝试了它,它仍然抛出异常
    【解决方案4】:

    您能确定您是从 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

    【讨论】:

      【解决方案5】:

      如前所述,您将看到“系统找不到指定的文件”错误,因为 Windows 正在 ...\SysWOW64\intsrv\ 中寻找 inetmgr.exe strong>(由文件系统重定向引起),但只存在于...\System32\intsrv\中。

      这是由您的 32 位可执行文件尝试启动 64 位可执行文件引起的。正如建议的那样,不使用 32 位可执行文件将解决此问题,但对于必须为 32 位构建(在我的情况下为 WiX 安装程序包)的任何人,请尝试以下操作。

      使用开始菜单 LNK/快捷方式到 inetmgr.exe 而不是可执行文件是一个好的开始,但需要额外的距离。这可以通过使用 explorer.exe 来提供,可以从 32 位可执行文件启动:

      System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
      startInfo.FileName = "explorer.exe";
      startInfo.Arguments = "/seperate /root,\"C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\Administrative Tools\\IIS Manager.lnk\"";
      
      System.Diagnostics.Process process = new System.Diagnostics.Process();
      process.StartInfo = startInfo;
      process.Start();
      

      【讨论】:

        【解决方案6】:

        这有点小技巧,但请尝试像这样启动它:

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

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

        【讨论】:

          猜你喜欢
          • 2019-05-14
          • 1970-01-01
          • 1970-01-01
          • 2020-03-31
          • 1970-01-01
          • 2018-04-03
          • 2011-01-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多