2009-09-01 8 views
0

En raison de l'authentification de nos clients et de la topologie de réseau, nous avons un certain nombre de serveurs Windows dans une DMZ sans Active Directory ou un contrôleur de domaine. La politique d'entreprise stipule que les mots de passe doivent changer une fois par mois. Nos machines dev sont en AD (pas dans la DMZ) donc nous nous retrouvons dans la situation où nous devons synchroniser nos noms d'utilisateur et mots de passe sur chacune des machines DMZ avec nos identifiants AD tous les mois. Il y a beaucoup de machines DMZ. Je souhaite utiliser une application de console simple pour modifier les mots de passe utilisateur sur toutes les machines DMZ pour un utilisateur donné. Jusqu'à présent, j'ai le code suivant:Modifier le mot de passe à distance (en code, .Net 3.5)

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); 
    } 
} 

Le problème est que cela ne fonctionne que si le mot de passe n'a pas déjà changé sur la machine dev où il est exécuté à partir. Parce que le contexte utilisé doit d'abord s'authentifier auprès de la machine dev pour accéder au réseau, il doit alors accéder à la machine distante (DMZ) en utilisant le même contexte avant de changer le mot de passe.

Comment puis-je modifier la méthode pour utiliser un nouveau contexte de mot de passe pour accéder au réseau et un ancien contexte de mot de passe pour accéder à l'hôte distant?

Note aux éditeurs de titres: Le code dépend de System.DirectoryServices.AccountManagement qui est un assembly FX 3.5 non 3.0.

+0

@grenade - Je ne veux pas commencer une guerre d'édition, donc je vous laisserai le soin de vous dire qu'il y a une différence entre C# et .NET. Il n'y a pas de C# 3.5, juste C# 3. Peut-être que votre titre devrait contenir _.NET 3.5_ plutôt que C# 3 :) –

+0

Bravo Andrew, c'est une édition avec laquelle je peux vivre ... – grenade

Répondre

2

Pouvez-vous utiliser WMI directement pour y parvenir? Une recherche rapide s'est produite this page

Remarque: Il y a longtemps que je n'ai rien fait avec WMI, mais je me souviens d'avoir pu l'appeler depuis une application C#, si c'est ainsi que vous vous sentez à l'aise. (Check in System.Management)

+0

+1 L'exemple de code dans votre lien ressemble prometteur. – grenade

Questions connexes