ต่อไปนี้เป็นรหัส PowerShell เพื่อทำสิ่งที่คุณต้องการด้วยบัญชีโดเมน:
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)
ผู้ให้บริการ ASDI ยังสนับสนุนไวยากรณ์WinNT://computername/username
สำหรับChangePassword()
วิธีการ อย่างไรก็ตามADSystemInfo
วัตถุจะไม่ทำงานสำหรับบัญชีภายในเครื่องดังนั้นเพียงแค่การดัดแปลงรหัสข้างต้นด้วยWinNT://...
ไวยากรณ์ไม่สามารถใช้งานได้
(ใครต้องการแนะนำการแก้ไขด้วยรหัสเพื่อแยกความแตกต่างระหว่างบัญชีท้องถิ่นและโดเมน?)
ในแทคที่แตกต่างกันโดยสิ้นเชิงNetUserChangePassword
API เก่าจะทำงานกับบัญชีโลคัล (และโดเมนหากคุณระบุชื่อโดเมนในไวยากรณ์ 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)
รหัสนี้จะถือว่าคุณเปลี่ยนรหัสผ่านในเครื่องท้องถิ่น (".")