6

Necesito crear varios usuarios en servidores de Windows 2008 y modificar el valor de caducidad de la contraseña a "Nunca". Estos serán usuarios locales (no AD). Puedo crearlos usando "net user", está modificando la expiración del pase que me está matando. Si hago un "nombre de usuario de usuario de red" enumera el campo y su valor, pero no hay ningún modificador (al menos no uno al que haga referencia el archivo de ayuda) para modificarlo, y la mayoría de las soluciones que vi en línea sugirieron instalar tercero herramientas de fiesta, sin embargo, esta solución debe ser nativa de Windows (lo ideal sería utilizar Powershell). Cualquier ayuda es apreciada.¿Cómo escribo un script para modificar los valores de caducidad de la contraseña para los usuarios en un servidor de Windows?

ACTUALIZACIÓN

dije si me di cuenta de cómo hacer esto en Powershell que iba a publicar aquí, y yo soy un hombre de palabra.

Get-WmiObject -Class Win32_UserAccount -Filter "name = 'steve'" | Set-WmiInstance -Argument @{PasswordExpires = 0}

Este es un valor booleano lo que si quería establecer una contraseña para expirar solo cambia de 0 a 1. Esto es hermoso para mí en su simplicidad, y he probado este método de actualización de otros objetos WMI y funciona todo el tiempo

+0

¿Necesita un script para hacer esto, o hacer lo que tiene que hacer esto una vez? – Olhovsky

+0

Esta es una pregunta perfectamente válida, y teniendo en cuenta que desea hacerlo con un script, no tendría sentido migrar al Superusuario. Modifiqué el título un poco para ayudar a aclarar tu pregunta. +1 de mi parte –

Respuesta

6

La solución más sencilla es crear un archivo por lotes que emite el siguiente comando:

net accounts /maxpwage:unlimited 

Sin embargo, que establecerá la vigencia máxima de todos cuentas en la máquina local a ilimitada, no sólo el nuevas cuentas que ha creado.


Si necesita un nivel de control más fino (es decir, la capacidad de establecer los valores de caducidad de la contraseña para usuarios individuales), necesitará algo un poco más complicado. Los chicos del scripting share an example de un VBScript que modificar una cuenta de usuario local para que su contraseña nunca caduca:

Const ADS_UF_DONT_EXPIRE_PASSWD = &h10000 

strDomainOrWorkgroup = "Fabrikam" 
strComputer = "atl-win2k-01" 
strUser = "KenMeyer" 

Set objUser = GetObject("WinNT://" & strDomainOrWorkgroup & "/" & _ 
    strComputer & "/" & strUser & ",User") 

objUserFlags = objUser.Get("UserFlags") 
objPasswordExpirationFlag = objUserFlags OR ADS_UF_DONT_EXPIRE_PASSWD 
objUser.Put "userFlags", objPasswordExpirationFlag 
objUser.SetInfo 

Sería fácil de modificar esto para trabajar para cualquier usuario de su elección, o incluso para crear un nuevo usuario.


Por último, here's an example in C#, que debe ser capaz de portar a PowerShell. No soy muy experto en PS, pero considerando que usa .NET Framework, el código anterior debería darle algunas ideas.

+0

Thx, veré estas soluciones. Esto es para un script, estoy tratando de automatizar por completo la configuración del servidor de aplicaciones para una webfarm, y hay algunas piezas que no he podido descifrar cómo hacer un script fácilmente (como este) ... Si me imagino cómo convertir C# a powershell. Lo publicaré también aquí (estos scripts están escritos en powershell). Thx otra vez, FYI me encantan los chicos del scripting ... –

1

De this technet thread.

$computer = $env:Computername 
$account = ([adsi]"WinNT://$computer/TestAccount") 
$account.PasswordExpired = 1 
$account.psbase.commitchanges() 

Puede agregar el dominio antes del nombre de la computadora si es necesario.

+0

Nice. No uso mucho el WMI, así que no pensé en mirar hacia allí. – JasonMArcher

+0

Oh, agrega la solución como respuesta y márcala aceptada. – JasonMArcher

+0

Se olvidó de mencionar ... su secuencia de comandos anterior establece el indicador caducado real, no el indicador willexpire. Pero gracias por la ayuda de todos modos ... –

0

Las otras soluciones no estaban trabajando para mí, así que pellizcada solución de Jason para:

$svrname = $env:computername 
$user = ([adsi]"WinNT://$svrname/Administrator") 
$user.userflags = 66049 
$user.psbase.commitchanges() 

El valor userflags determina qué casillas de verificación se comprueban para el usuario - ésta es una contraseña básica" no expira "valor" Parece que no funciona cómo los números van juntos, lo siguiente puede ser útil, pero de acuerdo con eso tengo habilitado un valor reservado que no tiene sentido.

http://www.selfadsi.org/ads-attributes/user-userAccountControl.htm

En lugar de eso acaba de habilitar las opciones que necesitaba en una caja de prueba y se recupera el valor. Es el medio más confiable para determinar lo que necesita, supongo.

0

Tomé la solución de Deadly-Bagel y no funcionó, hasta que hice un pequeño cambio. Ver más abajo:

$svrname = $env:computername 
$user = ([adsi]"WinNT://$svrname/Administrator") 
$user.psbase.InvokeSet("userflags", 66049) 
$user.psbase.commitchanges() 
1

Conjunto contraseña nunca caduca de usuario local. No cambie otras banderas:

$ADS_UF_DONT_EXPIRE_PASSWD = 0x10000 

$username = 'user' 
$user = [adsi] "WinNT://./$username" 
$user.UserFlags = $user.UserFlags[0] -bor $ADS_UF_DONT_EXPIRE_PASSWD 
$user.SetInfo() 

ADS_USER_FLAG_ENUM enumeration

Cuestiones relacionadas