2012-09-09 30 views
1

我试图用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需要更多的设置。

嗯。谢谢你的时间。

+1

'SeTakeOwnershipPrivilege'? http://stackoverflow.com/a/5454795/868014 –

+0

谢谢你的帮助。我的理解(可能有缺陷 - 我的代码不起作用!)是SeTakeOwnershipPrivilege允许我将所有者设置为自己(然后我想给其他用户)。但是,我认为SeRestorePrivilege应该允许我直接将其设置给另一个用户,而无需额外的步骤。 – niemiro

+0

http://blogs.msdn.com/b/oldnewthing/archive/2005/08/18/453054.aspx – niemiro

回答

2

这里的问题是,安全子系统和模型正在捍卫不合理的所有权变更对象,甚至有管理员权限需要正确克服障碍。

获得文件所有权涉及两项特权:SE_TAKE_OWNERSHIP_NAMESE_RESTORE_NAME。前者允许接受某人的对象,后者允许设置不是接受者的所有者。

它看起来是SE_RESTORE_NAME是一个更强大的特权,就足够了任务,但似乎并非如此。是的,它允许设置别人的所有权,as MSDN states

如果主叫方不具有SeRestorePrivilege不变(见 特权常量),这个SID必须包含在主叫方的 令牌,并且必须启用SE_GROUP_OWNER许可。 SecurityInfo参数必须包含OWNER_SECURITY_INFORMATION 标志。要设置所有者,调用者必须具有WRITE_OWNER对 对象的访问权限或启用SE_TAKE_OWNERSHIP_NAME权限。

但是,它不会让你克服明确防止所有权变更的DACL项目。在这种情况下,您还需要其他特权(也就是说,您需要同时启用这两项特权),这样您可以在决定要将其提供给谁之前,先取得某人的所有权。 SetFileOwner.cpp

我从上面评论复制链接C++/ATL源代码。当permissions/DACL有一个拒绝项目时,会发生异常,并启用第二个权限来解决问题。

+0

非常感谢您的帮助,再次。现在一切正常。对不起,我花了这么长时间回应。它一直非常忙碌。我再次感谢:) – niemiro