我正在尝试在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。但似乎我不能。
似乎对TakeOwnership DACL的任何拒绝都会超越我获得所有权的能力。但是,在我取得所有权之前,我无法更改权限! 叹息。
我可能会尝试按照您最初的建议设置SeTakeOwnershipPrivilege,为自己取得所有权,更改权限,在外部设置所有权。太痛苦了。而且我甚至不相信它会起作用。
我也发现了这个:http://us.generation-nt.com/setnamedsecurityinfo-failing-rc-1307-help-59729462.html
他似乎处于类似情况(如果我没有正确设置进程令牌,我会得到1307)。但CreatePrivateObjectSecurityEx需要更多设置。
Hmmmm。谢谢你的时间。