Como um usuário padrão do Windows pode alterar sua senha a partir da linha de comando?

18

No Windows Server 2008 R2, tenho um usuário local padrão (não administrador) (não uma conta do Active Directory, embora o servidor esteja em um domínio) que tenha acesso ao servidor somente por meio do PowerShell Remoting. O usuário não pode efetuar login via RDP.

Gostaria que este usuário pudesse alterar sua senha. O comando 'net user' requer direitos de administrador, mesmo que o usuário esteja tentando alterar sua própria senha.

Como um usuário padrão pode alterar sua senha a partir da linha de comando?

    
por elijahbuck 28.01.2014 / 17:31

3 respostas

18

Veja alguns códigos do PowerShell para fazer o que você está procurando com contas de domínio:

param (
    [string]$oldPassword = $( Read-Host "Old password"),
    [string]$newPassword = $( Read-Host "New password")
)

$ADSystemInfo = New-Object -ComObject ADSystemInfo
$type = $ADSystemInfo.GetType()
$user = [ADSI] "LDAP://$($type.InvokeMember('UserName', 'GetProperty', $null, $ADSystemInfo, $null))"
$user.ChangePassword( $oldPassword, $newPassword)

O provedor ASDI também suporta a sintaxe WinNT://computername/username do método ChangePassword() . O objeto ADSystemInfo , no entanto, não funcionará para contas locais de máquinas, portanto, apenas adaptar o código acima com a sintaxe WinNT://... não é viável.

(Alguém quer sugerir uma edição com código para diferenciar entre contas locais e de domínio?)

Em uma abordagem completamente diferente, a antiga NetUserChangePassword API funcionará com contas locais (e de domínio, desde que você especifique o nome do domínio na sintaxe do NetBIOS) também:

param (
    [string]$oldPassword = $( Read-Host "Old password"),
    [string]$newPassword = $( Read-Host "New password")
)

$MethodDefinition = @'
[DllImport("netapi32.dll", CharSet = CharSet.Unicode)]
public static extern bool NetUserChangePassword(string domainname, string username, string oldPassword, string newPassword);
'@

$NetAPI32 = Add-Type -MemberDefinition $MethodDefinition -Name 'NetAPI32' -Namespace 'Win32' -PassThru

$NetAPI32::NetUserChangePassword('.', $env:username, $oldPassword, $newPassword)

Este código presume que você está alterando uma senha na máquina local (".").

    
por 28.01.2014 / 19:14
9

Isso é bem simples no PowerShell:

([ADSI]'LDAP://CN=User,CN=Users,DC=domain').ChangePassword('currentpassword','newpassword')
    
por 28.01.2014 / 20:03
3

Eu tentei as duas respostas acima sem sucesso, para alterar a senha de um administrador local que não é associado ao domínio. No entanto, vasculhar os comentários produziu o que eu precisava.

Para a segunda parte da resposta atualmente aceita, você deseja atualizar a assinatura para usar long em vez de bool valor de retorno, e isso pode ser solucionado em os códigos de erro do sistema . Então você acaba com:

param (
    [string]$oldPassword = $( Read-Host "Old password"),
    [string]$newPassword = $( Read-Host "New password")
)

$MethodDefinition = @'
[DllImport("netapi32.dll", CharSet = CharSet.Unicode)]
public static extern **long** NetUserChangePassword(string domainname, string username, string oldPassword, string newPassword);
'@

$NetAPI32 = Add-Type -MemberDefinition $MethodDefinition -Name 'NetAPI32' -Namespace 'Win32' -PassThru

$NetAPI32::NetUserChangePassword('.', $env:username, $oldPassword, $newPassword)

No entanto, esse não funcionou para mim. Os códigos de erro alternavam entre 86 e 2221, dependendo de como eu configurava os parâmetros. Estava prestes a desistir e cavou mais nos comentários, e finalmente encontrou sucesso em fazer:

([ADSI]'WinNT://./USERNAME').ChangePassword("OLDPASS‌​", "NEWPASS")

Absolutamente ridículo que a simples mudança de uma senha de administrador local é tão complicada em Powershell. Se você armazena securestrings no seu sistema, então a atualização da senha deve ser feita com o fornecimento da senha antiga, ou corre o risco de perder a capacidade de descriptografar corretamente essas cadeias seguras!

    
por 28.03.2017 / 03:28