Aqui está um código 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 ChangePassword()
método. O ADSystemInfo
objeto, no entanto, não funcionará para contas locais da máquina, portanto, apenas a atualização do código acima com WinNT://...
sintaxe 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 NetUserChangePassword
API antiga também funcionará com contas locais (e de domínio, desde que você especifique o nome de domínio na sintaxe NetBIOS):
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 pressupõe que você esteja alterando uma senha na máquina local (".").
PS1
script independente que pode ser chamado com ou sem parâmetros. É muito mais legível também. Código é tudo sobre seres humanos, entendendo o que alguém escreveu, não o computador. Nenhuma solução será mais rápida que a outra.([ADSI]'WinNT://localhost/USERNAME').ChangePassword("OLDPASS", "NEWPASS")
Mas retornei 'A senha não atende aos requisitos da diretiva de senha ...'. A nova senha atende a esses requisitos.([ADSI]'WinNT://localhost/USERNAME').ChangePassword("OLDPASS", "NEWPASS")
Na verdade, isso é bastante simples no PowerShell:
fonte
Tentei as duas respostas acima sem sucesso, alterando a senha de um administrador local que não ingressou no domínio. Cavar nos comentários rendeu o que eu precisava.
Para a segunda parte da resposta atualmente aceita, você deseja atualizar a assinatura para usar em
long
vez dobool
valor de retorno, e isso pode ser solucionado nos documentos dos códigos de erro do sistema . Então você acaba com:No entanto, isso não funcionou para mim. Os códigos de erro alternaram entre 86 e 2221, dependendo de como eu configuro os parâmetros. Estava prestes a desistir e cavar mais comentários, e finalmente encontrou sucesso em fazer:
Absolutamente ridículo que a simples mudança de uma senha de administrador local seja tão complicada no Powershell. Se você armazenar proteções de segurança no seu sistema, a atualização da senha deverá ser feita com o fornecimento da senha antiga ou o risco de perder a capacidade de descriptografar adequadamente essas cadeias de caracteres seguras!
fonte