ERROR_ACCESS_DENIED设置文件所有者

ERROR_ACCESS_DENIED setting file owner

本文关键字:文件 所有者 设置 DENIED ACCESS ERROR      更新时间:2023-10-16

我正试图用C++编程将文件的所有者设置为另一个用户。

我肯定已经为我的流程启用了SeRestorePrivilege。我可以使用Process Explorer确认这一点。我启动进程,它被禁用,我运行代码来启用它,ProcExp将其报告为已启用,我一直到要设置所有者的点,它仍然处于启用状态(即,我没有意外禁用它)。

此访问被拒绝消息还有什么其他原因?我没有考虑过什么?

std::wstring fileSystemObject = L"C:test.txt";
*status_code = SetNamedSecurityInfo((wchar_t*)fileSystemObject.c_str(), SE_FILE_OBJECT, OWNER_SECURITY_INFORMATION, pSID, NULL, NULL, NULL);
if (*status_code == ERROR_SUCCESS)
{
    Log(L"Successfully set owner for " + fileSystemObject);
    return true;
}
else
{
    Log(L"Failed to set owner for " + fileSystemObject + L". Error code: ", *status_code);
    return false;
}

谢谢。

编辑:非常感谢您的持续帮助。非常感谢。

我将您的代码用于以下所有测试。基本上,我也从你的代码中收到了拒绝访问的消息,不过,我已经追踪了更多。

首先,"C:\test.txt"不是我真正的代码,不幸的是,缺少反斜杠并不是我问题的原因。谢谢你敏锐的眼光:)

此外,我正在运行一个禁用UAC的管理员帐户,并且我的程序在清单中设置了requireAdministrator。

但是,我注意到我的代码和您的代码都适用于简单的文件。经过大量测试,我发现我只在以下情况下收到AccessDenied消息:

1:我不是所有者,例如Everyone的"取得所有权"权限设置为Deny。

2:我是所有者,例如Everyone的"取得所有权"权限设置为Deny。奇怪的是,在第二个例子中,尽管出现了故障代码,但所有权确实发生了变化。

我不明白为什么会发生这种事。I、 和您,已在进程令牌中设置SE_RESTORE_NAME。应该允许我任意设置所有者SID。但我似乎做不到。

似乎任何对TakeOwnership DACL的拒绝都会凌驾于我取得所有权的能力之上。但是,在获得所有权之前,我不能更改权限叹气

我可能会尝试按照您最初的建议设置SeTakeOwnershipPrivilege,将所有权归自己所有,更改权限,从外部设置所有权。真痛苦。我甚至不太相信它会起作用。

我还发现:http://us.generation-nt.com/setnamedsecurityinfo-failing-rc-1307-help-59729462.html

他似乎也处于类似的情况(如果我没有正确设置流程令牌,我会得到1307)。但是CreatePrivateObjectSecurityEx需要更多的设置。

嗯。谢谢你抽出时间。

这里的问题是,安全子系统和模型保护对象不受不合理的所有权更改的影响,即使拥有管理员权限,也需要正确克服障碍。

获得文件所有权涉及两种特权:SE_TAKE_OWNERSHIP_NAMESE_RESTORE_NAME。前者允许拿走某人的物品,后者允许设置所有者而不是设置者。

看起来SE_RESTORE_NAME是一个更强大的特权,足以完成任务,但事实并非如此。是的,它允许设置某人的所有权,正如MSDN所说:

如果调用方没有SeRestorePrivilege常量(请参阅Privilege Constants),此SID必须包含在调用方的令牌,并且必须启用SE_GROUP_EOWNER权限。这个SecurityInfo参数必须包括OWNER_SECURITY_INFORMATION旗帜若要设置所有者,调用方必须具有对对象或启用SE_TAKE_OWERSHIP_NAME权限。

然而,它并不能让你克服明确阻止所有权变更的DACL项目。在这种情况下,你也需要其他特权(也就是说,你需要同时启用这两种特权),这使你能够在决定将所有权交给谁之前从某人那里获得所有权。

我正在从上面的注释中复制到C++/ATL源代码的链接:SetFileOwner.cpp。当permissions/DACL有一个Deny项时,会发生异常,启用第二特权可以解决问题。