2012-05-29 14 views
9

Digamos que tengo un objeto PSCrendential en PowerShell que creé usando Get-Credential.Validación de PowerShell PSCredential

¿Cómo puedo validar la entrada en contra de Active Directory?

Por ahora encontraron esta manera, pero creo que es un poco feo:

[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 

[Editar, dos años más tarde] Para los futuros lectores, por favor tenga en cuenta que Test-Credential o Test-PSCredential son mejores nombres, porque Validate no es un verbo PowerShell válida (ver Get-Verb)

Respuesta

8

creo con System.DirectoryServices.AccountManagement es la forma menos feo:

Se trata de utilizar ADSI (más feo?):

$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" 
} 
+0

Entiendo que PSCredentials es un proveedor de autenticación independiente (básicamente es un contenedor simple para nombre de usuario/contraseña), pero este requisito me parece muy común. –

+0

@SteveB Es una tarea muy común para administradores de sistemas y desarrolladores, especialmente para aquellos que trabajan en AD, por eso (IMO) Microsoft hace AccountManagement. Aquí puede ver una variedad de formas utilizadas en C# para realizar esta tarea: http://stackoverflow.com/questions/290548/c-sharp-validate-a-username-and-password-against-active-directory –

+0

De hecho , las mejores prácticas de desarrollo general se aplican aquí. Especialmente puedo ocultar la complejidad de esta función y luego simplemente llamar a la función :) –

0

que estaba teniendo un problema similar con un instalador y requerir que verifique los datos de la cuenta de servicios suministrados. Quería evitar el uso del módulo AD en Powershell, ya que no estaba 100% instalado en la máquina que ejecuta el script.

Hice la prueba usando el siguiente, está ligeramente sucio pero funciona.

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

Ni mi pregunta ni @cb. la respuesta requiere tener cargado el módulo AD. De hecho, se basa en algunas clases .Net relacionadas con AD, que están siempre disponibles en PowerShell. –

Cuestiones relacionadas