我试图用C++程序设置文件的所有者给另一个用户。ERROR_ACCESS_DENIED设置文件所有者
我肯定已启用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设置。
但是,我注意到我的代码和你的代码都适用于简单的文件。多的测试后,我发现我只有在以下情况下获得存取遭拒的消息:
1:我不是老板,而“取得所有权”权限设置为拒绝对例如大家。
2:我是所有者,并且“Take Ownership”权限设置为拒绝,例如,大家。奇怪的是,在第二个例子中,尽管失败代码,所有权变更确实发生。
我不明白为什么会发生这种情况。我和您已在流程令牌中设置了SE_RESTORE_NAME。我应该被允许任意设置所有者SID。但似乎我不能。
看起来,任何拒绝承认所有权DACLs都将取代我取得所有权的能力。但是,我无法更改权限,直到我可以拥有所有权! 感叹。
我可能会尝试设置SeTakeOwnershipPrivilege为您最初建议,采取所有权转让给自己,更改权限,设定所有权外。多么痛苦。我甚至不相信它会起作用。
我也发现了这一点:http://us.generation-nt.com/setnamedsecurityinfo-failing-rc-1307-help-59729462.html
他似乎是在一个类似的情况(我得到1307如果我不设置进程令牌正常)。但是CreatePrivateObjectSecurityEx需要更多的设置。
嗯。谢谢你的时间。
'SeTakeOwnershipPrivilege'? http://stackoverflow.com/a/5454795/868014 –
谢谢你的帮助。我的理解(可能有缺陷 - 我的代码不起作用!)是SeTakeOwnershipPrivilege允许我将所有者设置为自己(然后我想给其他用户)。但是,我认为SeRestorePrivilege应该允许我直接将其设置给另一个用户,而无需额外的步骤。 – niemiro
http://blogs.msdn.com/b/oldnewthing/archive/2005/08/18/453054.aspx – niemiro