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

C# 更改远程密码(代码为.Net 3.5),c#,windows,authentication,C#,Windows,Authentication,由于我们的客户端身份验证和网络拓扑,我们在DMZ中有许多Windows服务器,而没有Active Directory或域控制器。公司政策规定密码必须每月更改一次。我们的开发机器在AD中(不在DMZ中),因此我们遇到了这样的情况:我们必须每月将每个DMZ机器上的用户名和密码与我们的AD凭据同步。有很多DMZ机器 我想使用一个简单的控制台应用程序来更改给定用户在所有DMZ机器上的用户密码。到目前为止,我有以下代码: using System.Collections.Generic; using Sy

由于我们的客户端身份验证和网络拓扑,我们在DMZ中有许多Windows服务器,而没有Active Directory或域控制器。公司政策规定密码必须每月更改一次。我们的开发机器在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);
    }
}
使用System.Collections.Generic;
使用System.DirectoryServices.AccountManagement;
班级计划{
静态void Main(){
List remoteHosts=新列表{“RemoteHostA”、“RemoteHostB”、“RemoteHostC”};
ForEach(主机=>ChangePassword(主机,“用户名”、“旧密码”、“新密码”);
}
静态void ChangePassword(字符串主机、字符串用户名、字符串oldPassword、字符串newPassword){
使用(var context=newprincipalcontext(ContextType.Machine,host,username,newPassword))
使用(var user=UserPrincipal.FindByIdentity(上下文,IdentityType.SamAccountName,用户名))
user.ChangePassword(旧密码、新密码);
}
}
问题是,只有在运行密码的dev计算机上密码尚未更改时,这才有效。因为所使用的上下文,首先必须通过dev机器的身份验证才能访问网络,然后必须在更改密码之前使用相同的上下文访问远程(DMZ)机器

如何更改方法以使用新密码上下文访问网络,使用旧密码上下文访问远程主机


标题编辑器注意:代码取决于System.DirectoryServices.AccountManagement,它是FX 3.5程序集,而不是3.0。

能否直接使用WMI来实现此目的?一个快速的搜索出现了


注意:我已经很久没有用WMI做过任何事情了,但我确实记得能够从C#app调用它,如果你喜欢这样使用它的话。(签入System.Management)

@gland-我不想发动编辑战,所以我将把这件事留给你,C#和.NET之间有区别。没有C#3.5,只有C#3。也许你的标题应该包含.NET3.5而不是C#3:)安德鲁干杯,这是我可以接受的编辑。。。