У меня есть простой скрипт для создания запланированной задачи следующим образом:
$action = New-ScheduledTaskAction -Execute "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -Argument '-file "File.ps1"'
$trigger = New-ScheduledTaskTrigger -AtStartup
Register-ScheduledTask -Action $action -Trigger $trigger -TaskPath "Tasks" -TaskName "Name" -Description "Description" -User Admin -Password $password -RunLevel Highest
как я могу запросить UAC и захватить пароль, который пользователь вводит в приглашении UAC, в качестве переменной $password для использования в сценарии?
Я пытаюсь точно запустить скрипт, о котором я упоминал выше, как еще мне это сделать? Мне как-то нужен пароль пользователя, и я не хочу запрашивать его в консоли PowerShell. т. е. мне нужно передать переменную $Password
в приведенный выше сценарий, не прося пользователя ввести ее в консоли PowerShell или добавив ее вручную в команду.
Похоже, вы попали в проблемную яму XY . Отредактируйте вопрос и объясните основную проблему, с которой вы работаете. Теперь все, что мы видим, — это попытка решения, которая пытается обойти UAC, и это дурацкая затея.
Ну это буквально так, лол. Я не знаю, сколько раз мне придется писать одно и то же. Опять же, я хочу запустить приведенный выше сценарий, который в какой-то момент требует ввода пароля, и я хочу дать ему пароль, который ему нужен, не добавляя его вручную и не прося пользователя ввести его в консоли PowerShell. Я хочу запустить скрипт на нескольких компьютерах, и каждый из них имеет разные имя пользователя и пароль. так какие у меня варианты? Я думал об использовании UAC, потому что это хорошо зарекомендовавший себя способ аутентификации, но если вы знаете какие-либо другие средства, сообщите, пожалуйста.
Используйте Get-Credential, чтобы запросить учетные данные для использования с UAC. Вы можете извлечь простой текстовый пароль из объекта [pscredential]
, который он возвращает.
@ mklement0 извините, но какой UAC?
Я оговорился: я должен был сказать: учетные данные, которые вы обычно используете с UAC, которые, по определению, являются учетными данными, способными работать с повышением прав, что требуется вашей запланированной задаче.
@ mklement0 Понятно, спасибо, я могу это сделать, но мне нужен способ проверить, что пароль, который пользователь вводит в консоли PowerShell, действительно является правильным паролем, принадлежащим учетной записи Windows. возможно ли такое сравнение? может хеши сравнить? Я думаю, что Windows хранит пароль в виде хэшей, может быть, в диспетчере учетных данных? Я бы не хотел создавать задачи с неправильными паролями, которые никогда не запустятся. если это слишком далеко от первоначального вопроса, пожалуйста, дайте мне знать, чтобы я мог удалить это и создать новый.
Используйте Get-Credential , чтобы запросить учетные данные целевого пользователя, который возвращает экземпляр [pscredential].
.GetNetworkCredential().Password
, чтобы получить простое текстовое представление пароля, хранящегося в этом [pscredential]
объекте.Проверка того, что учетные данные (а) действительны в принципе (т. е. комбинация имени пользователя и пароля верна) и (б) могут работать с повышением прав, требует дополнительной работы.
(a) может быть достигнуто с помощью Test-WinCredential
вспомогательной функции из этого Gist с лицензией MIT
Предполагая, что вы просмотрели связанный исходный код, чтобы убедиться, что он безопасен, вы можете напрямую загрузить и определить его в текущем сеансе следующим образом (инструкции о том, как сделать его доступным в будущих сеансах, будут напечатаны):
irm https://gist.github.com/mklement0/83e8e6a2b39ecec7b0a14a8e631769ce/raw/Test-WinCredential.ps1 | iex
(b) может быть достигнуто путем проверки того, относятся ли указанные учетные данные к пользователю в локальной Administrators
группе, с помощью Get-LocalGroupMember. Я думаю, что это подразумевает наличие разрешения на запуск с повышением прав — скажите мне, если я ошибаюсь.
Примечание:
# Prompt for an administrator's credentials and verify that they are valid.
do {
$cred = Get-Credential -Message 'Please specify an administrator''s credentials: '
if (-not $cred) { Write-Warning 'Aborted by user request.'; exit 2 }
if (-not (Test-WinCredential $cred)) {
Write-Warning "The specified username-password combination isn't valid. Please try again."
}
elseif (-not (Get-LocalGroupMember -ErrorAction Ignore Administrators $cred.UserName)) {
Write-Warning "User $($cred.UserName) is not a member of the local Administrators group. Please try again."
} else {
break # OK
}
} while ($true)
# $cred.UserName now contains the username.
# Obtain the password as plain text.
# Note: This should generally be avoided.
$plainTextPassword = $cred.GetNetworkCredential().Password
Вы не знаете. Вся идея UAC заключается в том, чтобы предотвратить захват прав администратора сторонними приложениями и кражу учетных данных. Вы действительно пытаетесь запустить скрипт от имени администратора?