2010-12-15 138 views
4

Je parcourt un répertoire réseau et tente de générer les noms d'utilisateur/groupe (autorisations) associés à chaque fichier/dossier. Je récupère le SID mais je veux que les noms comme "group_test" et non "S-1-5-32-544". Voici mon code -Convertir les SID en noms d'utilisateur/groupes?

var files = Directory.GetFiles(path, "*.*", SearchOption.TopDirectoryOnly); 

       foreach (var f in files2) 
       { 
        var fileInfo = new FileInfo(f); 
        var fs = fileInfo.GetAccessControl(AccessControlSections.Access); 

        foreach (FileSystemAccessRule rule in fs.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount))) 
        { 
         var value = rule.IdentityReference.Value; 
         Response.Write(string.Format("File: {0} \t Usergroup: {1} <br/>", fileInfo.Name, value)); 
        } } 

Je reçois SID du code ci-dessus mais dans la boucle foreach, si j'utilise cette place -

(NTAccount)((SecurityIdentifier)rule.IdentityReference).Translate(typeof(NTAccount)).Value 

Je reçois cette exception - Some or all identity references could not be translated.

Il apparaît que la méthode Translate ne fonctionne pas sur les partages distants. Comment puis-je récupérer les vrais noms des SID? Le serveur distant n'a pas LDAP.

Merci.

Répondre

3

Le problème est que vous essayez de résoudre un SID qui est locale à une machine distante. Comme la réponse à this question états:

L'objet SecurityReference de méthode Traduisez fonctionne sur le SMSN non locales, mais uniquement pour les comptes de domaine ...

Ce link fournit un exemple pour résoudre à distance un SID en utilisant WMI qui est probablement la meilleure méthode pour accomplir votre tâche.

0

Si vous pouvez utiliser WMI, vous devriez pouvoir le faire via la classe Win32_UserAccount je pense. Il a une propriété Name et une propriété SID. La classe Win32_Group pour les groupes.

Voici un article pour se connecter à un ordinateur distant en utilisant WMI qui a le code C#: How To: Connect to a Remote Computer