J'utilise DirectoryServices et le fournisseur WinNT: // pour me connecter à un ordinateur distant. Je vérifie ensuite certaines informations d'appartenance à un groupe et éventuellement j'ajoute ou supprime un utilisateur de domaine d'un groupe local spécifié.Connexion à un ordinateur distant à l'aide de WinNT: // Fournisseur et services d'annuaire Ignore le nom d'utilisateur/mot de passe
J'ai pu faire fonctionner tout ce code sans problème en utilisant une application de console vb.net et en communiquant avec ma boîte locale, ou avec n'importe quelle boîte où le compte auquel je suis connecté dispose de droits administratifs.
code:
string strUserPath = "WinNT://DomainName/someuser,user";
DirectoryEntry deComputer = new DirectoryEntry("WinNT://" + Computername + ",computer");
deComputer.RefreshCache();
DirectoryEntry deGroup = deComputer.Children.Find("administrators", "group");
IEnumerable members = deGroup.Invoke("members", null);
List<DirectoryEntry> r = new List<DirectoryEntry>();
foreach (object o in members)
{
DirectoryEntry deMember = new DirectoryEntry(o);
r.Add(deMember);
}
deGroup.Invoke("Add", strUserPath);
deGroup.CommitChanges();
deGroup.Invoke("Remove", strUserPath);
deGroup.CommitChanges();
Je déplacé le code à une application web ASP.Net, qui usurpe l'identité d'un compte de service dans la section Impersonate de web.config. Le compte que je suis se faisant passer pour ne pas les droits d'administrateur sur l'un des postes de travail, donc je mets un nom d'utilisateur/mot de passe dans le constructeur pour l'entrée d'ordinateur comme ceci:
DirectoryEntry deComputer = new DirectoryEntry("WinNT://" + Computername + ",computer", username, password);
Le nom d'utilisateur est celui d'un compte de domaine qui a droits d'administration locaux sur chaque poste de travail. Si je regarde la propriété Username de l'objet deComputer résultant, je peux voir que le nom d'utilisateur correspond à ce que j'ai entré. De plus, si je saisis un mot de passe invalide, une erreur se produit, de sorte qu'il s'authentifie d'une manière ou d'une autre.
Toutefois, si j'essaie maintenant d'ajouter ou de supprimer un utilisateur d'un poste de travail distant, j'obtiens une erreur d'accès général refusée. Si j'ajoute le compte de service qu'ASP.Net utilise en tant qu'administrateur local sur ce poste de travail, il ajoutera et supprimera aucun problème. J'ai ensuite essayé d'utiliser LogonAPI (appel advapi32.dll -> LogonUser) pour me connecter en tant que compte utilisateur administrateur local sur toutes les stations de travail, usurpé l'identité WindowsIdentitiy résultante et essayé d'exécuter l'instanciation deComputer d'origine. Quand je fais ceci chaque propriété, sauf le chemin, renvoie une exception OLE ...
Je suis assez perdu ici sur ce qu'il faut essayer ensuite. Toute aide serait grandement appréciée.
--Workaround--
Pour contourner le problème que nous avons créé un service Windows qui fonctionne sous le compte administrateur local et n'a donc pas eu de problèmes en cours d'exécution du code. Nous poussons toutes nos mises à jour vers une table dans une base de données SQL et le service les récupère et les traite. MAIS, je voudrais vraiment vraiment savoir pourquoi cela ne fonctionne pas, et ce serait bien de pousser les mises à jour directement à partir du site Web.
J'ai essayé AuthenticationTypes.Secure, mais sans succès. J'ai lu les descriptions principales sur MSDN et il ne semble pas que WNetAddConnection2 et NetUseAdd fonctionneront pour toutes les situations. Aussi, comment pourrais-je les utiliser avec un DirectoryEntry? Je n'ai pas vu de manière simple dans l'article MSDN, pas comme c'est facile quand vous utilisez Logonuser. – Peter
La fonction 'LogonUser' permet une connexion locale, mais vous devez avoir une connexion à distance. Si vous voulez, par exemple, accéder à une banque avec HTTPS, vous ne pouvez pas passer un appel à "LogonUser" avec votre compte bancaire, mais vous vous connectez uniquement à distance sur l'ordinateur de destination. La même chose fonctionne ici. Si l'ordinateur de destination n'a pas confiance à l'ordinateur source ou si vous essayez de vous connecter avec un compte d'utilisateur existant (localement) uniquement sur l'ordinateur de destination "LogonUser" avec emprunt d'identité CAN NOT WORK! Vous pouvez utiliser 'WNetAddConnection2' ou' NetUseAdd' sans aucun problème. – Oleg
Si vous établissez une connexion à un ordinateur de destination en respectant 'WNetAddConnection2' ou' NetUseAdd', il sera utilisé pour d'autres tentatives d'accès à l'ordinateur distant. Aussi 'DirectoryEntry' avec le fournisseur' WinNT' l'utilisera. Pour vous déconnecter, vous pouvez utiliser 'WNetCancelConnection2' ou' NetUseDel'. Vous trouverez d'autres explications sous http://stackoverflow.com/questions/3282927/manage-remote-service-using-alternate-credentials/3348967#3348967. Je vous recommande d'essayer 'WNetAddConnection2' et' WNetCancelConnection2' et vous verrez qu'ils font exactement ce dont vous avez besoin. – Oleg