Вопрос или проблема
Мне нужно запустить скрипт, который требует прав администратора (потому что он записывает некоторые значения в HKLM и удаляет файлы в системных папках), но также требует взаимодействия с HKCU.
Скрипт должен выполняться от имени обычного пользователя; у меня также есть учетная запись администратора на машине.
Если я запущу командную строку с повышенными привилегиями, Windows попросит меня предоставить учетные данные администратора для выполнения операции.
Но если я использую учетные данные администратора для предоставления повышенного доступа к командной строке, командная строка открывается в окружении администратора, и я не имею доступа к реестру и папке профиля обычного пользователя.
Существует ли способ запустить командную строку с повышенными привилегиями от имени обычного пользователя, предоставляя учетные данные администратора, но сохраняя окружение обычного пользователя?
Спасибо
Насколько мне известно, нет. Повышение прав через UAC никогда не предоставляет привилегий – оно лишь позволяет учетной записи восстановить свои “полные” привилегии, которые она имела бы без UAC. Таким образом, если пользователь не является администратором, то он не администратор, и для этого процесса становится необходимым переключение на другого пользователя.
Вашим самым простым вариантом может быть разделение скрипта на две части и выполнение не повышенной части изменениями HKCU – или, если это абсолютно необходимо, передача вашего SID повышенной части, чтобы она могла получить доступ к вашему HKCU через HKEY_USERS\$sid\
вместо этого. (В зависимости от языка, на котором написан скрипт с повышенными привилегиями, он может использовать API терминальных служб для определения имени пользователя и SID вошедшего в систему пользователя.)
Ответ или решение
Запуск командной строки с повышенными привилегиями из-под обычного пользователя в Windows
Вопрос о запуске сценария с повышенными привилегиями, сохраняя при этом окружение обычного пользователя, является распространённой задачей для системных администраторов и технических специалистов. Рассмотрим, как можно решить данную проблему без необходимости переключения на административный аккаунт, сохраняя доступ к реестру (HKCU) и другим ресурсам, специфичным для текущего пользователя.
Проблема
Ваша задача состоит в том, чтобы запустить сценарий, который требует административных прав для внесения изменений в раздел реестра HKEY_LOCAL_MACHINE
(HKLM) и удаления файлов в системных папках, при этом сценарий также должен взаимодействовать с HKEY_CURRENT_USER
(HKCU). Однако, если вы запускаете командную строку с повышенными привилегиями, используя учетные данные администратора, она открывается в контексте администратора, и у вас отсутствует доступ к ресурсам конкретного обычного пользователя.
Решение
Хотя Windows не поддерживает прямой запуск командной строки с повышенными правами из-под обычного пользователя, существуют несколько стратегий, которые можно использовать для решения данной задачи:
-
Разделите сценарий на две части:
- Создайте два отдельных скрипта: один для операций, требующих административных прав (взаимодействие с HKLM), и второй — для операций, связанных с HKCU.
- Запускайте скрипт, работающий с HKCU, от имени обычного пользователя. Например:
@echo off rem Это скрипт для HKCU reg add "HKCU\Software\YourApp" /v "YourValue" /t REG_SZ /d "SomeData" /f del "C:\Path\To\YourFile" /Q
-
Использовать метод доступа по SID:
- Вы можете передать идентификатор безопасности (SID) текущего пользователя в повышенный процесс и получить доступ к реестру пользователя из другого контекста. Сделать это можно с помощью команд, подобных:
$sid = (Get-LocalUser -Name "UserName").SID reg add "HKEY_USERS\$sid\Software\YourApp" /v "YourValue" ...
- Переменная
$sid
представляет собой SID для конкретного пользователя, а командаreg add
позволяет вносить необходимые изменения.
- Вы можете передать идентификатор безопасности (SID) текущего пользователя в повышенный процесс и получить доступ к реестру пользователя из другого контекста. Сделать это можно с помощью команд, подобных:
-
Используйте PowerShell:
- Если у вас есть доступ к PowerShell, вы можете перенастроить его для выполнения сценариев под различными учетными записями, сохраняя доступ к окружению текущего пользователя. С помощью PowerShell возможно использовать
Invoke-Command
для выполнения команд с повышенными правами, но в контексте текущего пользователя.
- Если у вас есть доступ к PowerShell, вы можете перенастроить его для выполнения сценариев под различными учетными записями, сохраняя доступ к окружению текущего пользователя. С помощью PowerShell возможно использовать
-
Пользовательский интерфейс:
- Если ваши пользователи имеют разрешение на выполнение скриптов, вы можете создать небольшой GUI-приложение (например, на PowerShell или C#), где пользователь будет вызывать необходимые функции с административными правами.
Заключение
Хотя Windows не разрешает запускать Elevated Command Prompt в контексте обычного пользователя, применяя описанные выше методы, вы сможете обойти это ограничение и успешно выполнять необходимые операции. Разделение сценарием на части или использование SID может существенно упростить задачу и повысить безопасность работы с системными ресурсами.
Если у вас есть дополнительные вопросы или вам необходимо более детальное руководство, пожалуйста, не стесняйтесь задавать их.