Как запросить UAC в PowerShell 7 и сохранить введенный пароль как переменную?

У меня есть простой скрипт для создания запланированной задачи следующим образом:

$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 для использования в сценарии?

Вы не знаете. Вся идея UAC заключается в том, чтобы предотвратить захват прав администратора сторонними приложениями и кражу учетных данных. Вы действительно пытаетесь запустить скрипт от имени администратора?

vonPryz 20.12.2022 20:14

Я пытаюсь точно запустить скрипт, о котором я упоминал выше, как еще мне это сделать? Мне как-то нужен пароль пользователя, и я не хочу запрашивать его в консоли PowerShell. т. е. мне нужно передать переменную $Password в приведенный выше сценарий, не прося пользователя ввести ее в консоли PowerShell или добавив ее вручную в команду.

Jameschad 20.12.2022 20:58

Похоже, вы попали в проблемную яму XY . Отредактируйте вопрос и объясните основную проблему, с которой вы работаете. Теперь все, что мы видим, — это попытка решения, которая пытается обойти UAC, и это дурацкая затея.

vonPryz 20.12.2022 21:16

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

Jameschad 20.12.2022 21:48

Используйте Get-Credential, чтобы запросить учетные данные для использования с UAC. Вы можете извлечь простой текстовый пароль из объекта [pscredential], который он возвращает.

mklement0 20.12.2022 21:49

@ mklement0 извините, но какой UAC?

Jameschad 20.12.2022 22:04

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

mklement0 20.12.2022 22:06

@ mklement0 Понятно, спасибо, я могу это сделать, но мне нужен способ проверить, что пароль, который пользователь вводит в консоли PowerShell, действительно является правильным паролем, принадлежащим учетной записи Windows. возможно ли такое сравнение? может хеши сравнить? Я думаю, что Windows хранит пароль в виде хэшей, может быть, в диспетчере учетных данных? Я бы не хотел создавать задачи с неправильными паролями, которые никогда не запустятся. если это слишком далеко от первоначального вопроса, пожалуйста, дайте мне знать, чтобы я мог удалить это и создать новый.

Jameschad 20.12.2022 22:08
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  • Используйте Get-Credential , чтобы запросить учетные данные целевого пользователя, который возвращает экземпляр [pscredential].

    • Затем вы можете вызвать .GetNetworkCredential().Password, чтобы получить простое текстовое представление пароля, хранящегося в этом [pscredential] объекте.
    • Чтобы было ясно, из соображений безопасности этого обычно следует избегать; однако Register-ScheduledTask требует ввода пароля в виде обычного текста.
  • Проверка того, что учетные данные (а) действительны в принципе (т. е. комбинация имени пользователя и пароля верна) и (б) могут работать с повышением прав, требует дополнительной работы.

    • (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

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