【问题标题】:Program running as admin can't access some paths以管理员身份运行的程序无法访问某些路径
【发布时间】:2014-11-26 15:24:50
【问题描述】:

我正在创建一个 C# 程序来检查所有 .exe 文件的签名并进行一些其他检查。应用程序请求以管理员身份使用 UAC 运行,并在启动时对其进行检查(我们确定以管理员权限运行)。

但是,当我递归检查某些路径时,我得到了我无权访问的文件夹。例如:

DirectoryInfo dir = new DirectoryInfo(System.Environment.GetFolderPath(System.Environment.SpecialFolder.CommonApplicationData));
FileInfo[] files = dir.GetFiles("*.exe", SearchOption.AllDirectories);

正在投掷:

 System.UnauthorizedAccessException: Access to the path 'C:\ProgramData\Application Data' is denied.
   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.FileSystemEnumerableIterator`1.AddSearchableDirsToStack(SearchData localSearchData)
   at System.IO.FileSystemEnumerableIterator`1.MoveNext()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.IO.DirectoryInfo.InternalGetFiles(String searchPattern, SearchOption searchOption)
   at "the lines above"

有没有办法访问这些路径?万一这不可能,GetFiles 跳过这些路径而不停止的方法也非常感谢。

【问题讨论】:

  • 你能给我一个文件夹的例子吗?我想看看这个文件夹的权限。
  • C:\ProgramData\Application Data 在异常消息中
  • 它在异常中,例如'C:\ProgramData\Application Data'。 PC是标准的Win 7
  • 在此站点中搜索[c#] System.UnauthorizedAccessException。这个问题已经在这里被问过(并回答过)很多次了。
  • 我的意思是使用 Directory.GetAccessControl 方法返回目录的 Windows 访问控制列表 (ACL)。 msdn.microsoft.com/en-us/library/…

标签: c# .net winapi unauthorizedaccessexcepti


【解决方案1】:

仅仅因为您是管理员并不意味着您可以访问所有内容!
例如。管理员“默认”也无法访问用户的个人文件夹,但作为管理员,您可以“赋予自己该权利”。

因此,要么更改所有此类文件夹的权限,要么忽略此类文件夹。

更新:

如果不可能,GetFiles 跳过这些路径而不停止的方法也非常感谢。

您可以选择“每个文件夹”的递归扫描(IMO 无论如何都应该这样做):

public void Scan(DirectoryInfo dir = null)
{
    if (dir == null)
    {
        dir = new DirectoryInfo(System.Environment
              .GetFolderPath(System.Environment.SpecialFolder.CommonApplicationData));
    }

    try
    {
        var dirs = dir.GetDirectories();
        foreach (var subDir in dirs)
            Scan(subDir);

        var files = dir.GetFiles("*.exe", SearchOption.TopDirectoryOnly);
        foreach (var file in files)
            // check file
    }
    catch(UnauthorizedAccessException)
    {
        // log error
    }
}

【讨论】:

  • 这不是个人文件夹...有什么方法可以通过编程方式完成并稍后恢复?
  • "个人文件夹" 只是一个示例 - 重要的事实是即使您是管理员也很有可能无法访问文件夹。只需打开此类文件夹的属性对话框并检查安全选项卡中Administrator 组的权限...
  • 抱歉,但这不是一个解决方案,因为我需要在多台 PC 中为多条路径运行它,并且应该以编程方式完成。有什么方法可以让 GetFiles 跳过这些路径?
  • 谢谢!这将很有用:)
  • 另一个选项是打开备份权限。这基本上告诉 Windows 停止检查安全权限。在某些情况下,您还必须将特殊标志传递给 API 函数,但不是用于目录枚举。
【解决方案2】:

您是否尝试过对您尝试通过命令提示符访问的文件添加读/写权限?

如果您只需要临时访问此文件,最好在完成读/写后删除权限,否则,我会考虑授予某些用户权限,而不是修改文件系统中的权限。无论哪种方式都有效,具体取决于您的目标。

http://support.microsoft.com/kb/308419

【讨论】:

    猜你喜欢
    • 2017-05-19
    • 1970-01-01
    • 2016-02-07
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    相关资源
    最近更新 更多