it-swarm.com.de

Überprüfen Sie, ob die Benutzerkennworteingabe im Powershell-Skript gültig ist

Ich arbeite mit einem Powershell-Skript, das Systemen in unserer Domäne geplante Aufgaben hinzufügt. Wenn ich dieses Skript ausführe, werde ich nach meinem Passwort gefragt. Ich habe manchmal einen fetten Finger auf das Passwort und der Prozess beginnt, wodurch mein Konto gesperrt wird. Gibt es eine Möglichkeit, meine Anmeldeinformationen zu überprüfen, um sicherzustellen, dass das, was ich eingegeben habe, mit der Domain validiert wird?

Ich möchte einen Weg finden, um den Domänencontroller abzufragen. Ich habe einige Google-Suchen durchgeführt und sollte in der Lage sein, eine WMI-Abfrage durchzuführen und einen Fehler abzufangen. Ich möchte diesen Validierungsstil nach Möglichkeit vermeiden.

Irgendwelche Ideen? Danke im Voraus.

30
Doltknuckle

Ich habe das in meiner Bibliothek:

$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"
}
26
Jim B

Dies ist, was ich in der Vergangenheit verwendet habe; Es soll für lokale Computerkonten und 'Anwendungsverzeichnis' funktionieren, aber bisher habe ich es nur erfolgreich mit AD-Anmeldeinformationen verwendet:

    function Test-Credential {
    <#
    .SYNOPSIS
        Takes a PSCredential object and validates it against the domain (or local machine, or ADAM instance).

    .PARAMETER cred
        A PScredential object with the username/password you wish to test. Typically this is generated using the Get-Credential cmdlet. Accepts pipeline input.

    .PARAMETER context
        An optional parameter specifying what type of credential this is. Possible values are 'Domain','Machine',and 'ApplicationDirectory.' The default is 'Domain.'

    .OUTPUTS
        A boolean, indicating whether the credentials were successfully validated.

    #>
    param(
        [parameter(Mandatory=$true,ValueFromPipeline=$true)]
        [System.Management.Automation.PSCredential]$credential,
        [parameter()][validateset('Domain','Machine','ApplicationDirectory')]
        [string]$context = 'Domain'
    )
    begin {
        Add-Type -assemblyname system.DirectoryServices.accountmanagement
        $DS = New-Object System.DirectoryServices.AccountManagement.PrincipalContext([System.DirectoryServices.AccountManagement.ContextType]::$context) 
    }
    process {
        $DS.ValidateCredentials($credential.UserName, $credential.GetNetworkCredential().password)
    }
}
16
jbsmith

Ich fand diesen Beitrag nützlich, aber er löste mein Problem nicht, da ich versuchte, ihn über ein Skript mit dem angemeldeten lokalen Administratorkonto auszuführen. Es scheint nicht als lokaler Administrator zu funktionieren (nur wenn es als Domänenbenutzer angemeldet ist).

Endlich habe ich es jedoch geschafft, eine funktionierende Lösung zu finden, und da es so viel Ärger gab, dachte ich, ich würde es hier teilen, damit jeder andere mit diesem Problem die Antwort hier hat. Beide Antworten auf einer Seite, je nach Ihren Bedürfnissen.

Beachten Sie, dass Powergui weiter oben im Skript installiert ist (hier nicht enthalten, da dies nur der Abschnitt zum Abrufen von Anmeldeinformationen ist) und eine Voraussetzung für diesen Code ist (sowie für die Zeile "Add-PSSnapin Quest.ActiveRoles.ADManagement"). Ich bin mir nicht sicher, was Powergui macht, das ist anders, aber niemand sonst könnte es mir sagen und es funktioniert.

Ersetzen Sie Ihren eigenen Domainnamen in den Abschnitten "Domainname".

#Get credentials
$credential_ok = 0
while ($credential_ok -ne 1)
{
    $credential = get-credential
    $result = connect-qadservice -service *domain_name* -credential $credential
    [string]$result_string = $result.domain
    if ($result_string -eq "*domain_name*")
    {
        $credential_ok = 1
        #authenticated
    }
    else
    {
        #failed
    }     
}
$username = $credential.username 
$password = $credential.GetNetworkCredential().password 

$date = get-date
Add-Content "c:\lbin\Install_log.txt" "Successfully authenticated XP script as $username $date"
1
Michael

(noch) Eine andere Version:

param([string]$preloadServiceAccountUserName = "")

function HarvestCredentials()
{

        [System.Management.Automation.PSCredential]$credentialsOfCurrentUser = Get-Credential -Message "Please enter your username & password" -UserName $preloadServiceAccountUserName

        if ( $credentialsOfCurrentUser )
        {
            $credentialsOfCurrentUser = $credentialsOfCurrentUser
        }
        else
        {
            throw [System.ArgumentOutOfRangeException] "Gui credentials not entered correctly"          
        }

    Try
    {


        # see https://msdn.Microsoft.com/en-us/library/system.directoryservices.directoryentry.path(v=vs.110).aspx
        # validate the credentials are legitimate
        $validateCredentialsTest = (new-object System.DirectoryServices.DirectoryEntry ("WinNT://"+$credentialsOfCurrentUser.GetNetworkCredential().Domain), $credentialsOfCurrentUser.GetNetworkCredential().UserName, $credentialsOfCurrentUser.GetNetworkCredential().Password).psbase.name
        if ( $null -eq  $validateCredentialsTest)
        {
            throw [System.ArgumentOutOfRangeException] "Credentials are not valid.  ('" + $credentialsOfCurrentUser.GetNetworkCredential().Domain + '\' + $credentialsOfCurrentUser.GetNetworkCredential().UserName + "')"
        }
        else
        {
            $t = $Host.ui.RawUI.ForegroundColor
            $Host.ui.RawUI.ForegroundColor = "Magenta"
            Write-Output "GOOD CREDENTIALS"
            $Host.ui.RawUI.ForegroundColor = $t
        }
    }
    Catch
    {

        $ErrorMessage = $_.Exception.Message
        $FailedItem = $_.Exception.ItemName
        $StackTrace = $_.Exception.StackTrace

        $t = $Host.ui.RawUI.ForegroundColor
        $Host.ui.RawUI.ForegroundColor = "Red"

        Write-Output "Exception - $ErrorMessage"
        Write-Output "Exception - $FailedItem"
        Write-Output "Exception - $StackTrace"

        $Host.ui.RawUI.ForegroundColor = $t

        throw [System.ArgumentOutOfRangeException] "Attempt to create System.DirectoryServices.DirectoryEntry failed.  Most likely reason is that credentials are not valid."
    }

}


Try
{

    HarvestCredentials

}
Catch
{
    $ErrorMessage = $_.Exception.Message
    $FailedItem = $_.Exception.ItemName
    $StackTrace = $_.Exception.StackTrace

    $t = $Host.ui.RawUI.ForegroundColor
    $Host.ui.RawUI.ForegroundColor = "Red"

    Write-Output "Exception - " + $ErrorMessage
    Write-Output "Exception - " + $FailedItem
    Write-Output "Exception - " + $StackTrace

    $Host.ui.RawUI.ForegroundColor = $t

    Break
}
Finally
{
    $Time=Get-Date
    Write-Output "Done - " + $Time
}

und

.\TestCredentials.ps1 -preloadServiceAccountUserName "mydomain\myusername"
1
granadaCoder