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上错误地写下了路径。我的节目里就有。例外情况是未经授权的访问。