Korzystanie z poświadczeń PowerShell bez monitu o hasło

Chciałbym ponownie uruchomić zdalny komputer, który należy do domeny. Mam konto administratora, ale nie wiem, jak z niego korzystać z powershell.

Wiem, że istnieje Restart-Computer cmdlet i że mogę przekazać poświadczenie, ale jeśli moja domena to na przykład mydomain , moja nazwa użytkownika to myuser, a moje hasło to mypassword Jaka jest właściwa składnia, aby go używać?

Muszę zaplanować restart, więc nie muszę wpisywać hasła.

Author: Kev, 2011-06-05

8 answers

Problem z Get-Credential polega na tym, że zawsze wyświetli monit o hasło. Istnieje jednak sposób obejścia tego, ale wymaga to przechowywania hasła jako bezpiecznego ciągu na systemie plików.

Następujący artykuł wyjaśnia, jak to działa:

Korzystanie z PSCredentials bez zachęty

W podsumowaniu tworzysz plik do przechowywania hasła (jako zaszyfrowany ciąg znaków). Poniższy wiersz wyświetli monit o podanie hasła, a następnie zapisze je w c:\mysecurestring.txt jako zaszyfrowane sznurek. Musisz to zrobić tylko raz:

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

Gdziekolwiek widzisz argument -Credential w poleceniu PowerShell, oznacza to, że możesz przekazać PSCredential. Więc w Twoim przypadku:

$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>

Możesz potrzebować innej wartości -Authentication, ponieważ nie znam twojego środowiska.

 180
Author: Kev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-25 11:54:59

Jest inny sposób, ale...

NIE RÓB TEGO, JEŚLI NIE CHCESZ SWOJEGO HASŁA W PLIKU SKRYPTU (Przechowywanie haseł w skryptach nie jest dobrym pomysłem, ale niektórzy z nas po prostu lubią wiedzieć, jak.)

Ok, to było ostrzeżenie, oto kod:

$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 będzie miał dane uwierzytelniające od Johna Doe z hasłem "ABCDEF".

Alternatywne sposoby przygotowania hasła do użycia:

$password = convertto-securestring -String "notverysecretpassword" -AsPlainText -Force
 64
Author: Jeroen Landheer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-11 20:21:11

Jeśli chodzi o przechowywanie poświadczeń, używam dwóch funkcji (które zwykle znajdują się w module ładowanym z mojego profilu):

#=====================================================================
# 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
}

I ten:

#=====================================================================
# 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
}

Używasz go w ten sposób:

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

Jeśli plik poświadczeń nie istnieje, zostanie wyświetlony monit za pierwszym razem, w tym momencie poświadczenia będą przechowywane w zaszyfrowanym łańcuchu wewnątrz pliku XML. Przy drugim uruchomieniu tej linii, plik XML jest tam i zostanie otwarty automatycznie.

 26
Author: Winfred,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-05 04:47:41

Muszę uruchomić funkcje SCOM 2012 ze zdalnego serwera, który wymaga innego poświadczenia. Unikam haseł z czystym tekstem, przekazując wyjście funkcji deszyfrowania hasła jako wejście do ConvertTo-SecureString. Dla jasności, nie jest to pokazane tutaj.

Lubię mocno wpisywać swoje deklaracje. Deklaracja typu dla $strPass działa poprawnie.
[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)
 8
Author: Bruce Gavin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-08 01:39:27

Oto dwa sposoby, aby to zrobić, jeśli planujesz ponowne uruchomienie.

Najpierw możesz utworzyć zadanie na jednym komputerze, używając poświadczeń, które mają prawa potrzebne do połączenia i ponownego uruchomienia innego komputera. To sprawia, że scheduler jest odpowiedzialny za bezpieczne przechowywanie poświadczeń. Polecenie reboot (jestem facetem Powershell, ale to jest czystsze.) jest:

SHUTDOWN /r /f /m \\ComputerName

Wiersz poleceń, aby utworzyć zaplanowane zadanie na lokalnej maszynie, aby zdalnie zrestartować inne, be:

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"

Wolę drugi sposób, w którym używasz bieżących poświadczeń, aby utworzyć zaplanowane zadanie, które działa z kontem systemowym na zdalnej maszynie.

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

Działa to również poprzez GUI, wystarczy wpisać SYSTEM jako nazwę użytkownika, pozostawiając pola hasła puste.

 3
Author: Nathan Hartley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-09 17:27:57
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

Bądź bardzo ostrożny z przechowywaniem haseł w ten sposób... to nie jest tak bezpieczne jak ...

 0
Author: MockMyBeret,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-21 18:28:21

Widziałem jeden przykład, który używa importu / eksportu-CLIXML.

To moje ulubione polecenia dla problemu, który próbujesz rozwiązać. A najprostszym sposobem ich użycia jest

$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

Więc jeśli plik nie istnieje lokalnie, poprosi o poświadczenia i je zapisze. To zajmie [pscredential] Obiekt bez problemu i ukryje poświadczenia jako bezpieczny ciąg znaków.

W końcu użyj poświadczenia, jak zwykle.
Restart-Computer -ComputerName ... -Credentail $cred

Uwaga na Securty :

Bezpiecznie przechowuj poświadczenia na dysku

Czytając rozwiązanie, możesz początkowo uważać na przechowywanie hasła na dysku. Podczas gdy jest to naturalne (i rozważne), aby być ostrożnym zaśmiecania dysku twardego z poufnych informacji, cmdlet Export-CliXml szyfruje obiekty uwierzytelniające za pomocą Windows standard Data Protection API. Gwarantuje to, że tylko twoje konto użytkownika może prawidłowo odszyfrować jego zawartość. Podobnie, ConvertFrom-SecureString cmdletzobacz też szyfruje podane hasło.

Edit: przeczytaj ponownie oryginalne pytanie. Powyższe będzie działać tak długo, jak zainicjujesz [pscredential] na dysku twardym. Oznacza to, że jeśli upuścisz to w swoim skrypcie i uruchomisz skrypt po utworzeniu tego pliku, a następnie uruchomienie skryptu bez nadzoru będzie proste.

 0
Author: ScriptingDad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-03 13:29:41

Dlaczego nie spróbujesz czegoś bardzo prostego?

Użyj psexec z poleceniem 'shutdown /r /f / T 0' i listą PC z CMD.

 -3
Author: Root Loop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-29 17:20:39