Я хотел бы перезапустить удаленный компьютер, который принадлежит домену. У меня есть учетная запись администратора, но я не знаю, как использовать ее из Powershell.
Я знаю, что есть cmdlet Restart-Computer
и что я могу передать учетные данные, но если мой домен, например, mydomain
, мое имя пользователя myuser
, а мой пароль mypassword
, какой синтаксис правильно использовать его ,?
Мне нужно запланировать перезагрузку, чтобы мне не приходилось вводить пароль.
Проблема с 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
будет иметь учетные данные от Джона Доу с паролем "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 / Создать / TN "Reboot Server" / TR "shutdown.exe / r / f / m \\ ComputerName" / SC ONCE / ST 00:00 / SD "24.12.2012" / RU "домен \ username" /RP "пароль"
Я предпочитаю второй способ, когда вы используете свои текущие учетные данные для создания запланированной задачи, которая выполняется с системной учетной записью на удаленном компьютере.
SCHTASKS / Create / TN "Reboot Server" / TR "shutdown.exe / r / f" / SC ONCE / ST 00:00 / SD "24.12.2012" / RU SYSTEM / S ComputerName
Это также работает через графический интерфейс, просто введите SYSTEM в качестве имени пользователя, оставив поля пароля пустыми.
Решение
$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
Для строительных машин < br / > В предыдущем коде замените значения имени пользователя и пароля секретными («скрытыми из журналов») переменными среды вашего build-machine
Результаты теста по
'# Results'
$credential.GetNetworkCredential().Domain
$credential.GetNetworkCredential().UserName
$credential.GetNetworkCredential().Password
и ты увидишь
# Results
test-domain
test-login
test-password
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
Примечание о Securty :
Безопасное хранение учетных данных на диске
При чтении Решения вы можете сначала опасаться хранить пароль на диске. Хотя естественно (и разумно) быть осторожным, чтобы засорять ваш жесткий диск конфиденциальная информация, смдлет Export-CliXml шифрует учетные объекты, используя Стандартный API защиты данных Windows. Это гарантирует, что только ваша учетная запись пользователя может правильно расшифровать его содержимое. Точно так же cmdlet ConvertFrom-SecureString также шифрует предоставленный вами пароль.
Изменить: Просто перечитайте оригинальный вопрос. Вышеизложенное будет работать до тех пор, пока вы инициализируете `[pscredential]
на жесткий диск. То есть, если вы удалите это в своем скрипте и запустите скрипт, как только он создаст этот файл, и тогда запуск сценария без присмотра будет простым.