표준 Windows 사용자는 명령 줄에서 암호를 어떻게 변경할 수 있습니까? 할 수있는

Windows Server 2008 R2에는 PowerShell Remoting을 통해서만 서버에 액세스 할 수있는 표준 (관리자가 아닌) 로컬 사용자 (서버가 도메인에 있지만 Active Directory 계정이 아님)가 있습니다. 사용자는 RDP를 통해 로그인 할 수 없습니다.

이 사용자가 비밀번호를 변경할 수 있기를 바랍니다. 사용자가 자신의 비밀번호를 변경하려고하더라도 ‘net user’명령에는 관리자 권한이 필요합니다.

표준 사용자가 명령 행에서 비밀번호를 어떻게 변경할 수 있습니까?



답변

도메인 계정으로 원하는 작업을 수행하는 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://...구문으로 수정하는 것만으로는 작동하지 않습니다.

(누구든지 로컬 계정과 도메인 계정을 구별하기 위해 코드로 편집을 제안하고 싶습니까?)

완전히 다른 방법으로, 이전 NetUserChangePasswordAPI는 로컬 (및 도메인, 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)

이 코드는 로컬 컴퓨터에서 암호를 변경한다고 가정합니다 ( “.”).


답변

이것은 실제로 PowerShell에서 매우 간단합니다.

([ADSI]'LDAP://CN=User,CN=Users,DC=domain').ChangePassword('currentpassword','newpassword')

답변

도메인에 가입하지 않은 로컬 관리자의 비밀번호를 변경하기 위해 위의 두 가지 답변을 아무 소용이 없었습니다. 의견을 파헤쳐 서 필요한 것을 얻었습니다.

현재 허용되는 답변의 두 번째 부분에서는 반환 값 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에서 로컬 관리자 암호의 간단한 변경이 너무 복잡하다는 것은 우스운 일입니다. 시스템에 보안 문자열을 전혀 저장하지 않으면 이전 암호를 제공하여 암호를 업데이트해야합니다. 그렇지 않으면 해당 보안 문자열을 제대로 해독 할 수 없게됩니다.