我如何以编程方式更改Windows域密码?

8
换句话说,如何在不使用"Ctrl+Alt+Del -> 更改密码"界面的情况下更改我的密码。
通过编程方式,我是指通过命令行工具、C#通过.NET库、Python通过COM调用等方式。真正不涉及任何手动步骤的任何方法都可以。 NET USER命令不合适,因为它要求我以域管理员权限运行。
2个回答

7

那篇文章中的代码看起来可能会回答这个问题,但我不同意实际文章的观点,因为它没有提到它只能在一个糟糕管理的系统上工作,其中最小密码年龄没有被设置。 - Hans Olsson
1
@ho1 谢谢。我修改了文章,加入了关于最短密码有效期的说明。 - Sjoerd
1
“最短密码使用期限”设置非常愚蠢,因为这意味着如果密码被泄露,您将无法更改密码。例如:您今天早上更改了密码,然后在向50人做演示时不小心在用户字段中输入了密码。 - Deestan
@Deestan 我认为“最短密码使用期限”的原因是为了防止多次更改密码以便最终将其更改回原始密码。这正是答案中的代码所做的。该问题可以通过存储所有先前的密码来解决,但该方法也有其他缺点。如果在“最短密码使用期限”内泄露了密码,则域管理员可以允许(要求)再次更改密码。 - Leigh Riffel
+1 很棒的链接。我能够使用它创建一个应用程序,只需更改一次密码而不是多次。请看我的回答上的代码。 - Leigh Riffel
显示剩余2条评论

5
这是Sjoerd提供的代码的修改版本,它只更改一次密码,而不是循环进行多次密码更改。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.DirectoryServices;

namespace ChangePassword
{
    class Program
    {
        static void Main(string[] args)
        {
            string Domain = Environment.UserDomainName;
            string User = Environment.UserName;

            if (args.Length < 2)
            {
                System.Console.WriteLine("Usage: ChangePassword OldPassword NewPassword [User]");
                System.Console.WriteLine("       -The domain is " + Domain + ".");
                System.Console.WriteLine("       -The user is " + User + " unless it is specified.");
                System.Environment.Exit(1);
            }
            string OldPassword = args[0];
            string NewPassword = args[1];
            if (args.Length == 3)
                User = args[2];

            DirectoryEntry entry = null;
            try {
                entry = new DirectoryEntry(@"WinNT://" + Domain + "/" + User + ",User");
            }
            catch (System.Reflection.TargetInvocationException e)
            {
                System.Console.WriteLine("Domain/User failed due to:");
                Exception cause = e.InnerException;
                System.Console.WriteLine(cause.Message);
                System.Environment.Exit(1);
            }

            try {
                entry.Invoke("ChangePassword", OldPassword, NewPassword);
            }
            catch (System.Reflection.TargetInvocationException e)
            {
                System.Console.WriteLine("Password change failed due to:");
                Exception cause = e.InnerException;
                System.Console.WriteLine(cause.Message);
                System.Environment.Exit(1);
            }
            System.Console.WriteLine("Ok.");
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接