gpt4 book ai didi

c++ - 删除每个 API 调用都失败并显示 ERROR_ACCESS_DENIED 的文件夹

转载 作者:太空狗 更新时间:2023-10-29 23:49:07 28 4
gpt4 key购买 nike

我用CreateDirectoryW 创建了一个文件夹我无法访问它。我使用 nullptr 作为安全描述符,但出于某种原因它没有复制父文件夹的 ACL,而是使文件夹不可访问。

我无法查看或更改所有者。 takeown , icacls , SetNamedSecurityInfoW ,全部来自提升的进程或命令提示符,失败并返回 ERROR_ACCESS_DENIED

在尝试希望不关心 ACL 的 Linux live CD 之前,我是否有机会在 Windows(Shell 或 C++)中删除此文件夹?

最佳答案

您只需要启用备份(或恢复)权限:

#include <Windows.h>

#include <stdio.h>

int wmain(int argc, wchar_t ** argv)
{
// argv[1] must contain the directory to remove

HANDLE hToken;
struct
{
DWORD PrivilegeCount;
LUID_AND_ATTRIBUTES Privileges[1];
} tkp;

if (OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
{
LookupPrivilegeValue(NULL, SE_BACKUP_NAME, &tkp.Privileges[0].Luid);

tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

if (!AdjustTokenPrivileges(hToken, FALSE,
(PTOKEN_PRIVILEGES)&tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0))
{
printf("AdjustTokenPrivileges: %u\n", GetLastError());
return 1;
}

if (GetLastError() != ERROR_SUCCESS)
{
// This happens if you don't have the privilege
printf("AdjustTokenPrivileges: %u\n", GetLastError());
return 1;
}

CloseHandle(hToken);
}

if (!RemoveDirectory(argv[1]))
{
printf("RemoveDirectory: %u\n", GetLastError());
return 1;
}

printf("OK\n");
return 0;
}

请注意,为了简洁起见,省略了一些错误处理。另请注意,AdjustTokenPrivileges() 是为数不多的特殊情况之一,即使调用成功,调用 GetLastError() 也是有意义的;它将返回 ERROR_SUCCESSERROR_NOT_ALL_ASSIGNED,具体取决于您是否真的拥有您尝试启用的所有权限。

这是绕过文件安全权限的相当通用的解决方案。它适用于大多数 API 调用,尽管在某些情况下(最明显的是 CreateFile)您必须提供一个特殊标志才能使用备份权限。除了删除您无权访问的文件或目录外,您还可以更改属性、更改权限,甚至将所有权分配给其他人,这是不允许的。

关于c++ - 删除每个 API 调用都失败并显示 ERROR_ACCESS_DENIED 的文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46473507/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com