标准Windows用户如何从命令行更改密码?

在Windows Server 2008 R2上,我有一个标准(非pipe理员)本地用户(不是Active Directory帐户,虽然服务器在域中)只能通过PowerShell Remoting访问服务器。 用户不能通过RDPlogin。

我希望这个用户能够改变他们的密码。 即使用户尝试更改自己的密码,“net user”命令也需要pipe理员权限。

标准用户如何从命令行更改密码?

以下是一些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提供程序还支持ChangePassword()方法的语法WinNT://computername/username 。 但是, ADSystemInfo对象不适用于机器本地帐户,因此只需使用WinNT://...语法对上面的代码进行改造即可。

(有人希望build议编辑W /代码区分本地和域帐户?)

在完全不同的情况下,旧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) 

此代码假定您正在更改本地计算机上的密码(“。”)。

在PowerShell中,这实际上非常简单:

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

我尝试了上述两个答案无济于事,更改了未join域的本地pipe理员的密码。 通过评论挖掘产生了我所需要的。

对于当前接受的答案的第二部分,您希望更新签名以使用long而不是bool返回值,并且这些可以在系统错误代码文档中进行故障排除。 所以你最终:

 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之间交替,取决于我如何设置参数。 当即将放弃,并挖掘更多的意见,终于find成功在做:

 ([ADSI]'WinNT://./USERNAME').ChangePassword("OLDPASS‌​", "NEWPASS") 

绝对荒谬的是,在Powershell中简单地修改本地pipe理员密码非常复杂。 如果您在系统中存储了所有的securestrings,则必须提供旧密码才能更新密码,否则将失去正确解密这些安全string的能力!