代码之家  ›  专栏  ›  技术社区  ›  Bruno Lopes

process.start(“IIS manager.lnk”)失败,返回“系统找不到指定的文件”

  •  2
  • Bruno Lopes  · 技术社区  · 13 年前

    我正在启动路径 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);

    • _快捷方式的类型为fileinfo

    • _ shortcut.exists为true,因此可以找到该文件
    • 将快捷方式.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);
        }
    

    它确实有点基于“环境”。

    第二次澄清:

    • 它似乎在Windows7X86中工作,但在Windows7X64中不工作。
    5 回复  |  直到 9 年前
        1
  •  7
  •   Sat Thiru    9 年前

    我最近碰到这个。基于Windows窗体的解决方案,VS2013、X64计算机。process.start()无法通过.lnk文件启动应用程序。使用Process Explorer时,.lnk文件中指定的目标似乎未正确解析为C:\Program Files(x86)…而不是C:\程序文件…我听从了布鲁诺的绝妙建议,但我的目标再次被标记为“任何CPU”。

    在一些头疼之后,发现在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/

        2
  •  6
  •   Bruno Lopes    13 年前

    找到了问题。

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

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

        3
  •  2
  •   Richard Szalay    13 年前

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

    Process.Start("inetmgr.exe")
    

    如果您想继续使用快捷方式,如果您使用 ProcessStartInfo 并设置 ProcessStartInfo.UseShellExecute true

        4
  •  1
  •   Dirk Vollmar    13 年前

    你能确定你是从一个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
  •  0
  •   M-Peror    13 年前

    这有点像黑客,但是试着这样启动它:

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

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