我正在尝试检查管理员是否具有给定文件夹的写入权限。
它适用于当前用户,但我希望此方法为管理进程提供结果,因为稍后我将从当前模式进入管理模式。只有在这个地方才需要检查。
这是我的winform应用程序的代码。
public static bool DirectoryCanCreate(string DirectoryPath)
{
if (string.IsNullOrEmpty(DirectoryPath)) return false;
try
{
FileIOPermission writePermission = new FileIOPermission(FileIOPermissionAccess.Write, DirectoryPath);
if (!SecurityManager.IsGranted(writePermission))
{
return false;
}
AuthorizationRuleCollection rules = Directory.GetAccessControl(DirectoryPath).GetAccessRules(true, true, typeof(System.Security.Principal.SecurityIdentifier));
WindowsIdentity identity = WindowsIdentity.GetCurrent();
foreach (FileSystemAccessRule rule in rules)
{
if (identity.Groups.Contains(rule.IdentityReference))
{
if ((FileSystemRights.Write & rule.FileSystemRights) == FileSystemRights.Write)
{
if (rule.AccessControlType == AccessControlType.Deny)
return false;
if (rule.AccessControlType == AccessControlType.Allow)
return true;
}
}
}
}
catch {
}
return false;
}
答案 0 :(得分:0)
您的代码当前获取当前用户身份,并仅检查该身份的权限。您应该更改它以检查其他用户的身份(某些' Admin'帐户)。您可以获得“管理员”的Identity对象。用户致电WindowsIdentity.Impersonate(IntPtr);
WindowsIdentity identity = WindowsIdentity.Impersonate(IntPtr OtherUserPtr);
但是要获取IntPtr OtherUserPtr值,您需要调用一些WinAPI代码。有关详细信息,请参阅此链接:https://msdn.microsoft.com/en-us/library/chf6fbt4(v=vs.110).aspx
或者,您可以将GetAccessRulles()
来电更改为获取typeof(System.Security.Principal.NTAccount)
,然后将字符串rule.IdentityReference.Value
与您想要的用户或群组匹配。
变化:
AuthorizationRuleCollection rules = Directory.GetAccessControl(DirectoryPath).GetAccessRules(true, true, typeof(System.Security.Principal.SecurityIdentifier));
对此:
AuthorizationRuleCollection rules = Directory.GetAccessControl(DirectoryPath).GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount));
然后在循环规则集合时不要检查:
if (identity.Groups.Contains(rule.IdentityReference))
而是检查要检查的用户NT帐户名称:
if( rule.IdentityReference.Value == @"BUILTIN\Administrators")