10.2.3 存取控制.htm

来自「Windows2000后台服务程序开发手册」· HTM 代码 · 共 461 行 · 第 1/3 页

HTM
461
字号
            style="LINE-HEIGHT: 25px"> </B></FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>AccessMaster范例应用程序(「10 AccessMaster.exe」)示范了GetNamed 
            SecurityInfo、SetNamedSecurityInfo、GetSecurityInfo及SetSecurityInfo函数,还有EditSecurity常用对话方块之ISecurityInformation介面的用法。应用程序的原始程序代码及文件存放在随书光碟上的AccessMaster目录中。图10-7显示了使用AccessMaster设定文件安全性的画面。</FONT></P>
            <P><BR style="LINE-HEIGHT: 25px"> </P>
            <CENTER style="LINE-HEIGHT: 25px">
            <P><INPUT id=5 style="LINE-HEIGHT: 25px" type=image height=412 
            width=677 src="10.2.3 存取控制.files/10-7.gif" border=0 
            &#111nclick="imgclick"></P></CENTER>
            <CENTER style="LINE-HEIGHT: 25px">
            <TABLE style="LINE-HEIGHT: 25px" border=0>
              <TBODY style="LINE-HEIGHT: 25px">
              <TR style="LINE-HEIGHT: 25px">
                <TD style="LINE-HEIGHT: 25px" align=middle><FONT 
                  style="LINE-HEIGHT: 25px" face=arial color=#000000 
                  size=2><FONT style="LINE-HEIGHT: 25px" face=arial 
                  color=#3e80d7 size=2><B 
                  style="LINE-HEIGHT: 25px">&nbsp;图10-7&nbsp;</B></FONT>使用AccessMaster设定文件的安全性</FONT></TD></TR></TBODY></TABLE></CENTER>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>除了显示如何计划性地取得及设定系统之一般对象的安全性外,AccessMaster范例应用程序对于了解安全对象的存取控制来说是个很有用的工具。您可以经由名称或程序ID及handle的数值(使用十进位数)来存取对象,也可以用未处理过的二进制数存取遮罩检视ACEs,而非将它们对应到对象的标准及特定权利。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>AccessMaster工具也能让您设定系统中安全对象的安全性。因为您可能没有系统中所有对象的权利,所以必须在您可以读取或写入其他安全性资讯之前,取得对象的所有权。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>为了完成这个动作,您可以使用第九章的TrusteeMan范例应用程序指派SE_TAKE_OWNERSHIP_NAME权限给您的使用者帐户。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>假如您不熟悉系统在对象上存取控制的纵横交错,包括由您的软件建立对象的方式,则您可以使用AccessMaster工具来检视及修改指派给这些对象的存取权利。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#3e72d7 
            size=4><B style="LINE-HEIGHT: 25px">设定对象的安全性资讯<BR 
            style="LINE-HEIGHT: 25px"> </B></FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>存取控制的下一个步骤是设定安全对象的安全性。系统中大部分的安全对象是经由呼叫SetSecurityInfo或是SetNamedSecurityInfo而设定(有关安全对象及用来取得及设定安全性的函数清单,请参阅&nbsp;<A 
            style="LINE-HEIGHT: 25px" 
            href="http://www.acejoy.com/doc/serverside/10.htm#477_1" 
            target=_new>表10-7</A>&nbsp;)。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>以下是SetSecurityInfo函数的定义:</FONT></P>
            <DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT 
            style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">DWORD SetSecurityInfo( <BR> HANDLE handle, <BR> SE_OBJECT_TYPE objType, <BR> SECURITY_INFORMATION secInfo, <BR> PSID psidOwner, <BR> PSID psidGroup, <BR> PACL pDACL, <BR> PACL pSACLl);</PRE></FONT></DIV>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>而这是SetNamedSecurityInfo函数的定义:</FONT></P>
            <DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT 
            style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">DWORD SetNamedSecurityInfo( <BR> LPTSTR pObjectName, <BR> SE_OBJECT_TYPE objType, <BR> SECURITY_INFORMATION secInfo, <BR> PSID psidOwner, <BR> PSID psidGroup, <BR> PACL pDACL, <BR> PACL pSACL);</PRE></FONT></DIV>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>如您所见,这些函数都很相似,除了SetSecurityInfo拥有设定安全性对象的handle外,而使用SetNamedSecurityInfo设定系统之指定对象的安全性不需要handle。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>这些函数也和他们的亲戚非常相像,即GetSecurityInfo及GetNamed 
            SecurityInfo。请注意「SetSecurity」函数的objType参数定义了您正在设定安全性资讯的对象类型与「GetSecurity」函数一样使用相同的对象类型(请参阅&nbsp;<A 
            style="LINE-HEIGHT: 25px" 
            href="http://www.acejoy.com/doc/serverside/10.htm#477_1" 
            target=_new>表10-7</A>&nbsp;)。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>secInfo参数指出您要设定的对象安全性描述项元件。这些元件可以是对象的拥有者SID、群组SID、DACL及SACL的任何组合。此外,这些参数被用来设定保护安全性描述项,使它不继承父系的DACLs及SACLs中的ACEs。表10-6显示了所有可以传递给SetNamedSecurityInfo及SetNamedSecurity,以作为secInfo参数的值。您可以结合这些值以确切地指出如何将安全性应用到您的对象及该应用何种安全性到您的对象。</FONT></P>
            <CENTER style="LINE-HEIGHT: 25px">
            <TABLE style="LINE-HEIGHT: 25px" border=0>
              <TBODY style="LINE-HEIGHT: 25px">
              <TR style="LINE-HEIGHT: 25px">
                <TD style="LINE-HEIGHT: 25px" align=middle><FONT 
                  style="LINE-HEIGHT: 25px" face=arial color=#000000 
                  size=2><FONT style="LINE-HEIGHT: 25px" face=arial 
                  color=#3e80d7 size=2><B 
                  style="LINE-HEIGHT: 25px">&nbsp;表10-16&nbsp;</B></FONT>可以传递到SetNamedSecurityInfo及SetNamedSecurity作为secInfo参数的值</FONT></TD></TR></TBODY></TABLE></CENTER>
            <CENTER style="LINE-HEIGHT: 25px">
            <TABLE style="LINE-HEIGHT: 25px" border=1>
              <TBODY style="LINE-HEIGHT: 25px">
              <TR style="LINE-HEIGHT: 25px">
                <TH style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
                  size=2>值</FONT> </TH>
                <TH style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
                  size=2>叙述</FONT></TH></TR>
              <TR style="LINE-HEIGHT: 25px">
                <TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
                  size=2>DACL_SECURITY_INFORMATION</FONT></TD>
                <TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
                  size=2>指出您要为安全对象设定DACL资讯。</FONT></TD></TR>
              <TR style="LINE-HEIGHT: 25px">
                <TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
                  size=2>SACL_SECURITY_INFORMATION</FONT></TD>
                <TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
                  size=2>指出您要为安全对象设定SACL资讯。</FONT></TD></TR>
              <TR style="LINE-HEIGHT: 25px">
                <TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
                  size=2>OWNER_SECURITY_INFORMATION</FONT></TD>
                <TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
                  size=2>指出您要为安全对象设定拥有者SID资讯。</FONT></TD></TR>
              <TR style="LINE-HEIGHT: 25px">
                <TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
                  size=2>GROUP_SECURITY_INFORMATION</FONT></TD>
                <TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
                  size=2>指出您要为安全对象设定群组SID资讯。</FONT></TD></TR>
              <TR style="LINE-HEIGHT: 25px">
                <TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
                  size=2>UNPROTECTED_DACL_SECURITY__INFORMATION</FONT></TD>
                <TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
                  size=2>指出您要让父对象中继承的ACEs传播到此物INFORMATION 
                  件的DACL。这个标记必须与DACL_SECURITY 
                  一起使用,不能与PROTECTED_DACL_SECURITY_INFORMATION一起使用。</FONT></TD></TR>
              <TR style="LINE-HEIGHT: 25px">
                <TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
                  size=2>PROTECTED_DACL_SECURITY_INFORMATION</FONT></TD>
                <TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
                  size=2>指出您不要让父对象中继承的ACEs传播到此对象的DACL。这个标记必须与DACL_ 
                  SECURITY_INFORMATION一起使用,不能与UNPROTECTED_DACL_SECURITY_ 
                  INFORMATION一起使用。</FONT></TD></TR>
              <TR style="LINE-HEIGHT: 25px">
                <TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
                  size=2>UNPROTECTED_SACL_SECURITY_ INFORMATION</FONT></TD>
                <TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
                  size=2>指出您要让父对象中继承的ACEs传播到这个对象的SACL。这个标记必须与SACL_SECURITY_INFORMATION一起使用,而不能与PROTECTED_SACL_SECURITY_INFORMATION一起使用。</FONT></TD></TR>
              <TR style="LINE-HEIGHT: 25px">
                <TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
                  size=2>PROTECTED_SACL_SECURITY_INFORMATION</FONT></TD>
                <TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
                  size=2>指出您不要让父对象中继承的ACEs传播到这个对象的SACL。这个标记必须与SACL_SECURITY 
                  _INFORMATION一起使用,不能与UNPROTECTED_SACL_SECURITY_ 
                  INFORMATION一起使用。</FONT></TD></TR></TBODY></TABLE></CENTER>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>呼叫SetSecurityInfo或SetNamedSecurityInfo时,根据传递给secInfo参数的标记,您传递给psidOwner、psidGroup、pDACL及pSACL参数的值可能会被忽视,或者分别指示对象的新拥有者SID、群组SID、DACL及SACL。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>您应该传递NULL给任何参数,以指出您在安全性描述项中不设定资讯的部分。</FONT></P>
            <HR style="LINE-HEIGHT: 25px">

            <P><FONT style="LINE-HEIGHT: 25px" face=Arial color=#3e77d7 size=3 
            Black><B style="LINE-HEIGHT: 25px">说明</B></FONT> </P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>必须适当的指出secInfo参数的DACL_SECURITY_INFORMATION或SACL_SECURITY_INFORMATION,并仍旧传递NULL给pDACL或pSACL参数。这表示一个NULL 
            DACL或NULL SACL。</FONT></P>
            <HR style="LINE-HEIGHT: 25px">

            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>以下的程序代码片段显示使用SetNamedSecurityInfo指派一个NULL 
            DACL到登录机码并保护它的DACL,使不继承父机码的DACL中提供的ACEs。</FONT></P>
            <DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT 
            style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">ULONG lErr = SetNamedSecurityInfo( <BR> TEXT("Machine\\Software\\Jason’sKey"), SE_REGISTRY_KEY, <BR> DACL_SECURITY_INFORMATION|PROTECTED_DACL_SECURITY_INFORMATION, <BR> NULL, NULL, NULL, NULL); <BR> if (lErr != ERROR_SUCCESS){ <BR>&nbsp;&nbsp;// 错误实例 <BR> }</PRE></FONT></DIV>
            <HR style="LINE-HEIGHT: 25px">

            <P><FONT style="LINE-HEIGHT: 25px" face=Arial color=#3e77d7 size=3 
            Black><B style="LINE-HEIGHT: 25px">说明</B></FONT> </P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>请记得NULL 
            DACL指出每个人拥有对此对象的所有存取权(甚至是写入对象安全性的能力)。在这罕见的例子中,设定NULL安全性到一个对象是适当的,您必须保护对象的DACL(或没有DACL),使不继承ACEs。否则,系统会被强迫建立一个包含从父对象继承过来之ACEs的DACL,它破坏了对象之NULL安全性的目的。另一方面,继承安全性的副作用可以是设定对象DACL,包括从父对象继承过来之ACEs的一个简便方法。</FONT></P>
            <HR style="LINE-HEIGHT: 25px">

            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>如您所见,设定对象的安全性可以是很简单的。然而,当包含了一个有意义之ACEs的DACL时,它可能会变得更困难。不管您是设定新对象(您所建立的)或是已存在之对象的安全性,可以采用两个基本的方法建立对象的DACL:即为对象建立一个新的DACL,或修改一个存在的DACL。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>您通常会为新对象建立一个DACL,但并非经常这样。您也可以使用对象的现存DACL,对它作些修改,然后再使用修改过的DACL建立一个跟原始安全对象相同类型的新对象。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>同样地,对现存DACL作修改是很常见的,而完全覆盖其安全性则是很少见的。然而,这并不意味着您不能完全取代现存对象的DACL。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>因为根据您的需求,其方法可以是弹性的,我将会涵盖两者,以建立一个新DACL的简单任务开始。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#3e74d7 
            size=3><B style="LINE-HEIGHT: 25px">建立DACL<BR 
            style="LINE-HEIGHT: 25px"> </B></FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?