我在我的应用程序的对话框中有以下方法,用于确定用户是否具有对文件夹的写入权限:
private bool UserCanWriteToFolder( FileSystemNode node ) {
try {
WindowsIdentity currentUser = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal( currentUser );
DirectoryInfo directoryInfo = new DirectoryInfo( node.FullPath );
DirectorySecurity acl = directoryInfo.GetAccessControl( AccessControlSections.All );
AuthorizationRuleCollection rules = acl.GetAccessRules( true, true, typeof( NTAccount ) );
foreach ( AuthorizationRule rule in rules ) {
FileSystemAccessRule fsAccessRule = rule as FileSystemAccessRule;
if ( fsAccessRule == null )
continue;
if ( ( fsAccessRule.FileSystemRights & FileSystemRights.WriteData ) > 0 ) {
NTAccount ntAccount = rule.IdentityReference as NTAccount;
if ( ntAccount == null )
continue;
if ( principal.IsInRole( ntAccount.Value ) )
return true;
}
}
} catch ( Exception ) {
return false;
}
return false;
}
这种逻辑有效,但存在问题。
我的用户位于Administrators组中。当我选择C:\ Windows文件夹时,此方法返回true,但是,当我的程序尝试写入C:\ Windows文件夹时,程序将抛出UnauthorizedAccessException。显然,我的代码没有考虑到该文件夹的不同之处。
这是我机器上C:\ Windows文件夹的iacls输出:
C:\Windows NT SERVICE\TrustedInstaller:(F)
NT SERVICE\TrustedInstaller:(CI)(IO)(F)
NT AUTHORITY\SYSTEM:(M)
NT AUTHORITY\SYSTEM:(OI)(CI)(IO)(F)
BUILTIN\Administrators:(M)
BUILTIN\Administrators:(OI)(CI)(IO)(F)
BUILTIN\Users:(RX)
BUILTIN\Users:(OI)(CI)(IO)(GR,GE)
CREATOR OWNER:(OI)(CI)(IO)(F)
APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES:(RX)
APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES:(OI)(CI)(IO)(GR,GE)
Successfully processed 1 files; Failed processing 0 files
不幸的是,我不知道ACL中的哪一行是导致引发UnauthorizedAccessException的行。有人可以向我指出问题吗?
答案 0 :(得分:0)
我决定放弃上面的代码。当我以普通用户身份启动程序时,检索ACL的行会抛出PrivilegeNotHeldException
。具体来说,消息文本为
该流程不具备“SeSecurityPrivilege”'此操作所需的权限。
此时,我要做的是尝试在所选文件夹中创建一个临时文件。如果成功,我将删除它并返回true。如果失败(抛出异常),我将返回false。在任何情况下,我都必须捕获实际写入文件夹时出现的任何异常,并显示有用的错误消息,因为正如评论中所述,安全性可能会在此方法退出和执行写入之间发生变化。 / p>