更改远程密码(代码为.Net 3.5)

时间:2009-09-01 12:54:25

标签: c# windows authentication

由于我们的客户端身份验证和网络拓扑,我们在没有Active Directory或域控制器的DMZ中有许多Windows服务器。公司政策规定密码必须每月更改一次。我们的开发机器在AD(不在DMZ中),所以我们遇到的情况是每个月我们必须将每个DMZ机器上的用户名和密码与我们的AD凭证同步。有很多DMZ机器。

我想使用一个简单的控制台应用程序来更改给定用户的所有DMZ机器上的用户密码。到目前为止,我有以下代码:

using System.Collections.Generic;
using System.DirectoryServices.AccountManagement;
class Program{
    static void Main(){
        List<string> remoteHosts = new List<string> { "RemoteHostA", "RemoteHostB", "RemoteHostC" };
        remoteHosts.ForEach(host => ChangePassword(host, "username", "oldPassword", "newPassword"));
    }
    static void ChangePassword(string host, string username, string oldPassword, string newPassword){
        using (var context = new PrincipalContext(ContextType.Machine, host, username, newPassword))
            using (var user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, username))
                user.ChangePassword(oldPassword, newPassword);
    }
}

问题是,只有在运行它的开发机器上尚未更改密码时,这才有效。由于使用的上下文首先必须通过dev机器进行身份验证才能获得对网络的访问权限,因此在更改密码之前必须使用相同的上下文访问远程(DMZ)计算机。

如何更改使用新密码上下文获取网络访问权限的方法和旧密码上下文以获取对远程主机的访问权限?

标题编辑器的注释:代码依赖于System.DirectoryServices.AccountManagement,它是FX 3.5程序集而不是3.0。

1 个答案:

答案 0 :(得分:2)

您可以直接使用WMI来实现这一目标吗?快速搜索显示this page

注意:我用WMI做了很长时间,但我确实记得可以从C#应用程序中调用它,如果你习惯使用它的话。 (签入System.Management)