C++ 设置文件所有者时出错\u访问\u被拒绝

C++ 设置文件所有者时出错\u访问\u被拒绝,c++,winapi,ntfs,file-security,C++,Winapi,Ntfs,File Security,我试图用C++编程将文件的所有者设置为另一个用户。 我已经为我的流程启用了SeRestorePrivilege。我可以使用Process Explorer确认这一点。我启动该进程,它被禁用,我运行代码来启用它,ProcExp将其报告为已启用,我只到达要设置所有者的点,但它仍然处于启用状态(即,我没有意外地禁用它) 此访问被拒绝消息可能还有什么其他原因?我没有考虑什么 std::wstring fileSystemObject = L"C:\test.txt"; *status_code = Se

我试图用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:我不是所有者,并且“获取所有权”权限设置为拒绝,例如,所有人

2:我是所有者,并且“获取所有权”权限设置为拒绝,例如对所有人。奇怪的是,在第二种情况下,尽管出现了故障代码,所有权确实发生了变化

我不明白为什么会这样。一、 您已经在进程令牌中设置了SE_RESTORE_NAME。应该允许我任意设置所有者SID。但似乎我不能

似乎任何对收购DACL的否认都会凌驾于我获得所有权的能力之上。但是,在获得所有权之前,我无法更改权限!唉

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

我还发现:

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


嗯。感谢您的时间。

这里的问题是,安全子系统和模型正在保护对象免受不合理的所有权更改,甚至拥有正确克服障碍所需的管理员权限

获取文件所有权涉及两种特权:
SE\u TAKE\u ownership\u NAME
SE\u RESTORE\u NAME
。前者允许拿走某人的物品,而后者允许设置所有者,而不是设置者本人

它可能看起来像是
SE_RESTORE_NAME
是一个更强大的特权,对于任务来说已经足够了,但是它似乎不是。是的,它允许设置某人的所有权:

如果调用方没有SeRestorePrivilege常量(请参阅 特权常量),此SID必须包含在调用方的 令牌,并且必须启用SE_组所有者权限。这个 SecurityInfo参数必须包括所有者\u安全\u信息 旗帜要设置所有者,调用方必须具有对 对象或已启用SE_TAKE_OWNERSHIP_NAME权限

但是,它不允许您克服DACL项,DACL项显式阻止所有权更改。在这种情况下,您还需要另一种特权(即,您需要同时启用这两种特权),这使您能够在决定将其提供给谁之前从某人处获得所有权


我正在从上面的注释复制到C++/ATL源代码的链接:。当permissions/DACL具有拒绝项时,会发生异常,启用第二个权限可解决此问题。

SeTakeOwnershipPrivilege
?谢谢你的帮助。我的理解(这可能有缺陷——我的代码不工作!)是SeTakeOwnershipPrivilege允许我将所有者设置为我自己(然后我假设为另一个用户)。然而,我认为SeRestorePrivilege应该允许我直接将它设置给另一个用户,而不需要额外的步骤。我刚刚做了,结果很好。我想知道它是否是你真正的代码中的
C:\t
,而不是
C:\\t
?我想你也有特权让它成功。嗯,DACL否认所有权可能是个问题。然而,即使在这种情况下,另外启用
SE_TAKE_OWNERSHIP_NAME
似乎也是一种解决方案。它认为可能需要将所有权转移给self,然后暂时删除DACL,但没有,只是获得了额外的特权:。再次非常感谢您的帮助。现在一切都很顺利。很抱歉,我花了这么长时间才回复。这是非常繁忙的。再次感谢:)