AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 570476
Accepted
elijahbuck
elijahbuck
Asked: 2014-01-29 08:31:01 +0800 CST2014-01-29 08:31:01 +0800 CST 2014-01-29 08:31:01 +0800 CST

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

  • 772

在 Windows Server 2008 R2 上,我有一个标准(非管理员)本地用户(不是 Active Directory 帐户,尽管服务器在域中),他只能通过 PowerShell Remoting 访问服务器。用户无法通过 RDP 登录。

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

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

powershell
  • 3 3 个回答
  • 17715 Views

3 个回答

  • Voted
  1. Best Answer
    Evan Anderson
    2014-01-29T10:14:06+08:002014-01-29T10:14:06+08:00

    下面是一些 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)
    

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

    • 19
  2. charleswj81
    2014-01-29T11:03:02+08:002014-01-29T11:03:02+08:00

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

    ([ADSI]'LDAP://CN=User,CN=Users,DC=domain').ChangePassword('currentpassword','newpassword')
    
    • 9
  3. gnalck
    2017-03-28T17:28:05+08:002017-03-28T17:28:05+08:00

    我尝试了上述两个答案均无济于事,以更改未加入域的本地管理员的密码。挖掘评论产生了我需要的东西。

    对于当前接受的答案的第二部分,您希望更新要使用的签名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 之间交替,这取决于我如何设置参数。正要放弃,又在评论里挖了更多,终于发现成功了:

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

    在 Powershell 中简单地更改本地管理员密码是如此复杂,这绝对是荒谬的。如果您在系统上存储了安全字符串,则必须通过提供旧密码来更新密码,否则可能会失去正确解密这些安全字符串的能力!

    • 3

相关问题

  • 资源锁和电源外壳

  • 脚本 - 如何断开远程桌面会话?

  • 如何限制向通讯组发送到外部地址?

  • Powershell对值与数组的作用不同?

  • Windows Powershell Vim 键绑定

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve