Berikut ini beberapa kode PowerShell untuk melakukan apa yang Anda cari dengan akun domain:
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)
Penyedia ASDI juga mendukung sintaks WinNT://computername/username
untuk ChangePassword()
metode ini. The ADSystemInfo
objek, bagaimanapun, tidak akan bekerja untuk account mesin-lokal, jadi hanya perkuatan kode di atas dengan WinNT://...
sintaks tidak bisa diterapkan.
(Adakah yang ingin menyarankan edit w / kode untuk membedakan antara akun lokal dan domain?)
Pada taktik yang sama sekali berbeda, NetUserChangePassword
API lama akan bekerja dengan akun lokal (dan domain, asalkan Anda menentukan nama domain dalam sintaks NetBIOS), juga:
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)
Kode ini mengasumsikan Anda mengubah kata sandi di mesin lokal (".").
PS1
skrip mandiri yang dapat dipanggil dengan atau tanpa parameter. Ini jauh lebih mudah dibaca juga. Kode adalah tentang manusia yang memahami apa yang ditulis orang lain, bukan komputer. Tidak ada solusi yang lebih cepat dari yang lain.([ADSI]'WinNT://localhost/USERNAME').ChangePassword("OLDPASS", "NEWPASS")
Tapi itu mengembalikan 'Kata sandi tidak memenuhi persyaratan kebijakan kata sandi ...'. Kata sandi baru memang memenuhi persyaratan itu.([ADSI]'WinNT://localhost/USERNAME').ChangePassword("OLDPASS", "NEWPASS")
Ini sebenarnya cukup sederhana di PowerShell:
sumber
Saya mencoba kedua jawaban di atas tidak berhasil, untuk mengubah kata sandi admin lokal yang tidak bergabung dengan domain. Menggali komentar menghasilkan apa yang saya butuhkan.
Untuk bagian kedua dari jawaban yang saat ini diterima, Anda ingin memperbarui tanda tangan untuk digunakan
long
alih-alihbool
nilai balik, dan ini dapat dipecahkan di atas pada kode kesalahan sistem docs . Jadi, Anda berakhir dengan:Namun, itu tidak berhasil untuk saya. Kode kesalahan berganti-ganti antara 86 dan 2221, tergantung pada bagaimana saya mengatur parameter. Akan menyerah dan menggali lebih dalam komentar, dan akhirnya menemukan keberhasilan dalam melakukan:
Benar-benar konyol bahwa PERUBAHAN kata sandi admin lokal sangat rumit di Powershell. Jika Anda menyimpan securestrings sama sekali di sistem Anda, maka memperbarui kata sandi harus dilakukan dengan memasok kata sandi lama, atau berisiko kehilangan kemampuan untuk mendekripsi string aman dengan benar!
sumber