Estoy usando un script de PowerShell que encontré en línea, intentando usar una CPU Win7 para cambiar contraseñas de forma remota en un Windows Server 2008 a través de RSAT. En este momento, el servidor 2008 y win7 son máquinas virtuales, y la CPU de win7 está dominada por el servidor y puede ejecutar correctamente el módulo Active Directory para powershell. Soy bastante nuevo en PowerShell y trato con servidores [este proyecto es mi capacitación en mi pasantía] y recibo un error al intentar compilar este script.
import-Module ActiveDirectory
Function Set-AdUserPwd
{
Param(
[string]$user,
[string]$pwd
) #end param
$oUser = [adsi]"LDAP://$user"
$ouser.psbase.invoke("SetPassword",$pwd)
$ouser.psbase.CommitChanges()
} # end function Set-AdUserPwd
Set-AdUserPwd -user "cn=test,ou=Users,dc=ifrit,dc=local" -pwd P@ssword1
Exception calling "Invoke" with "2" argument(s): "There is no such object on the server.
"
At line:10 char:25
+ $ouser.psbase.invoke <<<< ("SetPassword",$pwd)
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
Pensé que tal vez 'invocar' era algo solo en PowerShell 3, pero al mirar el artículo de Technet, dice que también se aplica a PowerShell 2. Tengo una cuenta en AD como 'prueba', pero no estoy seguro de si ese es el nombre común real (nombre: prueba, apellido: prueba, nombre de inicio de sesión del usuario:[correo electrónico protegido]) ¿Alguien puede decirme si la excepción se refiere a que tengo un CN incorrecto O es algo completamente diferente?
Respuesta1
De acuerdo con los comentarios anteriores.
Puede eliminar las referencias a ADSI (Active Directory Scripting Interface), ya que esta es la forma "antigua" de hacer las cosas; el módulo PS de Active Directory ha sido diseñado para reemplazarlo.
Entonces, en su caso, primero debe confirmar que el objeto de usuario existe. Puedes hacer esto usando elObtener-ADUsercmdlet, según el criterio de búsqueda que elija. Ahora, en esta etapa, sugeriría hacer la búsqueda bastante prescriptiva, es decir, para que solo devuelva un objeto de usuario, por ejemplo:
try {
$objUser = Get-ADUser -Filter { Name -eq $user }
//
// rest of code here
//
}
catch{
Write-Host "ERROR : Failed to locate user.";
}
Luego puedes usar elEstablecer contraseña de cuenta ADcmdlet para restablecer la contraseña (ver hipervínculo). Esto requiere el Nombre Distinguido (DN) del usuario, que será un atributo de su$objUsuarioobjeto devuelto porObtener-ADUserllamar.
No puedo probar esto desde aquí, por lo que si lo intenta desde un mensaje interactivo de PowerShell, podrá ver qué atributos existen para su$objUsuarioobjeto:
$test = Get-ADUser -Filter { Name -eq "jimbob" }
$test | Get-Member
Sospecho que hay unDNoNombre distinguidoatributo, pero como digo, no puedo probar desde aquí.
Pruébelo y actualice aquí con el progreso, si necesita más ayuda...