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


18

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

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

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

답변:


18

도메인 계정으로 원하는 작업을 수행하는 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)

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


1
당신은 저를 이겼지 만, 나는 캐릭터를 보존하기 위해 이겼습니다.) 당신이 사용한 여분의 부품이 필요하다는 것을 아는 이유는 무엇입니까? 아니면 더 공식적이고 적절합니까?
charleswj81

1
당신은 분명히 코드 골프 상을받습니다. 나는 단지 ol '형식적이고 적절합니다 ... 사실, 그것은 주로 잘라서 붙여 넣기 유형의 다른 사람들이 스크립트를 조금 더 유용하게 만듭니다.
Evan Anderson

1
@ charleswj81-Evan의 답변이 더 완벽합니다. PS1매개 변수를 사용하거나 사용하지 않고 호출 할 수 있는 독립형 스크립트입니다. 훨씬 더 읽기 쉽습니다. 코드는 인간이 컴퓨터가 아닌 다른 사람이 작성한 것을 이해하는 것입니다. 어느 솔루션도 다른 솔루션보다 빠를 수는 없습니다.
Mark Henderson

1
이것은 유망한 것처럼 보이지만 계정이 시스템에 로컬임을 분명히해야합니다. 나는 다음을 시도했다 : ([ADSI]'WinNT://localhost/USERNAME').ChangePassword("OLDPASS", "NEWPASS") 그러나 '비밀번호가 비밀번호 정책 요구 사항을 충족하지 않습니다 ...'를 반환했습니다. 새 비밀번호는 이러한 요구 사항을 충족합니다.
elijahbuck

1
실제로 사용자를 '원격 데스크톱 사용자'에 추가하고 암호를 변경하려고 시도한 후에도 동일한 오류가 발생합니다. 로컬 계정을 변경하는 올바른 방법은 다음과 같습니다. ([ADSI]'WinNT://localhost/USERNAME').ChangePassword("OLDPASS", "NEWPASS")
elijahbuck

9

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

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

3

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.