Process.Start («IIS Manager.lnk») завершается с ошибкой «Системе не удается найти указанный файл» - PullRequest
2 голосов
/ 16 ноября 2010

Я запускаю путь 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 \ Меню Пуск \ Программы \ Администрирование \ IIS Manager.lnk" имеет тот же эффект.
  • Это приложение WPF, использующее Caliburn и MEF.
  • Запуск от имени администратора имеет тот же эффект.

Это здесь, с другой стороны, похоже, работает:

    [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 ]

7 голосов
/ 04 января 2015

Я столкнулся с этим недавно. Решение на основе Windows Forms, VS2013, x64 машина. Process.Start () не может запускать приложения через файл .lnk. Используя Process Explorer, казалось, что цель, указанная в файле .lnk, неправильно разрешается в c: \ program files (x86) ... вместо c: \ program files ... Я последовал отличному совету Бруно, но потом снова мой Цель уже помечена как «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/

6 голосов
/ 02 декабря 2010

Обнаружена проблема.

Приложение WPF было скомпилировано как x86 (все остальные библиотеки были скомпилированы как AnyCPU), и при запуске некоторых исполняемых файлов или ссылок на 64-битной машине это не удалось.

Изменение «Platform Target» на AnyCPU исправляет это.

2 голосов
/ 16 ноября 2010

Это может не относиться к вашей ситуации, но вы можете запустить диспетчер IIS, используя

Process.Start("inetmgr.exe")

Если вы хотите продолжить использовать ярлык, он, вероятно, сработает, если вы запустите процесс, используя ProcessStartInfo и установите ProcessStartInfo.UseShellExecute на true

1 голос
/ 18 ноября 2010

Можете ли вы убедиться, что вы пытаетесь это из потока 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:

Одна из возможных причин, по которой ShellExecute возвращает SE_ERR_ACCESSDENIED, а ShellExecuteEx возвращает ERROR_ACCESS_DENIED

0 голосов
/ 16 ноября 2010

Это что-то вроде хака, но попробуйте запустить его так:

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

Обратите внимание на двойные кавычки, необходимые для сохранения пробелов в пути.Таким образом, вы можете увидеть более точное сообщение об ошибке и / или обойти в командной среде впоследствии, чтобы увидеть, что не так с путем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...