在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的能力!