⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 11.4 使用者环境.htm

📁 Windows2000后台服务程序开发手册
💻 HTM
📖 第 1 页 / 共 3 页
字号:
                  color=#000000 size=2><FONT style="LINE-HEIGHT: 25px" 
                  face=arial color=#3e80d7 size=2><B 
                  style="LINE-HEIGHT: 25px">&nbsp;表格11-5&nbsp;</B></FONT>模拟支援的连接方式</FONT></TD></TR></TBODY></TABLE>
            <CENTER></CENTER>
            <CENTER style="LINE-HEIGHT: 25px">
            <TABLE border=1>
              <TBODY style="LINE-HEIGHT: 25px">
              <TR>
                <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>
                <TD><FONT style="LINE-HEIGHT: 25px" size=2>非连接</FONT></TD>
                <TD><FONT style="LINE-HEIGHT: 25px" size=2>
                  <DIV 
                  style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT 
                  style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">BOOL ImpersonateLoggedOnUser( <BR>&nbsp;&nbsp;HANDLE hToken);&nbsp;&nbsp;<BR> 或 <BR>&nbsp;&nbsp;BOOL ImpersonateSelf( <BR>&nbsp;&nbsp;SECURITY_IMPERSONATION_LEVEL ImpersonationLevel); <BR> 和 <BR>&nbsp;&nbsp;BOOL RevertToSelf(VOID); <BR> 和/或 <BR>&nbsp;&nbsp;BOOL SetThreadToken( <BR>&nbsp;&nbsp;PHANDLE Thread, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HANDLE Token);</PRE></FONT></DIV></FONT></TD></TR>
              <TR>
                <TD><FONT style="LINE-HEIGHT: 25px" size=2>命名管道</FONT></TD>
                <TD><FONT style="LINE-HEIGHT: 25px" size=2>
                  <DIV 
                  style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT 
                  style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">BOOL ImpersonateNamedPipeClient( <BR>&nbsp;&nbsp;HANDLE hNamedPipe); <BR> 和 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BOOL RevertToSelf(VOID);</PRE></FONT></DIV></FONT></TD></TR>
              <TR>
                <TD><FONT style="LINE-HEIGHT: 25px" size=2>动态资料交换</FONT></TD>
                <TD><FONT style="LINE-HEIGHT: 25px" size=2>
                  <DIV 
                  style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT 
                  style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">BOOL DdeImpersonateClient( <BR>&nbsp;&nbsp;HCONV hConv); <BR> 或 <BR>&nbsp;&nbsp;BOOL ImpersonateDdeClientWindow( <BR>&nbsp;&nbsp;HWND hWndClient, <BR>&nbsp;&nbsp;HWND hWndServer); <BR> 和 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BOOL RevertToSelf(VOID);</PRE></FONT></DIV></FONT></TD></TR>
              <TR>
                <TD><FONT style="LINE-HEIGHT: 25px" size=2>远端程序呼叫<BR 
                  style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
                  face=arial color=#000000 size=2>(RPC)</FONT></FONT></TD>
                <TD><FONT style="LINE-HEIGHT: 25px" size=2>
                  <DIV 
                  style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT 
                  style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">RPC_STATUS RPC_ENTRY RpcImpersonateClient( <BR>&nbsp;&nbsp;RPC_BINDING_HANDLE BindingHandle); <BR> 和 <BR>&nbsp;&nbsp;RPC_STATUS RPC_ENTRY RpcRevertToSelfEx( <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RPC_BINDING_HANDLE BindingHandle);</PRE></FONT></DIV></FONT></TD></TR>
              <TR>
                <TD><FONT style="LINE-HEIGHT: 25px" 
                  size=2>通讯端或任何其他传输机制(经由SSPI)-在第十二章中讨论</FONT></TD>
                <TD><FONT style="LINE-HEIGHT: 25px" size=2>
                  <DIV 
                  style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT 
                  style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">SECURITY_STATUS ImpersonateSecurityContext( <BR>&nbsp;&nbsp;PCtxtHandle phContext ); <BR> 和 <BR>&nbsp;&nbsp;SECURITY_STATUS RevertSecurityContext( <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PCtxtHandle phContext);</PRE></FONT></DIV></FONT></TD></TR></TBODY></TABLE></CENTER>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>以下列出的SetThreadToken函数,可让您使用线程的handle任意地选择任何线程的模拟权杖。pThread参数是个指向您要调整的线程handle指标,传递NULL以指出当前的线程。hToken参数指出用来模拟的权杖,NULL值将导致线程回复成程序等级的权杖。</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 SetThreadToken( <BR> PHANDLE pThread, <BR> HANDLE hToken);</PRE></FONT></DIV>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>起先粗略地浏览时,发觉SetThreadToken函数似乎是不必要的。为什么不就使用适合您通讯机制的模拟函数呢?答案是,模拟缺少了一样特色-即模拟堆叠 
            的概念。让我来解释一下。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>假如您用权杖A呼叫ImpersonateLoggedOnUser,然后再用权杖B呼叫一个呼叫到ImpersonateLoggedOnUser的函数,当这个函数在呼叫RevertToSelf时,系统将会使线程的权杖回复到程序权杖。系统没有记忆线程跟权杖A的结合。通常,您会控制您的程序代码并避免像这样的情况。但是以下有两个值得注意的例外情形:</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">被用来扩充其他软件的DLL专案,例如扩充Microsoft 
              Internet Information Services的ISAPI。<BR 
              style="LINE-HEIGHT: 25px">  </LI></UL></FONT>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>为了伪造模拟堆叠,您的函数必需经由呼叫OpenThreadToken,以撷取其当前权杖的handle(我们已经讨论过),把它储存起来(最有可能在堆叠上),然后再呼叫适合的模拟函数,而非呼叫相符的「回复」函数,您的程序代码需要使用SetThreadToken以恢复被储存的权杖。这个方法使您的函数用它找到线程的方法把线程带回呼叫的程序代码中。</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>在高效能的服务器环境中,网路上的通讯模拟资讯开销是不受欢迎的。在许多情况下,您可以经由在连结上呼叫适合的模拟函数来达到最好的效能,然后再呼叫OpenThreadToken撷取及储存模拟线程权杖的handle。之后,当服务中的线程执行客户端更进一步的请求时,您可以使用SetThreadToken或ImpersonateLoggedOnUser模拟储存的权杖。</FONT></P>
            <HR style="LINE-HEIGHT: 25px">
            <A style="LINE-HEIGHT: 25px" name=211005></A>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#3e70d7 
            size=5><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>如同前面所提的,若要您的服务或任何应用程序从头开始建立一个权杖是不可能的-系统必须为您建立权杖。但是Windows可让您以现存的权杖为基础,再加上一些额外的限制以建立一个新的权杖。这个新的权杖即是受限的权杖。受限的权杖可帮助您的软件用非常清楚的解决办法来符合一些复杂的安全性需求。</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">停用信任成员帐户的权杖SIDs。<BR 
              style="LINE-HEIGHT: 25px">  
              <LI style="LINE-HEIGHT: 25px">增加信任成员帐户的「受限SIDs」。<BR 
              style="LINE-HEIGHT: 25px">  </LI></UL></FONT>
            <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>在建立一个受限的权杖时,可以选择一组您不想授予新权杖的权限,它与停用的权限不同。并不是您明确地指定从新权杖中移除权限。您可能会有想使用现存的安全性环境,但是需要删除某些权限的情况。例如,您可能会使用自己的环境,或者经由模拟而收到并移除SE_SHUTDOWN_NAME或SE_TCB_NAME权限的环境。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#3e72d7 
            size=4><B style="LINE-HEIGHT: 25px">停用权杖SIDs<BR 
            style="LINE-HEIGHT: 25px"> </B></FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>在建立一个受限的权杖时,可以选择停用现存权杖中的哪个信任成员。被停用的信任成员可以是权杖使用者及群组成员的任一种组合。当存取检查被执行时,任何被选择加入停用清单的SIDs的信任成员将只被用来拒绝存取。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>例如,假设权杖使用者具有TEMP 
            USERS群组中的成员资格,当拒绝使用者存取C:\Permanent目录,而授予使用者存取C:\Temp目录时,假如TEMP 
            USERS群组的SID被选为受限权杖中的停用SID,则群组中的成员资格将不再被允许存取C:\Temp目录,但是它仍旧被拒绝存取C:\Permanent目录。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>您可以只停用已经存在于原始权杖的SIDs,而停用权杖中的信任成员不会以任何方法影响权杖的身分识别。例如,停用权杖使用者只会影响物件的存取权。权杖仍旧会识别特定的使用者。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#3e72d7 
            size=4><B style="LINE-HEIGHT: 25px">增加受限的SIDs<BR 
            style="LINE-HEIGHT: 25px"> </B></FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>除了停用现存的SIDs外,您还可以建立一组信任成员或SIDs,即受限的SIDs,并将它动态地加入您的新权杖。您可能会认为动态地加入信任成员到权杖的能力是非常强大的。但是其隐藏的困难是新的SIDs会被用来作为存取安全物件的再确认。不只存取检查必须在存取被授予前即清除权杖「天生的」信任成员,它也必须清除一组新的受限信任成员。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>使用受限的SIDs与建立次要的权杖类似,它会确保权杖在物件上执行任可行为前,已经拥有安全物件的存取权。但是使用受限的权杖时,这个次要检查会被系统自动地处理。受限的SIDs稍微改变存取检查,实际上它们必须被执行两次:一次是权杖中天生的SIDs,另一次则是受限的SIDs。只有当两者都执行成功时,才表示允许存取检查(有关存取检查的更详细讨论,请参阅&nbsp;</FONT><FONT 
            style="LINE-HEIGHT: 25px" face=arial color=#000000 size=2><A 
            style="LINE-HEIGHT: 25px" 
            href="http://e-msbooks.com/relaunch/XML/paser.asp?src=957-2085-84-0_210.xml#" 
            target=_new>第十章</A>&nbsp;)。</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">&nbsp;权杖&nbsp;</B></FONT>的函数,CreateRestrictedToken:</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 CreateRestrictedToken( <BR> HANDLE hExistingTokenHandle, <BR> DWORD dwFlags, <BR> DWORD dwDisableSidCount, <BR> PSID_AND_ATTRIBUTES pSidsToDisable, <BR> DWORD dwDeletePrivilegeCount, <BR> PLUID_AND_ATTRIBUTES pPrivilegesToDelete, <BR> DWORD dwRestrictedSidCount, <BR> PSID_AND_ATTRIBUTES pSidsToRestrict, <BR> PHANDLE phNewTokenHandle);</PRE></FONT></DIV>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>hExistingTokenHandle参数是新权杖被建立的原始权杖。CreateRestrictedToken以传递给hExistingTokenHandle参数的权杖handle为基础,建立一个新的权杖。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>这个handle必须有TOKEN_DUPLICATE的存取权。任何作为授限权杖的原始权杖皆是合法的,除了已经有授限SIDs清单的权杖外。您可以经由传递它的handle到IsTokenRestricted函数,以查明权杖是否包含了受限SIDs:</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 IsTokenRestricted( <BR> HANDLE TokenHandle);</PRE></FONT></DIV>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>假如您想让新的权杖只允许不需要权限的功能时,可以传递DISABLE_MAX_PRIVILEGE给dwFlags参数。假如您只想删除权限的子集合,可以传递0。传递0是较常见的情况。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>dwDisableSidCount参数指出您要确保在新的权杖中被停用的信任成员数量。下一个参数为pSidsToDisable,指向一个SID_AND_ATTRIBUTES结构的阵列,它指出新权杖中停用的群组(或许是权杖使用者)。dwDisableSidCount参数涉及传递给这个参数的项目数量。停用SIDs的特点是新的权杖中存在之SID的SE_GROUP_USE_FOR_DENY_ONLY属性资讯。</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>您可以传递原始权杖中表示的信任成员超集(superset)给pSidsToDisable参数。系统将会忽略不在原始权杖中的任何SID。这样一来,您就可以将停用SIDs的个别清单运用到多于一个拥有不同基本权杖使用者及群组的权杖中。</FONT></P>
            <HR style="LINE-HEIGHT: 25px">

            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>SID_AND_ATTRIBUTES结构之定义如下:</FONT></P>
            <DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT 
            style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">typedef struct _SID_AND_ATTRIBUTES { <BR> PSID Sid; <BR> DWORD Attributes; <BR>}SID_AND_ATTRIBUTES ;</PRE></FONT></DIV>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>此结构的Attributes成员被CreateRestrictedToken所忽视。其他函数,例如GetTokenInformation,使用Attributes成员记录SID的属性,例如SE_GROUP_USE_FOR_DENY_ONLY及SE_GROUP_MANDATORY即是。SID_AND_ATTRIBUTES的Sid成员指向一个SID结构,它指出您想在新的权杖中停用的信任成员。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>您的服务器应该传递一个SID_AND_ATTRIBUTES结构的阵列给CreateRestrictedToken的pSidsToDisable参数。假如您不想要停用新权杖中的任何信任成员时,应该传递0给dwDisableSidCount及NULL给pSidsToDisable参数。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>除了pPrivilegesToDelete指向一个LUID_AND_ATTRIBUTES结构的阵列之外,CreateRestrictedToken的dwDeletePrivilegeCount及pPrivilegesToDelete参数与「停用的SID」参数的运作同样。当在使用停用的SIDs时,如果您不想删除任何权限,则传递0及NULL给dwDeletePrivilegeCount及pPrivilegesToDelete是适当的。有关LUID_AND_ATTRIBUTES结构的详细讨论,请参阅本章前面之〈&nbsp;<A 

⌨️ 快捷键说明

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