回 帖 发 新 帖 刷新版面

主题:关于API函数SetNamedSecurityInfo 的使用请教


各位前辈你们好!
     请指教
     API函数; SetNamedSecurityInfo 的参数意思呢?

回复列表 (共4个回复)

沙发

show toc欢迎来到 MSDN > 安全性
保证应用程序中私有对象安全的技术
发布日期: 8/17/2004 | 更新日期: 8/17/2004
Kenny Kerr
软件顾问

适用范围:
Microsoft® Windows® 安全授权
C++ 语言

摘要: 想了解扩展 Windows 操作系统丰富的安全功能以将其应用于自己的应用程序的方法吗?获取有关 Windows 安全授权以及创建自己的安全描述符的基础知识。



下载相关的 SecuringPrivateObjects.exe(英文)示例代码。

本页内容
 引言 
 令牌及其概念 
 安全描述符基础 
 内存管理 
 私有安全描述符 
 权限 
 访问控制列表 
 访问控制编辑器 
 结论 

引言
您是否考虑过扩展 Windows® 操作系统丰富的安全功能以将其应用于自己的应用程序的方法?您是否用过 Windows 文件系统安全编辑器,并希望能够为自己的业务对象提供这一级别的安全性?本文将首先介绍 Windows 安全授权的基础。然后介绍操纵安全描述符的步骤、创建自己的安全描述符的方法,以及如何使用不同的方法来编辑安全描述符。读过本文后,您将掌握足够的信息,使您能够将这些技术应用到自己的应用程序中。

撰写本文的目的之一,是希望有助于使安全编程切实可行,且便于访问。所以这里不会对特定的函数进行全面、深入的剖析,我将介绍若干 helper 函数和类,使用它们可以使您的安全代码更可靠、更便于管理。helper 函数和示例不仅说明了使用各种安全函数的方法,而且着重说明了在出现异常和错误的情况下如何安全、可靠地使用它们。

返回页首
令牌及其概念
本文的内容全部是有关管理访问控制的,管理访问控制也称为授权。在讨论此问题之前,我们需要具备一种方法,用来识别尝试对采取了安全措施的资源进行访问的用户。这就是令牌的作用。令牌代表计算机中的登录会话。只要用户以交互方式或远程方式访问计算机,就会创建登录会话。令牌是一个处理程序,可用来对登录会话进行查询和操纵。如果具有令牌,您就可以得到登录会话所代表的用户,以及确定是否应授予该用户访问已采取安全措施的资源的权限。

因为所有应用程序都运行于登录会话的上下文中,所以总是可以使用某些类型的令牌来指示用户。在任何给定的时刻,可能有一个或多个不同的令牌或安全上下文,这会有些使人产生混淆。每一个登录会话都代表着不同的用户。至少有一个令牌附加到该进程。可以使用 OpenProcessToken 函数获取此令牌。

CHandle token;
Helpers::CheckError(::OpenProcessToken(::GetCurrentProcess(),
                                       TOKEN_QUERY,
                                       &token.m_h));

板凳

CHandle 是一个由活动模版库 (ATL) 提供的包装类,当令牌超出范围时,它用来确保能够通过调用 CloseHandle 函数关闭处理程序。CheckError 是我的 Helpers 命名空间中的一个 helper 函数。CheckError 抛出一个 HRESULT,用于说明所发生的错误。使用不同的方法可以在 Windows 的 C 语言编程中表示出错的情况,我倾向使 HRESULT 标准化,以保证一致性。如果下载本文,则可以使用 Helpers 命名空间。GetCurrentProcess 函数的返回值是一个伪处理程序,它代表当前的进程。因为不是真正的处理程序,所以不需要调用 CloseHandle 函数来释放返回的 HANDLE。

可以使用的另外一个令牌是线程令牌。可以通过调用 OpenThreadToken 函数来检索线程令牌。 

CHandle token;
Helpers::CheckError(::OpenThreadToken(::GetCurrentThread(),
                                      TOKEN_QUERY,
                                      TRUE, // 打开自身
                                      &token.m_h));

与 GetCurrentProcess 相同,GetCurrentThread 也返回一个伪处理程序,所以也不需要针对该程序调用 CloseHandle。与 OpenProcessToken 不同的是,如果没有任何令牌与当前线程相关联,那么可能无法成功调用 OpenThreadToken,这时函数返回 ERROR_NO_TOKEN。

在某些情况下,甚至存在第三令牌,该令牌代表其他安全上下文。例如,ASP.NET 允许关闭客户模拟,在这种情况下,可以通过 HttpContext 类获取客户标识。

获取令牌后,如果能够利用它执行一些有趣的操作,会有助于我们对它的理解。使用令牌能够执行的最简单的操作,就是对它进行查询,以获取登录会话的有关信息。可以使用 GetTokenInformation 函数执行此操作。因为 GetTokenInformation 函数可用来查询不同类的信息,调用方法相当复杂,所以我编写了一个包装函数模板,以减少调用时可能出现的错误。下面示例说明了查询令牌以获取令牌用户信息的方法。

CLocalMemoryT<PTOKEN_USER> tokenUser(Helpers::GetTokenInformation<TOKEN_USER>(token,
                                                                              TokenUser));
CComBSTR string = Helpers::ConvertSidToStringSid(tokenUser->User.Sid);

ConvertSidToStringSid helper 函数用于将二进制安全标识符 (SID) 转换为用户易识别的字符串。使用 SID 表示用户帐户是计算机易识别的格式。如果您的兴趣只在包装函数的功能,可以下载并查看本文所附的源代码。有关 CLocalMemoryT 类模板的内容将在介绍了内存管理之后讨论。

返回页首
安全描述符基础
了解了如何识别用户后,我们需要一种方法,用来管理不同用户所具有的不同的权限。这就是使用安全描述符的必要性。安全描述符包含许多不同类型的信息。其中最有趣的是所有者安全识别符 (SID) 和两个访问控制列表 (ACL)。所有者 SID 可标识拥有对象的用户。两个 ACL 分别是随机 ACL 和系统 ACL。因为系统 ACL 实际上与访问控制无关,所以本文集中讨论随机 ACL (DACL)。

安全描述符以 SECURITY_DESCRIPTOR 结构表示,因为没有关于此结构的说明,所以应避免直接对其进行操纵。Microsoft 提供了若干使用简便的函数,用于查询和操纵内置对象(比如,文件和注册表项)的安全描述符。下面示例说明了获取本地计算机中 Program Files 目录的所有者 SID 和 DACL 的方法。

CLocalMemory securityDescriptor;
PSID sid = 0;
PACL dacl = 0;

Helpers::CheckError(::GetNamedSecurityInfo(_T("C:\\Program Files"),
                                           SE_FILE_OBJECT,
                                           OWNER_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION,
                                           &sid,
                                           0, // 组
                                           &dacl,
                                           0, // sacl
                                           &securityDescriptor.m_ptr));

3 楼

具体的看这里:http://www.microsoft.com/china/msdn/library/security/SecPrivateObjects.mspx

4 楼

http://apps.hi.baidu.com/share/detail/15926486

我来回复

您尚未登录,请登录后再回复。点此登录或注册