11 Stimmen

Validieren von PowerShell PSCredential

Nehmen wir an, ich habe eine PSCrendential Objekt in PowerShell, das ich mit Get-Credential .

Wie kann ich die Eingabe anhand von Active Directory validieren?

Inzwischen habe ich diesen Weg gefunden, aber ich finde ihn ein bisschen hässlich:

[void][System.Reflection.Assembly]::LoadWithPartialName("System.DirectoryServices.AccountManagement")

function Validate-Credentials([System.Management.Automation.PSCredential]$credentials)
{
    $pctx = New-Object System.DirectoryServices.AccountManagement.PrincipalContext([System.DirectoryServices.AccountManagement.ContextType]::Domain, "domain")
    $nc = $credentials.GetNetworkCredential()
    return $pctx.ValidateCredentials($nc.UserName, $nc.Password)
}

$credentials = Get-Credential

Validate-Credentials $credentials

[Bearbeiten, zwei Jahre später] Für zukünftige Leser sei darauf hingewiesen, dass Test-Credential o Test-PSCredential sind bessere Namen, denn Validate ist kein gültiges Powershell-Verb (siehe Get-Verb )

10voto

CB. Punkte 56367

Ich glaube, mit System.DirectoryServices.AccountManagement ist der weniger hässliche Weg:

Hier wird ADSI verwendet (noch hässlicher?):

$cred = Get-Credential #Read credentials
$username = $cred.username
$password = $cred.GetNetworkCredential().password

# Get current domain using logged-on user's credentials
$CurrentDomain = "LDAP://" + ([ADSI]"").distinguishedName
$domain = New-Object System.DirectoryServices.DirectoryEntry($CurrentDomain,$UserName,$Password)

if ($domain.name -eq $null)
{
 write-host "Authentication failed - please verify your username and password."
 exit #terminate the script.
}
else
{
 write-host "Successfully authenticated with domain $domain.name"
}

2voto

xenon8 Punkte 41

Ich hatte ein ähnliches Problem mit einem Installateur und musste die Angaben zum Dienstkonto überprüfen. Ich wollte die Verwendung des AD-Moduls in Powershell vermeiden, da ich mir nicht sicher war, dass es auf dem Rechner, auf dem das Skript ausgeführt wird, installiert ist.

Ich habe den Test mit dem untenstehenden Bild gemacht, es ist etwas schmutzig, aber es funktioniert.

try{
    start-process -Credential $c -FilePath ping -WindowStyle Hidden
} catch {
    write-error $_.Exception.Message
    break
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X