Использование учетных данных PowerShell без запроса пароля

148

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

Я знаю, что есть Restart-Computerкомандлет и что я могу передать учетные данные, но если мой домен, например mydomain, мое имя пользователя myuserи мой пароль, mypasswordкакой правильный синтаксис для его использования?

Мне нужно запланировать перезагрузку, чтобы не вводить пароль.

Все смотрят на меня
источник
Вы должны прочитать эту ссылку
джемы
Что означает get-credential domain01 \ admin01? Следующая команда: перезагрузить компьютер -компьютерное имя $ s -force -throttlelimit 10 -credential $ c. Означает ли это, что get-credential извлекает пароль, не спрашивая его?
все смотрят на меня

Ответы:

203

Проблема в Get-Credentialтом, что он всегда запрашивает пароль. Однако есть способ обойти это, но он включает в себя сохранение пароля в качестве безопасной строки в файловой системе.

Следующая статья объясняет, как это работает:

Использование PSCredentials без приглашения

Таким образом, вы создаете файл для хранения вашего пароля (в виде зашифрованной строки). Следующая строка запросит пароль и сохранит его в c:\mysecurestring.txtвиде зашифрованной строки. Вам нужно сделать это только один раз:

read-host -assecurestring | convertfrom-securestring | out-file C:\mysecurestring.txt

Везде, где вы видите -Credentialаргумент команды PowerShell, это означает, что вы можете передать PSCredential. Итак, в вашем случае:

$username = "domain01\admin01"
$password = Get-Content 'C:\mysecurestring.txt' | ConvertTo-SecureString
$cred = new-object -typename System.Management.Automation.PSCredential `
         -argumentlist $username, $password

$serverNameOrIp = "192.168.1.1"
Restart-Computer -ComputerName $serverNameOrIp `
                 -Authentication default `
                 -Credential $cred
                 <any other parameters relevant to you>

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

Кев
источник
24
Вы также можете сделать ConvertTo-SecureString "password" -AsPlainText -Force.
x0
15
Просто чтобы прояснить,$password = ConvertTo-SecureString "password" -AsPlainText -Force
Акира Ямамото
-Credential [имя пользователя] было необходимо в параметрах Read-Host для меня, в противном случае PowerShell просто зависает. После передачи -Credential для read-host вам будет предложено непосредственно в консоли powershell и пароль будет сохранен правильно. Спасибо!
сфирот
Я пытаюсь выяснить, как заставить это работать, когда я использую функцию Send-MailMessage в powershell. Я хочу сохранить учетные данные своего пользователя электронной почты и передать, чтобы мне не нужно было вводить их повторно. Есть идеи, как это сделать?
KangarooRIOT
@ user3681591 - Я бы рекомендовал задавать новый вопрос, а не делать это в комментариях. Спасибо.
Кев
71

Есть другой способ, но ...

НЕ ДЕЛАЙТЕ ЭТОГО, ЕСЛИ ВЫ НЕ ХОТИТЕ СВОЙ ПАРОЛЬ В ФАЙЛЕ СКРИПТА (не очень хорошая идея хранить пароли в скриптах, но некоторые из нас просто любят знать, как это сделать.)

Хорошо, это было предупреждение, вот код:

$username = "John Doe"
$password = "ABCDEF"
$secstr = New-Object -TypeName System.Security.SecureString
$password.ToCharArray() | ForEach-Object {$secstr.AppendChar($_)}
$cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $secstr

$cred будет иметь учетные данные от Джона Доу с паролем "ABCDEF".

Альтернативные способы получения пароля, готового к использованию:

$password = convertto-securestring -String "notverysecretpassword" -AsPlainText -Force
Йерун Ландхир
источник
Спасибо. Это очень полезно. В моем случае я создавал пользовательский командлет powershell, который принимает имя пользователя и пароль (как secureString). Внутренне командлет вызывает несколько других командлетов, некоторые из них требуют только пользователя и пароля, но одному из них нужны учетные данные, поэтому на самом деле мне не нужно жестко кодировать пароль в моем сценарии.
BenR
20
Несколько проще: $ password = convertto-securestring -String "notverysecretpassword" -AsPlainText -Force
Сэм
Я пытаюсь выяснить, как заставить это работать, когда я использую функцию Send-MailMessage в powershell. Я хочу сохранить учетные данные своего пользователя электронной почты и передать, чтобы мне не нужно было вводить их повторно. Есть идеи, как это сделать?
KangarooRIOT
@ user3681591 Это будет Send-MailMessage -Credential $ cred (с $ cred, созданным, как показано в этом сообщении)
Jeroen Landheer
@JeroenLandheer Я попробовал ваш ответ (спасибо за помощь!), Однако он не сработал. Моя ошибка: -Credential: термин «-Credential» не распознается как имя командлета, функции, файла сценария или работоспособной программы.
KangarooRIOT
29

Что касается хранения учетных данных, я использую две функции (которые обычно находятся в модуле, который загружается из моего профиля):

#=====================================================================
# Get-MyCredential
#=====================================================================
function Get-MyCredential
{
param(
$CredPath,
[switch]$Help
)
$HelpText = @"

    Get-MyCredential
    Usage:
    Get-MyCredential -CredPath `$CredPath

    If a credential is stored in $CredPath, it will be used.
    If no credential is found, Export-Credential will start and offer to
    Store a credential at the location specified.

