在Windows操作系统中,文件和目录的安全描述符(Security Descriptor)定义了谁可以访问它们以及如何访问。为了管理这些安全描述符,经常需要设置或修改它们的所有者。本文介绍的CSecOwner类是一个简单的辅助类,用于设置文件或目录的安全描述符的所有者。
CSecOwner类提供了两个函数,用于设置文件或目录的所有者:
BOOL CSecOwner::SetFileOwner(LPSTR UserName, LPSTR pFileName);
BOOL CSecOwner::SetFileOwnerSID(LPBYTE UserSID, LPSTR pFileName);
第一个函数用于当有一个合格的用户名和文件名时,第二个函数用于已经有一个有效的SID和文件名时。两个函数在成功时返回TRUE,如果出现错误则会弹出一个消息框。
需要注意的是,更改安全描述符的所有者需要特定的权限。尽管CSecOwner类本身尝试启用SE_RESTORE_NAME权限,但如果不是管理员或至少是备份操作员,它将会失败。此外,该类不会替换ACL,而是对其进行修改。
附带的演示项目允许从资源管理器样式的树形结构中选择一个文件,并将所有者设置为当前域的任何用户。演示项目使用了Nicola Delfino的CDirTreeCtl类。
CSecOwner类不支持Unicode。它是用VC6编写并测试的,但在VC7下也可以编译。示例使用了MFC。不,它不会在Win9x/ME下运行。这是严格针对NT/W2k/XP(XP需要禁用简单文件共享)的。
以下是CSecOwner类的一个简单示例,展示如何使用它来设置文件的所有者:
#include "CSecOwner.h"
int main() {
CSecOwner owner;
if (owner.SetFileOwner("Administrator", "C:\\Example\\file.txt")) {
MessageBox(NULL, "Owner set successfully", "Success", MB_OK);
} else {
MessageBox(NULL, "Failed to set owner", "Error", MB_OK);
}
return 0;
}
在这个示例中,尝试将C盘下Example文件夹中的file.txt文件的所有者设置为"Administrator"。如果操作成功,将显示一个消息框提示成功;如果失败,则显示错误消息框。