Використання облікових даних PowerShell без запрошення пароля


147

Я хотів би перезапустити віддалений комп'ютер, що належить домену. У мене є обліковий запис адміністратора, але я не знаю, як ним користуватись із shellhell.

Я знаю, що є Restart-Computerкомандлет і що я можу передавати облікові дані, але якщо, наприклад, мій домен, це mydomainмоє ім’я користувача, myuserа мій пароль - mypasswordякий правильний синтаксис, щоб ним користуватися?

Мені потрібно запланувати перезавантаження, щоб не потрібно було вводити пароль.


Ви повинні прочитати це посилання
джеми

Що означає домен-отримання облікового запису01 \ admin01? Наступна команда - перезапуск-комп'ютер-ім'я комп’ютера $ s -force -thtletlelimit 10 -довідник $ c. Чи означає це, що get-account надає пароль, не запитуючи його?
всі очі на мене

Відповіді:


202

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


23
Ви також можете зробити ConvertTo-SecureString "password" -AsPlainText -Force.
x0n

14
Просто для того, щоб було зрозуміло,$password = ConvertTo-SecureString "password" -AsPlainText -Force
Акіра Ямамото

-Привітність [ім'я користувача] була потрібна в параметрах Read-Host для мене, інакше повноваження просто висить. Після передачі -Credential до хоста читання вам буде запропоновано безпосередньо в консолі 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

Дякую. Це дуже корисно. У моєму випадку я створював користувальницький командлет powerhell, який приймає ім’я користувача та пароль (як secureString). Внутрішньо командлет викликає кілька інших командлетів, для деяких потрібен лише користувач та пароль, але одному з них потрібен обліковий запис, тому мені фактично не потрібно жорстко кодувати пароль у моєму сценарії.
БенР

20
Трохи простіше: $ пароль = ConvertTo-SecureString -String "notverysecretpassword" -AsPlainText -Force
Sam

Я намагаюся розібратися, як змусити це працювати, коли я використовую функцію Send-MailMessage в powershell. Я хочу зберігати облікові дані мого користувача електронної пошти та передавати їх, тому мені не доведеться постійно вводити його. Будь-яка ідея, як це зробити?
KangarooRIOT

@ user3681591 Це буде Send-MailMessage -Credential $ Credit (із створеним $ кредитом, як показано в цьому дописі)
Jeroen Landheer

@JeroenLandheer Я спробував вашу відповідь (дякую за допомогу!), Але це не вийшло. Моя помилка: -Credential: Термін '-Credential' не розпізнається як ім'я командлету, функції, файлу сценарію чи операційної програми.
КенгуруРІОТ

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. Вдруге запустивши цей рядок, файл xml є там і відкриється автоматично.


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

Будьте дуже обережні зі збереженням паролів таким чином ... це не так безпечно, як ...


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

Примітка про безпеку :

Безпечно зберігайте облікові дані на диску

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

Правка: Просто перечитайте оригінальне запитання. Вищезазначене працюватиме до тих пір, поки ви ініціалізуєте [pscredential]на жорсткому диску. Тобто, якщо ви скинете це у свій сценарій і запустите скрипт одного разу, він створить цей файл, а потім запустити сценарій без нагляду буде просто.


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

-3

чому ти не пробуєш щось дуже просте?

використовувати psexec з командою 'shutdown / r / f / t 0' та списком ПК з CMD.


Це конкретний випадок. Суть не в нерестуванні вікна входу в жодному випадковому сценарії.
Перемогти
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.