Comment créer par programme des comptes d’utilisateurs Windows sur Windows 7 ou Windows Server 2008?

J’ai essayé de créer de nouveaux comptes d’utilisateurs locaux sur un ordinateur Windows 7. J’ai utilisé la classe System.DirectoryServices.DirectoryEntry (comme ici ), mais cela ne semble pas fonctionner.

Voici le code dans l’article:

static void Main(ssortingng[] args) { try { DirectoryEntry AD = new DirectoryEntry("WinNT://" + Environment.MachineName + ",computer"); DirectoryEntry NewUser = AD.Children.Add("TestUser1", "user"); NewUser.Invoke("SetPassword", new object[] {"#12345Abc"}); NewUser.Invoke("Put", new object[] {"Description", "Test User from .NET"}); NewUser.CommitChanges(); DirectoryEntry grp; grp = AD.Children.Find("Guests", "group"); if (grp != null) {grp.Invoke("Add", new object[] {NewUser.Path.ToSsortingng()});} Console.WriteLine("Account Created Successfully"); Console.ReadLine(); } catch (Exception ex) { Console.WriteLine(ex.Message); Console.ReadLine(); } } 

Lors de l’exécution de cette ligne

DirectoryEntry NewUser = AD.Children.Add("TestUser1", "user");

J’ai un

System.Runtime.InteropServices.COMException avec ” {"Unknown error (0x80005000)"}

comme message d’exception et -2147463168 comme code d’erreur.

Je suppose que cela est probablement dû au fait que l’article cible Windows XP et les ordinateurs inférieurs, et je cible Windows 7 et Windows Server 2008.

Toute aide appréciée!

Mettre à jour:
Pour une raison mystérieuse, je ne vois plus cette System.Runtime.InteropServices.COMException , cependant, lorsque je newuser.CommitChanges() les modifications ici newuser.CommitChanges() , je reçois une ” UnAuthorizedAccessException “. J’ai essayé d’exécuter l’application en tant qu’administrateur, mais je ne travaille toujours pas.

Mise à jour 2:
OK, après être passé à la classe UserPrincipal, le code suivant a fonctionné:

 public UserPrincipal CreateNewUser(ssortingng sUserName, ssortingng sPassword) { // first check that the user doesn't exist if (GetUser(sUserName) == null) { PrincipalContext oPrincipalContext = GetPrincipalContext(); UserPrincipal oUserPrincipal = new UserPrincipal(oPrincipalContext); oUserPrincipal.Name = sUserName; oUserPrincipal.SetPassword(sPassword); //User Log on Name //oUserPrincipal.UserPrincipalName = sUserName; oUserPrincipal.Save(); return oUserPrincipal; } // if it already exists, return the old user return GetUser(sUserName); } } 

Ce code fonctionne bien lorsque je l’exécute en tant qu’application de console, bien sûr exécutée en tant qu’administrateur, mais lorsque je l’ai déployé en tant que service Windows, avec le compte de sécurité défini sur “LocalSystem”, je reçois une InvlaidOperationException disant “Le magasin sous-jacent ne soutenir cette propriété ”

Pensées?

OK, si vous vérifiez ma dernière mise à jour, l’extrait suivant a fonctionné:

 public UserPrincipal CreateNewUser(ssortingng sUserName, ssortingng sPassword) { // first check that the user doesn't exist if (GetUser(sUserName) == null) { PrincipalContext oPrincipalContext = GetPrincipalContext(); UserPrincipal oUserPrincipal = new UserPrincipal(oPrincipalContext); oUserPrincipal.Name = sUserName; oUserPrincipal.SetPassword(sPassword); //User Log on Name //oUserPrincipal.UserPrincipalName = sUserName; oUserPrincipal.Save(); return oUserPrincipal; } // if it already exists, return the old user return GetUser(sUserName); } } 

Cela fonctionnait comme une application de console, mais son exécution a échoué à cause d’exceptions de sécurité lors du déploiement en tant que service Windows. Une solution consiste à faire confiance à cet assembly (l’assembly de service Windows) pour que la sécurité .net le laisse s’exécuter. C’est fait, maintenant tout est cool!

Vous devez préfixer votre nom d’utilisateur avec CN =, comme suit:

DirectoryEntry NewUser = AD.Children.Add("CN=TestUser1", "user");