10.2.1 存取控制.htm
来自「Windows2000后台服务程序开发手册」· HTM 代码 · 共 723 行 · 第 1/5 页
HTM
723 行
style="LINE-HEIGHT: 25px"> </B></FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>存取权利起先看起来似乎是个需要理解的简单观点,但是有某些重点可能不够明显。要了解存取权利之细微差别的最好方法是讨论它们被使用在哪里并检查每个群组。让我们先复习已经知道的部分:</FONT></P><FONT
style="LINE-HEIGHT: 25px" face=arial color=#000000 size=2>
<UL style="LINE-HEIGHT: 25px">
<LI
style="LINE-HEIGHT: 25px">系统在代表信任成员的安全对象上执行任何安全性作业之前,信任成员必须持有存取权利的组合。<BR
style="LINE-HEIGHT: 25px">
<LI
style="LINE-HEIGHT: 25px">所有存取权利都被封装成一个32位元的存取遮罩(请察看 </FONT></A><FONT
style="LINE-HEIGHT: 25px" face=arial color=#000000 size=2><A
style="LINE-HEIGHT: 25px"
href="http://www.acejoy.com/doc/serverside/10.htm#485_1"
target=_new>图10-2</A> )。<BR style="LINE-HEIGHT: 25px">
<LI
style="LINE-HEIGHT: 25px">存取权利被分割成叁类:通用权利(3位元1-28)、标准权利(位元22-16)及特定权利(位元15-0)。<BR
style="LINE-HEIGHT: 25px">
<LI
style="LINE-HEIGHT: 25px">存取遮罩中的两个「奇数」位元不符合存取权利群组:即稽核位元及最大的允许位元。<BR
style="LINE-HEIGHT: 25px"> </LI></UL></FONT>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>截至目前为止,我们已经讨论过储存在ACE中的存取遮罩之存取权利,它只是交易处理的其中一部份。我说过权利是执行工作所需的,但是并没有明确说明应如何向系统要求权利。要求权利是交易处理的另一部份。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>通常当您在向系统要求一个对象的handle时,即是在要求一个权利。大部分传回安全对象handle的函数皆有一个必须的存取参数,您必须传递一个值以指出您打算如何使用此handle。请看以下的范例:</FONT></P>
<DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT
style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">HANDLE hEvent = OpenEvent(EVENT_ALL_ACCESS, FALSE, TEXT("MyEvent"));</PRE></FONT></DIV>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>您可能已经非常熟悉像这样的程序代码,但是却怎么也没想到您是在向系统要求这个事件对象的特定存取权利。您传递到OpenEvent(及其他类似的函数)存取参数的标记位元与储存在保护对象安全之ACEs的位元是相同的。事实上,系统在传回事件的handle前就会执行存取检查。</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>Windows中有许多安全对象皆是透过handles被存取。当这些对象的handle被要求时会检查其安全性,而您的权利会和此handle一起被储存。这意味着一旦您已经收到某个对象的handle时,对象本身的存取权利可能会改变,而经由handle提供给您的存取则仍是相同的,直到handle被结束为止。</FONT></P>
<HR style="LINE-HEIGHT: 25px">
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>某些在对象上执行安全活动的handle是您从未见过的。这个理想的范例即是呼叫GetNamedSecurityInfo,此函数在您不须先撷取某个对象handle时很方便。在这个实例中,系统内部在执行任何安全性活动前,会先执行存取检查。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>您现在已经熟悉了ACE及存取权利的存取要求,让我们开始讨论更详细的存取权利类型。首先,我们需要在不同的存取遮罩中取得「奇数」位元。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>稽核位元代表存取权利ACCESS_SYSTEM_SECURITY,在使用者可以修改对象的SACL前,它必须由信任成员持有(本章稍后将会更详细讨论稽核的内容)。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>最大的允许位元代表「非存取权利」MAXIMUM_
ALLOWED,我称它为非存取权利是因为它从不会在储存于DACL的ACE中发现。只在呼叫函数要求存取时被使用。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>例如,以下的程序代码片段在撷取指定事件对象的handle时使用MAXIMUM_ALLOWED标记:</FONT></P>
<DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT
style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">HANDLE hEvent = OpenEvent(MAXIMUM_ALLOWED, FALSE, TEXT("MyEvent"));</PRE></FONT></DIV>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>在这个实例中,系统会在对象上执行存取检查,而非允许或拒绝存取检查,它会传回授予您这个对象之最大权利的存取遮罩。这似乎是个非常方便的特色(在某些情况下它是),当要求一个handle时,它允许您总是传递MAXIMUM_
ALLOWED,而不强迫您正确地描绘所需对象的哪个权利。然而,有一个不用如此做的好理由。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>当您取得对象的handle时,通常会被系统告知您被允许以某些方法使用这个对象。假如您在要求handle时被拒绝,通常即表示着您不被允许作所要求的任何事,此时您的软件可以采取适当的方法。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>假如您每次需要存取时皆传递MAXIMUM_ALLOWED到对象上,那么您的程序代码在一段长时间内可能会运作良好。但是当您的程序第一次遇到没有授予足够存取的对象时,您的软件在撷取对象handle前,可能不会抓取错误。执行失败的函数可能甚至不传回ERROR_ACCESS_DENIED。函数会传回另一个错误,例如ERROR_INVALID_PARAMETER,是很有可能的事,因为您传递了一个handle以及对象的不充分存取权限给它。有这种问题的程序代码可能更难除错。</FONT></P>
<P><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"> 标准存取权利 </B></FONT>系统定义了五个标准权利。除了这些之外,另外五个「复合的」存取权利则由系统定义对应到五个标准权利的某些组合。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>并非所有的标准权利都与系统之所有安全对象有关,但是每个标准权利都是特殊的,因为其本身的涵义不是从对象变成对象。例如,不是所有的对象都能被删除,所以标准权利DELETE对某些对象来说没有意义。然而,对于可以被删除的对象来说,标准权利DELETE可从一个对象类型传递相同的涵义到下一个可删除对象权利的持有者。表10-13列出所有标准及复合权利。</FONT></P><A
style="LINE-HEIGHT: 25px" name=460_1>
<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"> 表10-13 </B></FONT>标准及复合权利</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" colSpan=2><FONT
style="LINE-HEIGHT: 25px" size=2>标准权利</FONT></TD></TR>
<TR style="LINE-HEIGHT: 25px">
<TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
size=2>DELETE<BR style="LINE-HEIGHT: 25px"><FONT
style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>(位元16)</FONT></FONT></TD>
<TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
size=2>删除存取。</FONT></TD></TR>
<TR style="LINE-HEIGHT: 25px">
<TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
size=2>READ_CONTROL<BR style="LINE-HEIGHT: 25px"><FONT
style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>(位元17)</FONT></FONT></TD>
<TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
size=2>读取存取安全对象的安全性资讯,包括拥有者 SID、群组SID、DACL及安全描述项修正和控
制。它不包括要求读取安全对象SACL的存取。</FONT></TD></TR>
<TR style="LINE-HEIGHT: 25px">
<TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
size=2>WRITE_DAC<BR style="LINE-HEIGHT: 25px"><FONT
style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>(位元18)</FONT></FONT></TD>
<TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
size=2>写入存取安全对象的DACL及群组SID。WRITE_
DAC存取被暗示性地授予对象的拥有者。</FONT></TD></TR>
<TR style="LINE-HEIGHT: 25px">
<TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
size=2>WRITE_OWNER<BR style="LINE-HEIGHT: 25px"><FONT
style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>(位元19)</FONT></FONT></TD>
<TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
size=2>写入存取安全对象的拥有者SID。除非您也持有 SE_BACKUP_NAME权利,否则您只能写入只表
示使用者SID的SID或是群组SIDs的其中一个 到对象的拥有者SID。</FONT></TD></TR>
<TR style="LINE-HEIGHT: 25px">
<TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
size=2>SYNCHRONIZE<BR style="LINE-HEIGHT: 25px"><FONT
style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>(位元20)</FONT></FONT></TD>
<TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
size=2>同步存取可被想成是伺候对象的权利。此类对象 可以是同步化对象(例如,事件或Mutex),或
者它可以是可等待核心对象的其中之一(例如, 文件或处理程序handle)。</FONT></TD></TR>
<TR style="LINE-HEIGHT: 25px">
<TD style="LINE-HEIGHT: 25px" colSpan=2><FONT
style="LINE-HEIGHT: 25px" size=2>复合的标准权利</FONT></TD></TR>
<TR style="LINE-HEIGHT: 25px">
<TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
size=2>STANDARD_RIGHTS_READ<BR style="LINE-HEIGHT: 25px"><FONT
style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>STANDARD_RIGHTS_WRITE</FONT><BR
style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
face=arial color=#000000
size=2>STANDARD_RIGHTS_EXECUTE</FONT></FONT></TD>
<TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
size=2>对应到READ_CONTROL存取。</FONT></TD></TR>
<TR style="LINE-HEIGHT: 25px">
<TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
size=2>STANDARD_RIGHTS_REQUIRED</FONT></TD>
<TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
size=2>对应到位元16-19,或是DELETE、READ_
CONTROL、WRITE_DAC及WRITE_OWNER。 这种存取权利通常包括为特定对象定义的「所有
存取」,例如,EVENT_ALL_ACCESS或FILE_ ALL_ACCESS。</FONT></TD></TR>
<TR style="LINE-HEIGHT: 25px">
<TD style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
size=2>STANDARD_RIGHTS_ALL</FONT></TD>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?