这个SeBackupPrivilege(备份模式)实现有什么问题?

lla*_*oo7 2 c# winapi elevated-privileges

(背景资料:随意跳到最后一段)

目前,我有一个硬盘驱动器,它是来自另一台计算机的O/S驱动器的完整映像.它是一个外部USB驱动器,连接到写入阻止器,然后连接到我的计算机.我正在使用它来测试我用于复制文件的代码(以及其他内容),并且我遇到了一个无法仅使用管理员权限复制的文件.

在阅读了Windows中的权限后,我确定需要备份权限才能访问本地驱动器上的所有文件.我已经通过使用带有"/ b"标志的robocopy验证了这是我需要的,它为副本启用了备份模式.一切都复制得很好没有问题.我只需要能够让我自己的代码能够在备份权限下运行.

在我的代码(C#)中,我尝试实现必要的winapi调用(AdjustTokenPrivileges),以便为当前的进程备份特权提供未验证的结果.我使用了本文中的一些代码(http://www.codeproject.com/Articles/21202/Reparse-Points-in-Vista)来使用已知的"工作"实现.在代码项目中,我尝试添加一个带有"拒绝访问"错误的File.Copy().我也尝试使用winapi调用CopyFileW()同样的错误.在这一点上,我没有想法:(.

作为参考(来自文章),这是我用于特权升级的代码:

bool success;
IntPtr token;
TOKEN_PRIVILEGES tokenPrivileges = new TOKEN_PRIVILEGES();
tokenPrivileges.Privileges = new LUID_AND_ATTRIBUTES[1];
success = OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, 
                           out token);
if (success)
{
    // null for local system

    success = LookupPrivilegeValue(null, SE_BACKUP_NAME, 
                                   out tokenPrivileges.Privileges[0].Luid);
    if (success)
    {
        tokenPrivileges.PrivilegeCount = 1;
        tokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
        success = AdjustTokenPrivileges(
            token,
            false,
            ref tokenPrivileges,
            Marshal.SizeOf(tokenPrivileges),
            IntPtr.Zero,
            IntPtr.Zero);
    }
    CloseHandle(token);
}
Run Code Online (Sandbox Code Playgroud)

编辑:要添加更多信息,如果我按原样运行项目,链接的ReparsePoint代码就可以正常工作.当我删除调用AdjustTokenPrivilege时,它会抛出"拒绝访问"错误.

Gab*_*abe 5

您仍然需要CreateFile使用FILE_FLAG_BACKUP_SEMANTICS指定的标志进行调用.这意味着您无法使用标准Windows API,因为它们未指定该标志.