PowerShell-referenties gebruiken zonder dat om een wachtwoord wordt gevraagd

Ik'wil graag een computer op afstand herstarten die tot een domein behoort. Ik heb een administrator account maar ik'weet niet hoe ik die vanuit powershell moet gebruiken.

Ik weet dat er een Restart-Computer cmdlet is en dat ik credential kan doorgeven maar als mijn domein bijvoorbeeld mydomain is, mijn gebruikersnaam myuser is en mijn wachtwoord mypassword is wat'is dan de juiste syntax om het te gebruiken?

Ik moet de reboot plannen zodat ik het wachtwoord niet hoef te typen.

Oplossing

Het probleem met Get-Credential is dat het altijd om een wachtwoord zal vragen. Er is echter een manier om dit te omzeilen, maar dan moet het wachtwoord als een beveiligde string op het bestandssysteem worden opgeslagen.

Het volgende artikel legt uit hoe dit werkt:

Samengevat, je maakt een bestand aan om je wachtwoord in op te slaan (als een versleutelde string). De volgende regel vraagt om een wachtwoord en slaat het op in c:\mysecurestring.txt als een versleutelde string. U hoeft dit maar één keer te doen:

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

Overal waar je een Credential argument ziet in een PowerShell commando, betekent dit dat je een PSCredential kunt doorgeven. Dus in jouw geval:

$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

Het kan zijn dat je een andere -Authentication switch waarde nodig hebt omdat ik je omgeving niet ken.

Commentaren (6)

Er is een andere manier, maar...

DOE DIT NIET ALS U UW WACHTWOORD NIET IN HET SCRIPTBESTAND WILT (Het is geen goed idee om wachtwoorden in scripts op te slaan, maar sommigen van ons willen gewoon weten hoe).

Ok, dat was de waarschuwing, hier's de code:

$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 zal de credentials van John Doe hebben met het wachtwoord "ABCDEF".

Alternatieve manier om het wachtwoord klaar te krijgen voor gebruik:

$password = convertto-securestring -String "notverysecretpassword" -AsPlainText -Force
Commentaren (5)

Wat betreft het opslaan van credentials, gebruik ik twee functies (die normaal in een module zitten die geladen wordt vanuit mijn profiel):

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

En deze:

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

Je gebruikt het als volgt:

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

Als het credential-bestand niet bestaat, zal je de eerste keer gevraagd worden, op dat moment zal het de credentials opslaan in een versleutelde string in een XML-bestand. De tweede keer dat je die regel uitvoert, is het xml-bestand er en zal het automatisch worden geopend.

Commentaren (0)