"@
    if($Help -or (!($CredPath))){write-host $Helptext; Break}
    if (!(Test-Path -Path $CredPath -PathType Leaf)) {
        Export-Credential (Get-Credential) $CredPath
    }
    $cred = Import-Clixml $CredPath
    $cred.Password = $cred.Password | ConvertTo-SecureString
    $Credential = New-Object System.Management.Automation.PsCredential($cred.UserName, $cred.Password)
    Return $Credential
}

И этот:

#=====================================================================
# Export-Credential
# Usage: Export-Credential $CredentialObject $FileToSaveTo
#=====================================================================
function Export-Credential($cred, $path) {
      $cred = $cred | Select-Object *
      $cred.password = $cred.Password | ConvertFrom-SecureString
      $cred | Export-Clixml $path
}

Вы используете это так:

$Credentials = Get-MyCredential (join-path ($PsScriptRoot) Syncred.xml)

Если файл учетных данных не существует, вам будет предложено в первый раз, в этот момент он будет хранить учетные данные в зашифрованной строке внутри XML-файла. Во второй раз, когда вы запустите эту строку, xmlfile будет там и будет открыт автоматически.

Winfred
источник
10

Я должен запустить функции SCOM 2012 с удаленного сервера, который требует другой учетные данные. Я избегаю паролей в виде открытого текста, передавая выходные данные функции расшифровки пароля как входные данные для ConvertTo-SecureString. Для ясности это не показано здесь.

Мне нравится сильно печатать мои декларации. Объявление типа для $ strPass работает правильно.

[object] $objCred = $null
[string] $strUser = 'domain\userID'
[System.Security.SecureString] $strPass = '' 

$strPass = ConvertTo-SecureString -String "password" -AsPlainText -Force
$objCred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList ($strUser, $strPass)
Брюс Гэвин
источник
4

Вот два способа сделать это, если вы планируете перезагрузку.

Сначала вы можете создать задачу на одном компьютере, используя учетные данные, обладающие правами, необходимыми для подключения и перезагрузки другого компьютера. Это делает планировщик ответственным за безопасное хранение учетных данных. Команда перезагрузки (я парень из Powershell, но это чище):

SHUTDOWN /r /f /m \\ComputerName

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

SCHTASKS /Create /TN "Reboot Server" /TR "shutdown.exe /r /f /m \\ComputerName" /SC ONCE /ST 00:00 /SD "12/24/2012" /RU "domain\username" /RP "password"

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

SCHTASKS /Create /TN "Reboot Server" /TR "shutdown.exe /r /f" /SC ONCE /ST 00:00 /SD "12/24/2012" /RU SYSTEM /S ComputerName

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

Натан Хартли
источник
1
read-host -assecurestring | convertfrom-securestring | out-file C:\securestring.txt
$pass = cat C:\securestring.txt | convertto-securestring
$mycred = new-object -typename System.Management.Automation.PSCredential -argumentlist "test",$pass
$mycred.GetNetworkCredential().Password

Будьте очень осторожны с хранением паролей таким образом ... это не так безопасно, как ...

MockMyBeret
источник
1

Я видел один пример, который использует Import / Export-CLIXML.

Это мои любимые команды для решения проблемы, которую вы пытаетесь решить. И самый простой способ их использования.

$passwordPath = './password.txt'
if (-not (test-path $passwordPath)) {
    $cred = Get-Credential -Username domain\username -message 'Please login.'
    Export-Cli -InputObject $cred -Path $passwordPath
}
$cred = Import-CliXML -path $passwordPath

Поэтому, если файл не существует локально, он запросит учетные данные и сохранит их. Это займет[pscredential] объект без проблем и скроет учетные данные как безопасную строку.

Наконец, просто используйте учетные данные, как обычно.

Restart-Computer -ComputerName ... -Credentail $cred

Примечание по Securty :

Надежно хранить учетные данные на диске

Читая Решение, вы можете сначала с осторожностью хранить пароль на диске. Хотя вполне естественно (и разумно) с осторожностью относиться к засорению жесткого диска конфиденциальной информацией, командлет Export-CliXml шифрует объекты учетных данных с помощью стандартного API защиты данных Windows. Это гарантирует, что только ваша учетная запись может правильно расшифровать его содержимое. Аналогично, командлет ConvertFrom-SecureString также шифрует предоставленный вами пароль.

Изменить: Просто перечитайте оригинальный вопрос. Вышеописанное будет работать до тех пор, пока вы инициализируете [pscredential]жесткий диск. То есть, если вы уроните это в свой сценарий и запустите сценарий, как только он создаст этот файл, а затем запустить сценарий без присмотра будет просто.

ScriptingDad
источник
1

Решение

$userName = 'test-domain\test-login'
$password = 'test-password'

$pwdSecureString = ConvertTo-SecureString -Force -AsPlainText $password
$credential = New-Object -TypeName System.Management.Automation.PSCredential `
    -ArgumentList $userName, $pwdSecureString

Для машин сборки
В предыдущем коде замените значения имени пользователя и пароля секретными («скрытыми от журналов») переменными среды вашей машины сборки.

Результаты теста по

'# Results'
$credential.GetNetworkCredential().Domain
$credential.GetNetworkCredential().UserName
$credential.GetNetworkCredential().Password

и вы увидите

# Results
test-domain
test-login
test-password
it3xl
источник
-3

почему бы тебе не попробовать что-то очень простое?

используйте psexec с командой 'shutdown / r / f / t 0' и списком ПК из CMD.

Корневая петля
источник
Это особый случай. Дело не в том, чтобы открывать окно входа в систему в любом случайном сценарии.
Сверхразум