Запуск приложения как системы (без PSTools)
Есть некоторые ключи реестра, которые принадлежат Системе, и я не могу редактировать их, если я не запущен от имени Системы. Я хочу иметь возможность редактировать эти ключи из моего приложения VB. Любые учебники, которые я нашел, предлагают использовать PSTools, который сейчас устарел At
команда или счтаски. PSTools кажется великолепным, но его лицензия кажется ограничительной (о перераспределении). At и schtasks слишком грязны и требуют задержек планирования.
Это связано с моим предыдущим вопросом. Я хочу взять то, что я обнаружил, и реализовать это через VB.
Изменить политику аудита (групповая политика)
Я также нашел это, но получаю ошибку 1314. Я понял, что несмотря на запуск VS2010 "requireAdministrator" и даже запуск моего EXE-файла в качестве администратора, он по-прежнему говорит, что мое имя пользователя в диспетчере задач (работает от имени меня, а не администратора). Я вошел в систему как администратор и получил ошибку 5 вместо этого. Даже после того, как я установил права, как было предложено в этом посте ( ошибка CreateProcessAsUser 1314), он все равно дал мне ошибку 5.
Я изменил пример на "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
Этот пост был лучшим, что я мог сделать. В основном, установите сервис, запустите его, затем удалите его. Согласно ОП, это его объяснение.
Итак, как это работает?
- Символ & указывает cmd.exe на синтаксический анализ обработки текста, который следует, как если бы это была новая строка в пакетном файле (в основном это новый разделитель строк, который позволяет объединять несколько команд в одну строку)
Чтобы разбить его: Создать службу - sc create - binPath= "cmd /c start calc" type= own type= взаимодействовать Запустить службу net start - (Это также можно сделать с помощью: sc start -) Удалить службу sc удалить -
- переменные
- Наименование услуги: --
- Приложение для запуска: Calc
Переменные:
- Как это устроено:
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 --
Это никогда не работало для меня, так как зависало в течение некоторого времени и никогда не запускало приложение. Это должно почти мгновенно завершиться.