2010-12-15 31 views
0

J'essaie d'ajouter un compte d'utilisateur local sur une machine non liée à un domaine. J'ai essayé à peu près tout ce que je peux penser. J'ai ceci fonctionnant sur des machines dans le même domaine, mais pas sur des machines hors domaine. Je peux ping et TS à ce serveur, mais ne peux pas sembler ajouter un admin.

Est-il possible d'utiliser DirectoryEntry pour ce faire?C# ActiveDirectory - Comment ajouter un compte d'utilisateur local à distance d'une machine à domaine joint à une machine sans domaine

Voici le code que j'ai actuellement (légèrement modifié pour une meilleure lisibilité):

private string AddLocalAdmin_NonDomain(string ComputerName) 
    { 
     StartImpersonation(); //Uses advapi32.dll->LogonUser() 
     string ErrMsg = ""; 
     const int ADS_UF_DONT_EXPIRE_PASSWD = 0x10000; 
     DirectoryEntry AD = new DirectoryEntry("WinNT://" + ComputerName + ",computer", ComputerName + "\\" + UserCredentials.Username, UserCredentials.Password); 
     object n = AD.NativeObject; 
     DirectoryEntry NewUser = AD.Children.Add(Username, "user"); 
     NewUser.Invoke("SetPassword", new object[] { Password }); 
     if (!PasswordExpires) 
     { 
      int val = ADS_UF_DONT_EXPIRE_PASSWD; 
      NewUser.InvokeSet("userFlags", new object[] { val }); 
     } 
     NewUser.CommitChanges(); 
     DirectoryEntry grp; 
     grp = AD.Children.Find("Administrators", "group"); 
     if (grp != null) { grp.Invoke("Add", new object[] { NewUser.Path.ToString() }); } 
     EndImpersonation(); //Ends the impersonation 
     return ErrMsg; //returns "Access Denied" 
    } 

Répondre

2

Vous pouvez utiliser

System.DirectoryServices.AccountManagement 

et achive que voici le code

PrincipalContext oPrincipalContext = new PrincipalContext(ContextType.Machine); 

//Create New User 
UserPrincipal oUserPrincipal = new UserPrincipal(oPrincipalContext, "Your UserName", "Your Password", true /*Enabled or not*/); 

oUserPrincipal.UserPrincipalName = "Your UserName"; 
oUserPrincipal.GivenName = "Given Name"; 
oUserPrincipal.Surname = "Surname"; 
oUserPrincipal.Save(); 

//Add User to Group 
GroupPrincipal oGroupPrincipal = GroupPrincipal.FindByIdentity(oPrincipalContext, "Your Group Name"); 
oGroupPrincipal.Members.Add(oUserPrincipal); 
oGroupPrincipal.Save(); 

pour une implémentation complète allez ici http://anyrest.wordpress.com/2010/06/28/active-directory-c/

+0

Merci pour la réponse. Cette méthode est beaucoup plus agréable que ma requête ASDI. Malheureusement, cette méthode fonctionne sur les machines du même domaine, mais pas sur les machines non jointes. J'ai essayé de transmettre des informations d'identification dans le oPrincipalContext et d'utiliser la méthode LogonUser. Des idées? – ChrisG

+0

Désolé je ne peux pas obtenir votre réponse, voulez-vous dire que vous interrogez les utilisateurs sur la machine locale seulement avec un domaine? – Raymund

+0

Désolé. Permettez-moi de clarifier ce que je suis en train de faire: Je veux ajouter un administrateur à distance de mon bureau DESK1 (sur le domaine XDEV) à SERVER1 (pas de domaine du tout) en utilisant cette application. Je peux ajouter à n'importe quelle machine sur le même domaine que j'ai un compte administrateur. Je peux également emprunter l'identité d'un autre compte (par exemple TECHADMIN) qui est un administrateur local sur cette machine. Le problème est lorsque j'ai besoin d'ajouter un utilisateur sur une machine non-domaine à partir d'une machine sur le domaine. Je ne suis pas vraiment sûr à 100% de son possible. Je peux utiliser psexec, mais j'espérais utiliser AD directement car c'est un peu plus propre. Cela a-t-il du sens? – ChrisG