返回

外部驱动器 Windows 权限设置全攻略:解决访问权限被拒

windows

如何在外部驱动器上设置 Windows 权限

前言

在访问来自不同操作系统的外部驱动器时,你可能会遇到权限被拒绝的问题。本文将指导你一步步解决此问题,让你在外部驱动器上获得完全访问权限。

问题

你有一个来自运行 Windows XP 的电脑的外部驱动器。当你使用扩展坞将驱动器连接到运行 Windows 10 Professional 的笔记本电脑时,你会在尝试访问“我的文档”和“我的设置”文件夹时收到权限被拒绝的提示。

解决方法

步骤 1:检查驱动器所有者

  1. 在“此电脑”中找到外部驱动器。
  2. 右键单击驱动器并选择“属性”。
  3. 查看“常规”选项卡中的“所有者”部分,检查当前所有者是否是你。
  4. 如果所有者不是你,请单击“编辑”并授予自己所有权。

步骤 2:启用继承

  1. 在“属性”窗口中切换到“安全性”选项卡。
  2. 单击“高级”按钮。
  3. 在“高级安全设置”窗口中,切换到“继承”选项卡。
  4. 勾选“将从父容器继承的权限添加到此对象”复选框。
  5. 单击“应用”和“确定”保存更改。

步骤 3:授予自己完全控制权

  1. 在“安全性”选项卡中,单击“编辑”按钮。
  2. 在“权限”窗口中,单击“添加”按钮。
  3. 输入你的用户名并选择“完全控制”权限。
  4. 单击“确定”保存更改。

示例代码

// 以下代码演示了如何以编程方式设置权限
// 替换 driveNumber 为实际驱动器号
HANDLE hDrive = CreateFile(
    "\\\\.\\PHYSICALDRIVE" + driveNumber,
    GENERIC_READ | GENERIC_WRITE,
    FILE_SHARE_READ | FILE_SHARE_WRITE,
    NULL,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL,
    NULL
);

// 设置驱动器所有者
PACL pAcl;
DWORD dwAclSize;
if (GetFileSecurity(
    hDrive,
    OWNER_SECURITY_INFORMATION,
    NULL,
    0,
    &dwAclSize
) == ERROR_INSUFFICIENT_BUFFER) {
    pAcl = malloc(dwAclSize);

    if (!GetFileSecurity(
        hDrive,
        OWNER_SECURITY_INFORMATION,
        pAcl,
        dwAclSize,
        &dwAclSize
    )) {
        CloseHandle(hDrive);
        free(pAcl);
        return false;
    }
}

PSID pCurrentUserSid;
if (!AllocateAndInitializeSid(
    &SID_IDENTIFIER_AUTHORITY_NT,
    1,
    SECURITY_NT_AUTHORITY,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    &pCurrentUserSid
)) {
    CloseHandle(hDrive);
    free(pAcl);
    return false;
}

SetSecurityDescriptorOwner(
    pAcl,
    pCurrentUserSid,
    FALSE
);

if (!SetFileSecurity(
    hDrive,
    OWNER_SECURITY_INFORMATION,
    pAcl
)) {
    CloseHandle(hDrive);
    free(pAcl);
    free(pCurrentUserSid);
    return false;
}

// 授予自己完全控制权
// 以下代码添加一个新的 ACE,授予当前用户对驱动器的完全控制权限
EXPLICIT_ACCESS ea = {0};
ea.grfAccessPermissions = GENERIC_ALL;
ea.grfAccessMode = SET_ACCESS;
ea.grfInheritance = NO_INHERITANCE;
ea.Trustee.pMultipleTrustee = NULL;
ea.Trustee.MultipleTrusteeOperation = NO_MULTIPLE_TRUSTEE;
ea.Trustee.TrusteeForm = TRUSTEE_IS_USER;
ea.Trustee.TrusteeType = TRUSTEE_IS_NAME;
if (!GetUserName(ea.Trustee.ptstrName, &ea.Trustee.ptstrName)) {
    CloseHandle(hDrive);
    free(pAcl);
    free(pCurrentUserSid);
    return false;
}

DWORD dwNewAclSize = dwAclSize + sizeof(EXPLICIT_ACCESS);
pAcl = realloc(pAcl, dwNewAclSize);

if (!SetEntriesInAcl(1, &ea, dwAclSize / sizeof(EXPLICIT_ACCESS), pAcl)) {
    CloseHandle(hDrive);
    free(pAcl);
    free(pCurrentUserSid);
    return false;
}

if (!SetFileSecurity(
    hDrive,
    DACL_SECURITY_INFORMATION,
    pAcl
)) {
    CloseHandle(hDrive);
    free(pAcl);
    free(pCurrentUserSid);
    return false;
}

CloseHandle(hDrive);
free(pAcl);
free(pCurrentUserSid);

结论

通过按照上述步骤操作,你可以授予自己外部驱动器上所有文件夹和文件访问权限。现在,你可以轻松访问和管理驱动器上的内容,无需担心权限问题。

常见问题解答

  1. 为什么我会收到权限被拒绝的提示?

    • 这是因为外部驱动器可能来自不同的操作系统,并且其权限设置与你的当前操作系统不兼容。
  2. 我可以在不授予自己所有权的情况下更改权限吗?

    • 通常情况下,你需要具有驱动器的所有权才能更改权限。
  3. 授予自己完全控制权是否安全?

    • 是的,如果你有必要完全访问外部驱动器上的所有内容,授予自己完全控制权是安全的。
  4. 是否可以使用命令行来设置权限?

    • 是的,你可以使用 Windows PowerShell 或命令提示符来设置权限。
  5. 如果上述步骤不起作用,我该怎么办?

    • 请检查你是否按照所有步骤操作,并确保你拥有外部驱动器的所有权。如果问题仍然存在,你可能需要联系 Windows 支持。