Énumérer les Fenêtres membres du groupe d'utilisateurs sur un système distant à l'aide de c#
Dans c#, j'ai besoin d'être en mesure de
- Connecter à un système distant, en précisant le nom d'utilisateur/mot de passe approprié
- Liste des membres d'une localgroup sur ce système
- Aller chercher les résultats à l'exécution de l'ordinateur
Ainsi, par exemple, je voudrais connecter à \SOMESYSTEM appropriés creds, et de récupérer une liste des administrateurs locaux, y compris SOMESYSTEM\Administrateur, SOMESYSTEM\Bob, DOMAINE\AlanH, "DOMAINE\Administrateurs de Domaine".
J'ai essayé ce système.directoryservices.accountmanagement mais je suis en cours d'exécution dans les problèmes d'authentification. J'ai parfois l':
Plusieurs connexions à un serveur ou à une ressource partagée par le même utilisateur, en utilisant plus d'un nom d'utilisateur, ne sont pas autorisés. Débranchez toutes les connexions précédentes au serveur ou à une ressource partagée et essayez de nouveau. (Exception de HRESULT: 0x800704C3)
Ci-dessus est d'essayer, car il y aura des situations où j'ai simplement ne peut pas annuler le mappage des lecteurs existants ou les connexions UNC.
D'autres fois mon programme obtient une ERREUR INCONNUE et le journal de sécurité sur le système distant signale une erreur 675, code 0x19 qui est KDC_ERR_PREAUTH_REQUIRED.
J'ai besoin d'un moyen plus simple et moins sujette aux erreurs de chemin à faire!
OriginalL'auteur quux | 2008-08-22
Vous devez vous connecter pour publier un commentaire.
Ce devrait être facile à faire à l'aide de WMI. Ici vous avez un pointeur vers la doc:
WMI Documentation pour Win32_UserAccount
Même si vous n'avez aucune expérience précédente avec WMI, il devrait être assez facile de transformer un Script VB code au bas de la page dans quelques .NET code.
Espère que cela a aidé!
OriginalL'auteur dguaraglia
davidg était sur la bonne voie, et je suis à lui créditer avec la réponse.
Mais la requête WMI nécessaire a été un peu moins simple, car je ne voulais pas juste une liste d'utilisateurs pour l'ensemble de la machine, mais le sous-ensemble d'utilisateurs et les groupes, qu'il soit local ou de domaine, qui sont membres du groupe Administrateurs local. Pour la petite histoire, cette requête WMI a été:
Voici le code complet extrait:
Donc, si j'invoque Groupmembers("Serveur1", "Administrateurs", "myusername", "mypassword"); - je obtenir une seule chaîne de caractères retournée avec:
SERVEUR1\Administrateur
MYDOMAIN\Admins du Domaine
Le réel WMI retour est plus comme ceci:
\\SERVEUR1\root\cimv2:Win32_UserAccount.Domain="SERVEUR1",Nom="Administrateur"
... donc, comme vous pouvez le voir, j'ai dû faire un peu de manipulation de chaîne pour c'est joli.
OriginalL'auteur quux
Je vous conseille d'utiliser la fonction API Win32 NetLocalGroupGetMembers. Il est beaucoup plus simple que d'essayer de comprendre le fou de syntaxe LDAP, ce qui est nécessaire pour certains de l'autre des solutions recommandées ici. Tant que vous emprunter l'identité de l'utilisateur que vous souhaitez exécuter la vérification par l'appel de "LoginUser", vous ne devriez pas courir dans toutes les questions de sécurité.
Vous pouvez trouver un exemple de code pour faire de l'usurpation d'identité ici.
Si vous avez besoin d'aide pour comprendre comment l'appeler la "NetLocalGroupGetMembers" à partir de C#, je recommande que vous la caisse Jared Parson PInvoke assistant, vous pouvez télécharger de codeplex.
Si vous exécutez le code dans un ASP.NET une application qui s'exécute dans IIS, et que vous voulez emprunter l'identité de l'utilisateur qui accède au site web afin de faire l'appel, alors vous pouvez avoir besoin de subvention "Approuvé pour la Délégation" autorisation pour le serveur web de production.
Si vous êtes en cours d'exécution sur le bureau, puis à l'aide active de l'utilisateur informations d'identification de sécurité ne devrait pas être un problème.
Il est possible que l'administrateur réseau peut avoir révoqué l'accès à la "Objet Sécurisable" pour la machine à laquelle vous tentez d'accéder. Malheureusement, l'accès est nécessaire pour tous les réseau de gestion des api fonctions de travail. Si c'est le cas, alors vous aurez besoin d'accorder l'accès à la "Objet Sécurisable" pour ce que les utilisateurs que vous souhaitez exécuter en tant que. Avec la valeur par défaut de windows paramètres de sécurité de tous les utilisateurs authentifiés doivent avoir accès, cependant.
J'espère que cette aide.
-Scott
OriginalL'auteur Scott Wisniewski
Vous devriez être en mesure de le faire avec le Système.DirectoryServices.DirectoryEntry. Si vous rencontrez des difficultés à exécuter à distance, vous pourriez peut-être installer quelque chose sur les machines distantes pour vous donner à vos données via une sorte de RPC, à l'instar de l'accès distant ou un service web. Mais je pense que ce que vous essayez devrait être possible à distance, sans trop de fantaisie.
OriginalL'auteur Eric Z Beard
Si Windows ne les laissez pas vous connecter par le biais d'un mécanisme de connexion, je pense que votre seule option est de lancer quelque chose sur la machine distante avec un port ouvert (directement ou via l'accès distant ou un service web, comme mentionné).
OriginalL'auteur Nick