Oto kod PowerShell do robienia tego, czego szukasz z kontami domeny:
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)
Dostawca ASDI obsługuje również składnię WinNT://computername/username
tej ChangePassword()
metody. ADSystemInfo
Obiekt, jednak nie będą działać dla kont maszynowych lokalnego, tak właśnie modernizacji powyższy kod z WinNT://...
składnia nie jest wykonalne.
(Czy ktoś chce zasugerować edycję kodu w / w celu rozróżnienia kont lokalnych i domenowych?)
W zupełnie innym rozwiązaniu stary NetUserChangePassword
interfejs API będzie działał również z kontami lokalnymi (i domenowymi, pod warunkiem, że określisz nazwę domeny w składni 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)
Ten kod zakłada, że zmieniasz hasło na komputerze lokalnym („.”).
PS1
skrypt, który można wywoływać z parametrami lub bez nich. Jest też o wiele bardziej czytelny. Kod polega na tym, aby ludzie rozumieli, co napisał ktoś inny, a nie komputer. Żadne z rozwiązań nie będzie szybsze od drugiego.([ADSI]'WinNT://localhost/USERNAME').ChangePassword("OLDPASS", "NEWPASS")
Ale to zwróciło „Hasło nie spełnia wymagań polityki haseł ...”. Nowe hasło spełnia te wymagania.([ADSI]'WinNT://localhost/USERNAME').ChangePassword("OLDPASS", "NEWPASS")
Jest to w rzeczywistości dość proste w PowerShell:
źródło
Próbowałem obu powyższych odpowiedzi bezskutecznie, aby zmienić hasło lokalnego administratora, który nie jest przyłączony do domeny. Przeglądając komentarze, dostałem jednak to, czego potrzebowałem.
W przypadku drugiej części obecnie akceptowanej odpowiedzi chcesz zaktualizować podpis, aby używał
long
zamiastbool
wartości zwracanej, i można je rozwiązać w dokumentacji kodów błędów systemu . W rezultacie otrzymujesz:Nie działało to jednak dla mnie. Kody błędów występowały naprzemiennie między 86 a 2221, w zależności od tego, jak skonfigurowałem parametry. Już miał się poddać i wkopać więcej w komentarze, aż w końcu odniósł sukces w:
To absurdalne, że prosta ZMIANA lokalnego hasła administratora jest tak skomplikowana w PowerShell. Jeśli w ogóle przechowujesz bezpieczne ciągi, to musisz je zaktualizować, podając stare hasło, inaczej ryzykujesz utratą możliwości prawidłowego odszyfrowania tych bezpiecznych ciągów!
źródło