Использование учетных данных PowerShell без запроса пароля - PullRequest
134 голосов
/ 05 июня 2011

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

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

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

Ответы [ 9 ]

192 голосов
/ 05 июня 2011

Проблема с 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, потому что я не знаю вашу среду.

68 голосов
/ 07 февраля 2012

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

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

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

$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
29 голосов
/ 05 июня 2011

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

#=====================================================================
# 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 будет там и будет открыт автоматически.

9 голосов
/ 08 ноября 2013

Мне нужно запустить функции 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 голосов
/ 09 июля 2012

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

Сначала вы можете создать задачу на одном компьютере, используя учетные данные, которые имеют права, необходимые для подключения и перезагрузки другого компьютера.Это делает планировщик ответственным за безопасное хранение учетных данных.Команда перезагрузки (я парень из 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 голос
/ 21 мая 2013
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

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

0 голосов
/ 26 июня 2019

Решение

$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

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

Результаты теста , добавив

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

и вы увидите

# Results
test-domain
test-login
test-password
0 голосов
/ 03 сентября 2018

Я видел один пример, который использует 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

Записка о безопасности :

Безопасное хранение учетных данных на диске

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

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

0 голосов
/ 29 января 2015

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

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

...