【发布时间】:2011-06-06 00:13:27
【问题描述】:
问题:
我需要检查用户(本地用户或域用户,任何一个都可以)是否具有对文件的写入权限(如果您好奇,%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;
}
}
您可以想象,Impersonator 类是一个 IDisposible,它使用本机互操作来调用 LogonUser。没有什么太有创意的了,而且很有效。
我被困在哪里:
在启用了 UAC 的 Windows 操作系统上,即使 username 指定的用户是管理员,此函数也始终返回 false。即使我的程序以管理员身份运行,我怀疑正在发生的事情是模拟代码以受限管理员身份运行。因此,该方法返回 false。
对此我没有任何创造性的解决方案。有人可以帮忙吗?
【问题讨论】:
-
如果您的代码都在一个进程中,如果它被提升,那么 UAC 就不是问题。您是否尝试过在同一台计算机上关闭 UAC 以查看它是否改变? (记住,您可能需要重新启动。)
-
@Lambert:他说他正在使用
LogonUserAPI,即returns a restricted token。当前进程是否被提升不会改变LogonUser的行为。 -
嗯...但是您是否尝试在那台计算机上完全关闭 UAC?如果程序被提升,为什么打开它会改变行为,这很奇怪......
-
@Lambert:Ben 是对的,LogonUser 给了你一个受限令牌,这就是为什么我相信我无法检查用户是否对文件有写权限(因为令牌不匹配)
-
@Bilal:即使UAC被关闭?
标签: c# security impersonation