10.3.1 存取控制.htm

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

HTM
483
字号
        <TBODY>
        <TR>
          <TD width="77%"><SPAN class=tt>阅读→</SPAN><FONT 
            color=#999999>Windows2000 服务器端应用程序开发设计指南-存取控制(3)</FONT></TD>
          <TD width="23%">
            <DIV align=right><FONT color=#ff0033>热</FONT>&nbsp;&nbsp;&nbsp;<IMG 
            alt=3星级 src="10.3.1 存取控制.files/Star3.gif" 
        border=0></DIV></TD></TR></TBODY></TABLE></TD>
    <TD class=tr></TD></TR></TBODY></TABLE>
<DIV id=printBody>
<TABLE id=middle 
style="TABLE-LAYOUT: fixed; WORD-BREAK: break-all; TEXT-ALIGN: left" 
cellSpacing=0 cellPadding=0 align=center>
  <TBODY>
  <TR>
    <TD class=ml></TD>
    <TD class=mm vAlign=top><BR>
      <DIV align=center>
      <H1 class=aTitle>Windows2000 服务器端应用程序开发设计指南-存取控制(3)</H1></DIV>
      <TABLE width="97%" align=center>
        <TBODY>
        <TR>
          <TD width=502>
            <DIV align=center>[日期:2006-10-30&nbsp;&nbsp;&nbsp;&nbsp;来源:<A 
            href="http://www.acejoy.com/" target=_blank>ACE开发者</A><SPAN 
            id=SourceLabel></SPAN>&nbsp;&nbsp;&nbsp;&nbsp;作者:Jeffrey Richter 
            Jason D. Clark<SPAN id=AuthorLabel>]</SPAN></DIV></TD>
          <TD align=right width=209>
            <DIV align=center>[字体: <INPUT title=把正文字体缩小 style="HEIGHT: 16px" onclick="fontSize('m','ArticleBody')" type=button value=小> 
<INPUT title=把正文字体扩大 style="HEIGHT: 16px" onclick="fontSize('b','ArticleBody')" type=button value=大> 
<INPUT title=转为简体中文模式 style="HEIGHT: 16px" onclick="bodytojt('ArticleBody')" type=button value=简> 
<INPUT title=转为繁体中文模式 style="HEIGHT: 16px" onclick="bodytoft('ArticleBody')" type=button value=繁> 
            <A href="javascript:fontColor('ArticleBody')"><IMG alt=字体颜色 
            src="10.3.1 存取控制.files/fgcolor.gif" align=absMiddle 
            border=0></A>]</DIV></TD></TR></TBODY></TABLE>
      <TABLE cellSpacing=5 cellPadding=0 width="100%" align=center border=0>
        <TBODY>
        <TR>
          <TD vAlign=top>
            <TABLE cellSpacing=0 cellPadding=10 align=left border=0>
              <TBODY>
              <TR>
                <TD></TD></TR></TBODY></TABLE>
            <DIV class=content id=ArticleBody 
            style="PADDING-RIGHT: 10px; DISPLAY: block; PADDING-LEFT: 10px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px">
            <P class=content></P>
            <DIV style="WIDTH: 650px">
            <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 
            size=2>建立安全对象牵涉到与需要实作服务一样多的存取控制。您可以实作许多服务,而从来不用修改现存对象的安全性,这是令人惊异的。当然,某些程序必须处理已经拥有应用安全性的现存对象。在此种情况下,您的软件必须能够读取及修改对象的DACL。以下是您可以采取的步骤:</FONT></P><FONT 
            style="LINE-HEIGHT: 25px" face=arial color=#000000 size=2>
            <OL style="LINE-HEIGHT: 25px">
              <LI style="LINE-HEIGHT: 25px">撷取您要修改之对象的DACL。 
              <LI style="LINE-HEIGHT: 25px">假如您正在移除ACEs,在DACL中搜寻这些ACEs并加以删除。 
              <LI style="LINE-HEIGHT: 25px">收集您将加入ACEs的信任成员SIDs。 
              <LI style="LINE-HEIGHT: 25px">建立您将加入的ACEs。 
              <LI 
              style="LINE-HEIGHT: 25px">在DACL中搜寻是否有与您将加入相同的ACEs。若有任何一个存在,将它们从您加入的ACEs群组中移除。 

              <LI style="LINE-HEIGHT: 25px">计算新DACL的大小。 
              <LI style="LINE-HEIGHT: 25px">分配内存及初始化新的DACL。 
              <LI style="LINE-HEIGHT: 25px">复制旧的DACL到新的DACL。 
              <LI style="LINE-HEIGHT: 25px">在新的DACL中将新的ACEs插入适当的位置。 
              <LI style="LINE-HEIGHT: 25px">指派DACL回对象。 </LI></OL></FONT>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>如您所见,读取及修改对象DACL的程序并没有那么简单,然而我应告诉您,我已经提供了最糟情况的方案。通常您并非真的移除ACEs,所以可以忽略步骤二的动作。而一般的情形下,您只增加了一个个别的ACE;假如该ACE已经存在DACL中,那么您可以中止整个程序,并简化步骤五的动作。</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>在ACLs中搜寻已经存在的ACEs是很重要的,虽然完全一样的ACEs并不会影响对象的<FONT 
            style="LINE-HEIGHT: 25px" face=arial color=#3e80d7 size=2><B 
            style="LINE-HEIGHT: 25px">&nbsp;安全性&nbsp;</B></FONT>。其原因是ACEs占用了系统中的内存,而某些系统对象(例如,window站台)会出乎意料的持有少数ACEs。每次执行就增加ACE,没有检查工作之必要性的任何软件,最后将耗尽系统的资源。</FONT></P>
            <HR style="LINE-HEIGHT: 25px">

            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>现在让我告诉您处理读取及修改DACL之工作必须使用的工具。让我们从一个简单的函数开始(您已经知道如何读取DACL中的资讯,这些技巧将在此处开始产生作用)。</FONT></P>
            <DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT 
            style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">BOOL DeleteAce( <BR> PACL pACL, <BR> DWORD dwACEIndex);</PRE></FONT></DIV>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>DeleteAce函数会从DACL中移除一个ACE,您必须传递ACL及您要移除的ACE索引值给它。</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>如果您对这个对象所做的唯一修改只是移除ACEs,那么您不用为新的DACL分配内存。您可以简单地移除经由GetSecurityInfo传回之DACL中的ACEs,然后再放置修改过的DACL回对象。</FONT></P>
            <HR style="LINE-HEIGHT: 25px">

            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>处理程序的下一个步骤即是要求您拥有便于使用的ACE,因为您将使用到AddAce函数,它会要求一个已建立的ACE;再者,因为您可能会在ACL中搜寻已存在的ACE,此时有个ACE结构可对照DACL之ACEs是方便的。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>可惜系统不提供让您使用简便方法建立ACEs的函数。建立ACEs的工作是复杂的,因为每个ACE皆包括了一个SID结构,而SID结构的长度是可变的。最好使用您的SID长度及ACE结构长度分配一个缓冲器给ACE,并复制SID到ACE中,然后设定其ACE栏位。以下的函数显示了实行的方法:</FONT></P>
            <DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT 

⌨️ 快捷键说明

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