2

(背景信息:随意跳到最后一段)

目前,我有一个硬盘驱动器,它是另一台计算机上的 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);
}

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

4

1 回答 1

5

您仍然必须CreateFile使用指定的FILE_FLAG_BACKUP_SEMANTICS标志进行调用。这意味着您不能使用标准的 Windows API,因为它们没有指定该标志。

于 2012-06-20T12:50:56.523 回答