2010-12-15 5 views
0

Ich versuche, einen lokalen Benutzeraccount auf einem verbundenen Computer ohne Domäne hinzuzufügen. Ich habe fast alles versucht, was mir einfällt. Ich arbeite an Computern in derselben Domäne, aber nicht an Off-Domain-Computern. Ich kann an diesen Server pingen und TS, aber kann nicht scheinen, einen Admin hinzuzufügen.

Ist es möglich DirectoryEntry zu verwenden, um dies zu tun?C# ActiveDirectory - Wie füge ich ein lokales Benutzerkonto remote von einem Computer mit Domänenbeitritt zu einem Computer ohne Domäne hinzu

Hier ist der Code, den ich zur Zeit habe (etwas zur besseren Lesbarkeit geändert):

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" 
    } 

Antwort

2

Sie

System.DirectoryServices.AccountManagement 

und hier achive verwenden können, dass der Code für

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

ist eine vollständige Implementierung gehen Sie hier http://anyrest.wordpress.com/2010/06/28/active-directory-c/

+0

Danke für die Antwort. Diese Methode ist viel schöner als meine ASDI-Abfrage. Leider funktioniert diese Methode auf Computern in derselben Domäne, nicht jedoch auf nicht verbundenen Computern. Ich habe versucht, Anmeldeinformationen in den oPrincipalContext übergeben sowie die LogonUser-Methode verwenden. Irgendwelche Ideen? – ChrisG

+0

Tut mir leid, ich kann Ihre Antwort nicht ganz bekommen, meinen Sie, dass Sie Benutzer auf dem lokalen Rechner nur mit einer Domain abfragen? – Raymund

+0

Entschuldigung. Lassen Sie mich klarstellen, was ich zu tun versuche: Ich möchte einen Administrator remote von meinem Desktop DESK1 (auf Domain XDEV) zu SERVER1 (überhaupt keine Domain) mit dieser App hinzufügen. Ich kann zu jeder Maschine auf der gleichen Domain hinzufügen, auf der ich ein Admin-Konto habe. Ich kann auch ein anderes Konto annehmen (zB TECHADMIN), das ein lokaler Administrator auf diesem Rechner ist. Das Problem ist, wenn ich einen Benutzer auf einem Nicht-Domänencomputer von einem Domänencomputer hinzufügen muss. Ich bin nicht wirklich 100% sicher, dass es möglich ist. Ich kann psexec verwenden, aber ich hatte gehofft, AD direkt zu verwenden, da es ein bisschen sauberer ist. Ist das sinnvoll? – ChrisG

Verwandte Themen