답변:
도메인 계정으로 원하는 작업을 수행하는 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)
이 코드는 로컬 컴퓨터에서 암호를 변경한다고 가정합니다 ( ".").
PS1
매개 변수를 사용하거나 사용하지 않고 호출 할 수 있는 독립형 스크립트입니다. 훨씬 더 읽기 쉽습니다. 코드는 인간이 컴퓨터가 아닌 다른 사람이 작성한 것을 이해하는 것입니다. 어느 솔루션도 다른 솔루션보다 빠를 수는 없습니다.
([ADSI]'WinNT://localhost/USERNAME').ChangePassword("OLDPASS", "NEWPASS")
그러나 '비밀번호가 비밀번호 정책 요구 사항을 충족하지 않습니다 ...'를 반환했습니다. 새 비밀번호는 이러한 요구 사항을 충족합니다.
([ADSI]'WinNT://localhost/USERNAME').ChangePassword("OLDPASS", "NEWPASS")
도메인에 가입하지 않은 로컬 관리자의 비밀번호를 변경하기 위해 위의 두 가지 답변을 아무 소용이 없었습니다. 의견을 파헤쳐 서 필요한 것을 얻었습니다.
현재 허용되는 답변의 두 번째 부분에서는 반환 값 long
대신 사용할 서명을 업데이트하려고 하며 시스템 오류 코드 docsbool
에서 문제를 해결할 수 있습니다 . 그래서 당신은 결국 :
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)
그러나 그것은 나를 위해 작동하지 않았습니다 . 매개 변수 설정 방법에 따라 오류 코드가 86과 2221 사이에서 번갈아 나타납니다. 의견을 포기하고 더 파고 들자 마침내 다음과 같은 성공을 거두었습니다.
([ADSI]'WinNT://./USERNAME').ChangePassword("OLDPASS", "NEWPASS")
Powershell에서 로컬 관리자 암호의 간단한 변경이 너무 복잡하다는 것은 우스운 일입니다. 시스템에 보안 문자열을 전혀 저장하지 않으면 이전 암호를 제공하여 암호를 업데이트해야합니다. 그렇지 않으면 해당 보안 문자열을 제대로 해독 할 수 없게됩니다.