Из-за аутентификации наших клиентов и топологии сети у нас есть несколько серверов Windows в DMZ без 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);
}
}
Проблема в том, что это работает, только если пароль еще не изменился на компьютере разработчика, с которого он запускается. Поскольку используемый контекст сначала должен пройти аутентификацию на компьютере разработчика, чтобы получить доступ к сети, он должен получить доступ к удаленному (DMZ) компьютеру, используя тот же контекст, прежде чем менять пароль.
Как изменить метод для использования контекста нового пароля для получения доступа к сети и контекста старого пароля для получения доступа к удаленному хосту?
Примечание для редакторов титров: код зависит от System.DirectoryServices.AccountManagement, который является сборкой FX 3.5, а не 3.0.