none
Автоматическая установка службы на удаленном компьютере RRS feed

  • Вопрос

  • Здравствуйте.

    Столкнулся с проблемой автоматической установки службы на группе компьютеров.

    На удаленном компьютере находится файл, который скачивает и запускает файлы (система обновления).

    Я хочу на нем установить службу. У меня есть логин и пароль пользователя, который является администратором на всех этих компьютерах.

    Код файла, который после того, как его скачали и запустили пытается установить службу:

    using (Process cmd = new Process())
                    {
                        cmd.StartInfo = new ProcessStartInfo
                        {
                            CreateNoWindow = true,
                            UseShellExecute = false,
                            RedirectStandardError = true,
                            RedirectStandardOutput = true,
                            UserName = "Имя пользователя",
                            Password = MakeSecureString("Пароль"),
                            Verb = "runas",
                            FileName = fileName,
                            Arguments = "-install"
                        };
    
                        cmd.Start();
                        cmd.WaitForExit();
    
                        int exitCode = cmd.ExitCode;
    
                        string output = cmd.StandardOutput.ReadToEnd();
                        string error = cmd.StandardError.ReadToEnd();
    
                        string message =
                               string.Format("EXIT CODE: {0}\n OUTPUT: {1}\n ERROR: {2}\n ",
                               exitCode,
                               output,
                               error);
    
                        Log(message);
    
                        return exitCode == 0;
    
                    }

    Но все равно мне система не дает установку службы, хотя я на компьютере могу это сделать в ручную.

    Можно ли как-то запустить командную строку и от нее запустить этот файл с  правами администратора без участия пользователя, т.е. в автоматическом режиме?

    Помогите пожалуйста разобраться с данной проблемой.

    Спасибо!!!




    • Изменено Alexey110 19 октября 2017 г. 8:00
    19 октября 2017 г. 7:57

Ответы

  • Наверное проблема в том, что при UseShellExecute = false параметр verb не учитывается. Попробуйте установить UseShellExecute = true.  Но RedirectStandartOutput тогда работать не будет. Нужно будет придумать что-то другое для получения результатов программы.

    • Предложено в качестве ответа Alexander RusinovModerator 19 октября 2017 г. 21:08
    • Помечено в качестве ответа Alexey110 23 октября 2017 г. 6:59
    19 октября 2017 г. 17:54
  • Естественно, если на машине включен UAC, нельзя просто взять и выполнить произвольную программу в обход его сообщения. Иначе, в чем бы был смысл UAC. Как минимум один раз это сообщение должно быть задействовано, либо при запуске программы, либо при добавлении ее в задания. Иначе не работает.

    А вообще, для управления службами на удаленной машине наверное нужно использовать не командную строку, а специальный API Service Control Manager. Насколько я знаю, он позволяет работать с удаленной машиной через RPC, если предварительно вызвать LogonUser /  ImpersonateLoggedOnUser с учеткой администратора удаленной машины. См. https://msdn.microsoft.com/en-us/library/windows/desktop/ms684323(v=vs.85).aspx  (но в любом случае удаленная машина должна быть настроена соответствующим образом, чтобы принимать удаленные соединения) 


    • Помечено в качестве ответа Alexey110 23 октября 2017 г. 6:59
    20 октября 2017 г. 14:52

Все ответы

  • Наверное проблема в том, что при UseShellExecute = false параметр verb не учитывается. Попробуйте установить UseShellExecute = true.  Но RedirectStandartOutput тогда работать не будет. Нужно будет придумать что-то другое для получения результатов программы.

    • Предложено в качестве ответа Alexander RusinovModerator 19 октября 2017 г. 21:08
    • Помечено в качестве ответа Alexey110 23 октября 2017 г. 6:59
    19 октября 2017 г. 17:54
  • Спасибо, но наверное это не то, что мне нужно. Я ввел Вас в заблуждение и не правильно описал ситуацию и Verb здесь мне никак не помог, т.к. он вызывает UAC после запуска. Если я запускаю процесс установки программно, то мне выдается ошибка:

    System.Security.SecurityException: Источник не найден, но не удалось выполнить поиск по нескольким или всем журналам событий.  Недоступные журналы: Security.

    Если даже я дам доступ к этому журналу, то будет другая ошибка, в общем для установки сервиса нужен запуск программы с более высоким приоритетом безопасности.

    На удаленном компьютере у меня нет возможности сделать это. У меня есть только учетка администратора, но я все равно не могу под ней установить сервис. Я где-то вычитал, что даже если войти под учеткой админа, то все равно UAC будет запрашивать разрешение на установку, но на удаленном компьютере некому будет давать разрешение на запуск программы, да и так не должно быть.

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

    Можете еще что-нибудь посоветовать?

    Спасибо.



    • Изменено Alexey110 20 октября 2017 г. 6:31
    20 октября 2017 г. 6:30
  • В планировщике заданий установите галки "Выполнять вне зависимости от регистрации пользователя" и "Выполнить с наивысшими правами", и параметр "Настроить для..." установите текущую ОС. Тогда должно запустить без вывода окна UAC.
    20 октября 2017 г. 8:15
  • Дело в том, что планировщик заданий я хотел использовать как "костыль" и не не могу просто "ручками" установить этот параметр, т.к. задача создается c# скриптом, который скачивается с удаленного сервера, а установка параметра "Выполнить с наивысшими правами" тоже требует прав администратора, которых почему-то нет у этой учетки (хотя учетка администратора).

    Какая-то прям "круговая порука" .

    20 октября 2017 г. 10:55
  • Естественно, если на машине включен UAC, нельзя просто взять и выполнить произвольную программу в обход его сообщения. Иначе, в чем бы был смысл UAC. Как минимум один раз это сообщение должно быть задействовано, либо при запуске программы, либо при добавлении ее в задания. Иначе не работает.

    А вообще, для управления службами на удаленной машине наверное нужно использовать не командную строку, а специальный API Service Control Manager. Насколько я знаю, он позволяет работать с удаленной машиной через RPC, если предварительно вызвать LogonUser /  ImpersonateLoggedOnUser с учеткой администратора удаленной машины. См. https://msdn.microsoft.com/en-us/library/windows/desktop/ms684323(v=vs.85).aspx  (но в любом случае удаленная машина должна быть настроена соответствующим образом, чтобы принимать удаленные соединения) 


    • Помечено в качестве ответа Alexey110 23 октября 2017 г. 6:59
    20 октября 2017 г. 14:52
  • Спасибо. 
    23 октября 2017 г. 7:02