Вот так вроде как получается то, что надо
class NetDirectorySecurity : NativeObjectSecurity
{
public NetDirectorySecurity(string ResName, AccessControlSections IncludeSections)
: base(true, ResourceType.LMShare, ResName, IncludeSections)
{
}
private static FileSystemRights RightsFromAccessMask(int accessMask)
{
return (FileSystemRights)accessMask;
}
public sealed override AccessRule AccessRuleFactory(IdentityReference identityReference, int accessMask,
bool isInherited, InheritanceFlags inheritanceFlags, PropagationFlags propagationFlags, AccessControlType type)
{
return new FileSystemAccessRule(identityReference, RightsFromAccessMask(accessMask), inheritanceFlags, propagationFlags, type);
}
public sealed override AuditRule AuditRuleFactory(IdentityReference identityReference, int accessMask,
bool isInherited, InheritanceFlags inheritanceFlags, PropagationFlags propagationFlags, AuditFlags flags)
{
return new FileSystemAuditRule(identityReference, RightsFromAccessMask(accessMask), inheritanceFlags, propagationFlags, flags);
}
public override Type AccessRightType { get { return typeof(FileSystemRights); } }
public override Type AccessRuleType { get {return typeof(FileSystemAccessRule); } }
public override Type AuditRuleType { get { return typeof(FileSystemAuditRule); } }
}
// Программа
string NetDirName = @"\\ServerName\ShareName";
AuthorizationRuleCollection Rules = null;
try
{
NetDirectorySecurity NDS = new NetDirectorySecurity(NetDirName, AccessControlSections.Access);
Rules = NDS.GetAccessRules(true, true, typeof(SecurityIdentifier));
}
catch(UnauthorizedAccessException E)
{
Console.WriteLine("Exception: {0}\n", E.Message);
}
catch(Exception E)
{
Console.WriteLine("Exception: {0}\nMessage: {1}\n", E.GetType().Name, E.Message);
}
if (Rules != null)
{
Console.WriteLine("OK");
foreach (FileSystemAccessRule AR in Rules)
{
IdentityReference IR = AR.IdentityReference;
IdentityReference Account = IR.Translate(typeof(NTAccount));
Console.WriteLine(IR.Value);
Console.WriteLine(Account.Value + "\n");
IR = null;
Account = null;
}
}
Но ввиду полного отсутсвия опыта в NET, я не знаю, насколько это правильно.