Использование учетных данных PowerShell без запроса пароля
Я хотел бы перезагрузить удаленный компьютер, который принадлежит домену. У меня есть учетная запись администратора, но я не знаю, как использовать ее из powershell.
Я знаю, что есть и что я могу передать учетные данные, но если мой домен например mydomain
, мой ник myuser
и пароль mypassword
каков правильный синтаксис для его использования?
мне нужно запланировать перезагрузку, поэтому мне не нужно вводить пароль.
8 ответов:
проблема с
Get-Credential
это то, что он всегда будет запрашивать пароль. Однако есть способ обойти это, но он включает в себя хранение пароля в виде безопасной строки в файловой системе.в следующей статье объясняется, как это работает:
таким образом, вы создаете файл для хранения пароля (в виде зашифрованной строки). Следующая строка будет запрашивать пароль, то храните его в
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
переключатель значения, потому что я не знаю вашего окружения.
есть и другой способ, но...
НЕ ДЕЛАЙТЕ ЭТОГО, ЕСЛИ ВЫ НЕ ХОТИТЕ, ЧТОБЫ ВАШ ПАРОЛЬ БЫЛ В ФАЙЛЕ СКРИПТА (Это не очень хорошая идея, чтобы хранить пароли в скриптах, но некоторые из нас просто хотели бы знать, как.)
ок, это было предупреждение, вот код:
$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
будет иметь учетные данные от John Doe с паролем "ABCDEF".альтернативные средства, чтобы получить пароль готов к использованию:
$password = convertto-securestring -String "notverysecretpassword" -AsPlainText -Force
Что касается хранения учетных данных, я использую две функции (которые обычно находятся в модуле, загруженном из моего профиля):
#===================================================================== # 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 находится там и будет открыт автоматически.
Я должен запускать функции 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)
вот два способа сделать это, если вы планируете перезагрузку.
сначала вы можете создать задачу на одной машине, используя учетные данные, которые имеют права, необходимые для подключения и перезагрузки другой машины. Это делает планировщик ответственным за безопасное хранение учетных данных. Команда перезагрузки (я парень 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
Это также работает через графический интерфейс, просто введите систему в качестве имени пользователя, оставив поля пароля пустыми.
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
будьте очень осторожны с хранением паролей подобным образом... это не так безопасно, как ...
Я видел один пример, который использует 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 шифрует объекты учетных данных с помощью Стандартный API защиты данных Windows. Это гарантирует, что только пользователь учетная запись может правильно расшифруйте его содержимое. Аналогично, командлет ConvertFrom-SecureString также шифрует пароль, который вы предоставляете.
Edit: просто перечитайте исходный вопрос. Выше будет работать до тех пор, как вы инициализировали
[pscredential]
на жесткий диск. То есть, если вы отбросите это в своем скрипте и запустите скрипт, как только он создаст этот файл, а затем запустите скрипт без присмотра, будет просто.