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.
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:
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.
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
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.
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)
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.
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 ...
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.
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.
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.
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