当前位置: 首页 > 编程语言 > C#

C#.NET——如何判断目录是否可写,有无UAC?

时间:2023-04-10 18:40:34 C#

C#.NET-如何确定一个目录是否可写,有或没有UAC?我正在开发一款需要将文件复制到文件系统上给定目录的软件。它需要在支持UAC的操作系统(Vista,7)和XP上工作。为了绕过写入需要UAC提升的目录,应用程序实际上启动了另一个进程,其中包含一个表明需要UAC的清单。这会生成提示,然后在用户确认时执行复制。据我所见,一个目录可以具有三种不同的逻辑权限状态——无需UAC提升可写、可通过UAC提升写入和不可写。我的问题是:对于给定的目录,我如何可靠地确定当前用户是否可以将文件复制(并可能覆盖)到该目录,如果可以,我如何确定是否需要UAC提升?在XP上,这可能就像检查是否授予“允许写入”权限一样简单,但在Vista/7上,某些目录未授予此权限,但UAC仍然可以这样做。我们有一个WriteAccess文件的方法,你可以为目录调整它(Directory.GetAccessControl等)///检查给定文件的写访问权限。//////文件名。///true,如果允许写访问,否则为falsepublicstaticboolWriteAccess(stringfileName){if((File.GetAttributes(fileName)&FileAttributes.ReadOnly)!=0)returnfalse;//获取指定文件的访问规则(可以访问该文件的用户组和用户名)varrules=File.GetAccessControl(fileName).GetAccessRules(true,true,typeof(System.Security.Principal.SecurityIdentifier));//获取当前用户的身份和用户所在的组。vargroups=WindowsIdentity.GetCurrent().Groups;字符串sidCurrentUser=WindowsIdentity.GetCurrent().User.Value;//检查是否明确拒绝此用户或用户所在的组写入文件。if(rules.OfType().Any(r=>(groups.Contains(r.IdentityReference)||r.IdentityReference.值==sidCurrentUser)&&r.AccessControlType==AccessControlType.Deny&&(r.FileSystemRights&FileSystemRights.WriteData)==FileSystemRights.WriteData))returnfalse;//检查是否允许写入returnrules.OfType().Any(r=>(groups.Contains(r.IdentityReference)||r.IdentityReference.Value==sidCurrentUser)&&r.AccessControlType==AccessControlType.Allow&&(r.FileSystemRights&FileSystemRights.WriteData)==FileSystemRights.WriteData);希望这有助于只有Writablewithoutelevation可以尝试处理。如果失败,您必须通过UAC提升区分不可写和可写,这可能很困难。我认为我不希望程序试图为我解决这个问题(因为它们不可避免地经常出错)。我认为用这些假设来设计它是安全的:综上所述,我建议尝试操作AsInvoker,如果访问被拒绝,系统将提示您解释WindowsDeniedAction,可能的原因是:文件正在使用,需要提升,需要admincredentials,andGivetheuser三个按钮:以上是C#学习教程:C#.NET-Howtodeterminatethedirectoryiswritable,withorwithoutUAC?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: