C#:检查管理员是否具有对文件的写入权限
问题: 我需要检查用户(本地用户或域用户,两者都有可能)是否具有文件的写入权限(如果您好奇,C#:检查管理员是否具有对文件的写入权限,c#,security,impersonation,C#,Security,Impersonation,问题: 我需要检查用户(本地用户或域用户,两者都有可能)是否具有文件的写入权限(如果您好奇,%windir%\system32\inetsrv\config\applicationHost.config。此文件受Windows保护,您需要是管理员才能对其进行写入。) 我的解决方案: 一般结构是: using (Impersonator impersonator = new Impersonator(domain, username, password)) { try { using (F
%windir%\system32\inetsrv\config\applicationHost.config
。此文件受Windows保护,您需要是管理员才能对其进行写入。)
我的解决方案:
一般结构是:
using (Impersonator impersonator = new Impersonator(domain, username, password))
{
try
{
using (FileStream fs = File.OpenWrite(appHostConfigPath))
{
return true;
}
catch
{
return false;
}
}
可以想象,模拟器类是一个IDisPoble,它使用本机互操作调用LogonUser。没什么太有创意的,而且很管用
我被困的地方:
在启用UAC的Windows OSs上,即使用户名指定的用户是管理员,此函数始终返回false
。尽管我的程序以管理员身份运行,但我怀疑发生的情况是模拟代码以有限管理员身份运行。因此,该方法返回false
我没有任何创造性的解决办法。有人能帮忙吗?你能看看例外情况吗?它是否具有权限或“文件未找到异常”? 因为在Windows7上它是 %windir%\System32\inetsrv\config\applicationHost.config Windows Vista也可能如此。和如何
第二个链接中有一个示例,它实际上相当完整(在C++中)。如果您的代码都在一个进程中,如果它被提升,那么UAC就不是问题所在。您是否尝试过在同一台计算机上关闭UAC以查看它是否发生变化?(你可能需要重新启动,记住。)@Lambert:他说他正在使用
LogonUser
API,这是一个很好的例子。当前进程是否提升不会改变LogonUser
的行为。。。但你有没有试着在那台电脑上完全关闭UAC?奇怪的是,如果程序被提升,为什么打开它会改变行为…@Lambert:Ben是对的,LogonUser给了你一个受限令牌,这就是为什么我认为我无法检查用户是否有文件的写入权限(因为令牌不匹配)@Bilal:即使UAC被关闭?谢谢Vijay,我只是在stackoverflow上错误地写下了路径。我的节目里就有。例外情况是未经授权的访问。