Запуск приложения как системы (без PSTools)

Есть некоторые ключи реестра, которые принадлежат Системе, и я не могу редактировать их, если я не запущен от имени Системы. Я хочу иметь возможность редактировать эти ключи из моего приложения VB. Любые учебники, которые я нашел, предлагают использовать PSTools, который сейчас устарел At команда или счтаски. PSTools кажется великолепным, но его лицензия кажется ограничительной (о перераспределении). At и schtasks слишком грязны и требуют задержек планирования.

Это связано с моим предыдущим вопросом. Я хочу взять то, что я обнаружил, и реализовать это через VB.

Изменить политику аудита (групповая политика)

Я также нашел это, но получаю ошибку 1314. Я понял, что несмотря на запуск VS2010 "requireAdministrator" и даже запуск моего EXE-файла в качестве администратора, он по-прежнему говорит, что мое имя пользователя в диспетчере задач (работает от имени меня, а не администратора). Я вошел в систему как администратор и получил ошибку 5 вместо этого. Даже после того, как я установил права, как было предложено в этом посте ( ошибка CreateProcessAsUser 1314), он все равно дал мне ошибку 5.

Используя приложение vb.net, работающее как SYSTEM, как мне запустить отдельный процесс для каждого вошедшего в систему пользователя?

Я изменил пример на "TokenAccessLevels.Read and Duplicate", а не MaximumAllowed.

 If Not DuplicateTokenEx(hToken.DangerousGetHandle,
            TokenAccessLevels.Read & TokenAccessLevels.Duplicate,
            Nothing,
            SECURITY_IMPERSONATION_LEVEL.SecurityImpersonation,
            TOKEN_TYPE.TokenPrimary,
            phNewToken) Then

Я получаю ошибку 5 от CreateProcessAsUser. Это во время работы VS2010 в качестве администратора.

1 ответ

http://forum.sysinternals.com/tip-run-process-in-system-account-scexe_topic16714.html

Этот пост был лучшим, что я мог сделать. В основном, установите сервис, запустите его, затем удалите его. Согласно ОП, это его объяснение.

Итак, как это работает?

  1. Символ & указывает cmd.exe на синтаксический анализ обработки текста, который следует, как если бы это была новая строка в пакетном файле (в основном это новый разделитель строк, который позволяет объединять несколько команд в одну строку)

Чтобы разбить его: Создать службу - sc create - binPath= "cmd /c start calc" type= own type= взаимодействовать Запустить службу net start - (Это также можно сделать с помощью: sc start -) Удалить службу sc удалить -

  1. переменные
    • Наименование услуги: --
    • Приложение для запуска: Calc

Переменные:

  1. Как это устроено:

cmd / c - позволяет передавать параметры в cmd (без этой начальной части это будет работать, если вы копируете и вставляете в cmd.exe, но не в диалоге запуска. Так что это исправляет) sc create binPath= - Так как cmd.exe не отвечает на служебные команды, когда SCM запускает приложение в binPath (Reg = ImagePath), затем оно завершает его, если не отвечает своевременно, поэтому cmd.exe не может быть использован. Он должен вызывать что-то еще, в данном случае это calc.exe sc create type= Это потребовалось некоторое время, чтобы выяснить. Первоначальной проблемой является Window Station, в которой запущен cmd.exe (который, в свою очередь, наследуется calc.exe (его дочерним процессом)). К счастью, после прочтения Windows Internals e4 Марка я смог решить ее, указав службу как Интерактивную. (Экспериментально, на самом деле это должны быть ОБА интерактивные (256) и собственные (16) (256|16 = 272) . В основном это позволяет Windows запускаться в \WinSta0\Default (Рабочий стол текущего пользователя, позволяющий окно чтобы быть отображенным.) После некоторого разочарования в связи с тем, что sc не принимает type = own | взаимодействовать, я обнаружил, что он позволяет нам снова указать его, и вместо перезаписи Type (dword) он побитовый ИЛИ (добавляет) Решенные проблемы! Net start - запуск службы (возможно, вызывает StartService) cmd.exe запускается с командной строкой (CL) команды start [File], в которой start, вероятно, вызывает ShellExecute (стыдно, что MS не позволил запуску указать команды SW_* (например, скрыть). Несмотря на то, что он позволяет нам мин / макс окна. cmd.exe открывает приложение / файл, SCM завершает работу cmd.exe для того, чтобы своевременно не отвечать на его команды, и окно теперь показывается пользователю. sc delete - наконец мы очищаем наш путь, удаляя сервис

Для меня это сработало.

cmd /c sc create -- binPath= "cmd /c start app.exe" type= own type= interact & net start -- & sc delete --

Теперь у меня были проблемы с получением абсолютных путей для работы. Мне пришлось поместить.EXE в System32 и SysWOW64, поэтому мне не пришлось использовать абсолютный путь. По словам сайта, это должно позволить абсолютные пути для работы.

cmd /c sc create -- binPath= "cmd /c start  \"\"  \"C:\windows\regedit.exe\" " type= own type= interact & net start -- & sc delete --

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

Другие вопросы по тегам