25 votos

Comprobar si el usuario la contraseña de entrada es válida en la secuencia de comandos de Powershell

Estoy trabajando con un script de Powershell que añade tareas programadas para los sistemas de nuestro dominio. Al ejecutar esta secuencia de comandos, se le pedirá a mí por mi contraseña. Yo a veces, la grasa dedo la contraseña y se inicia el proceso, que bloquea mi cuenta. Es allí una manera de verificar mis credenciales para asegurarse de que lo que he escrito en validará con el Dominio?

Me gustaría encontrar una forma de consultar el controlador de Dominio. He hecho algunas búsquedas en Google y yo debería ser capaz de hacer una consulta de WMI y captura de un error. Me gustaría evitar que el estilo de validación, si es posible.

Alguna idea? Gracias de antemano.

42voto

Hitman2847 Puntos 16

Esto es lo que he usado en el pasado; se supone que funciona para cuentas de equipo local y el 'directorio de la aplicación', pero hasta ahora sólo lo he usado con éxito con el ANUNCIO de credenciales:

    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)
    }
}

23voto

Jim B Puntos 18849

Tengo esto en mi biblioteca:

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

0voto

Michael Puntos 1

He encontrado este artículo útil, sin embargo, no resolvió mi problema, como yo estaba tratando de ejecutar desde una secuencia de comandos con la cuenta de administrador ha iniciado sesión. No parece de trabajo como administración local (sólo cuando se inicia sesión como un usuario de dominio).

Sin embargo, me hizo finalmente logran obtener una solución de trabajo y, como era tanta dificultad pensé en compartirlo aquí para que nadie con este problema tendrá la respuesta correcta aquí. Ambas respuestas en la página en función de sus necesidades.

Tenga en cuenta que más arriba en el scipt (no se incluye aquí como esto es tan sólo la sección de credenciales) powergui está instalado y es un requisito para que este código a continuación (así como el "Add-PSSnapin Búsqueda.ActiveRoles.ADManagement" línea). No estoy seguro de lo powergui ¿que es diferente, pero nadie me podía decir y funciona.

Sustituir su propio nombre de dominio en el "dominio" de las secciones.

#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"

-1voto

tony roth Puntos 2985

lo que quiero hacer es algo como lo siguiente

http://blogs.technet.com/b/robcost/archive/2008/05/01/powershell-tip-storing-and-using-password-credentials.aspx

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X