Windows2000 服务器端应用程序开发设计指南-存取控制(6)

存取权利

 

存取权利起先看起来似乎是个需要理解的简单观点,但是有某些重点可能不够明显。要了解存取权利之细微差别的最好方法是讨论它们被使用在哪里并检查每个群组。让我们先复习已经知道的部分:

  • 系统在代表信任成员的安全对象上执行任何安全性作业之前,信任成员必须持有存取权利的组合。

     

     

  • 所有存取权利都被封装成一个32位元的存取遮罩(请察看 图10-2 )。

     

     

  • 存取权利被分割成叁类:通用权利(3位元1-28)、标准权利(位元22-16)及特定权利(位元15-0)。

     

     

  • 存取遮罩中的两个「奇数」位元不符合存取权利群组:即稽核位元及最大的允许位元。

     

     

 

截至目前为止,我们已经讨论过储存在ACE中的存取遮罩之存取权利,它只是交易处理的其中一部份。我说过权利是执行工作所需的,但是并没有明确说明应如何向系统要求权利。要求权利是交易处理的另一部份。

通常当您在向系统要求一个对象的handle时,即是在要求一个权利。大部分传回安全对象handle的函数皆有一个必须的存取参数,您必须传递一个值以指出您打算如何使用此handle。请看以下的范例:

HANDLE hEvent = OpenEvent(EVENT_ALL_ACCESS, FALSE, TEXT("MyEvent"));

您可能已经非常熟悉像这样的程序代码,但是却怎么也没想到您是在向系统要求这个事件对象的特定存取权利。您传递到OpenEvent(及其他类似的函数)存取参数的标记位元与储存在保护对象安全之ACEs的位元是相同的。事实上,系统在传回事件的handle前就会执行存取检查。


 

说明

Windows中有许多安全对象皆是透过handles被存取。当这些对象的handle被要求时会检查其安全性,而您的权利会和此handle一起被储存。这意味着一旦您已经收到某个对象的handle时,对象本身的存取权利可能会改变,而经由handle提供给您的存取则仍是相同的,直到handle被结束为止。


 

某些在对象上执行安全活动的handle是您从未见过的。这个理想的范例即是呼叫GetNamedSecurityInfo,此函数在您不须先撷取某个对象handle时很方便。在这个实例中,系统内部在执行任何安全性活动前,会先执行存取检查。

您现在已经熟悉了ACE及存取权利的存取要求,让我们开始讨论更详细的存取权利类型。首先,我们需要在不同的存取遮罩中取得「奇数」位元。

稽核位元代表存取权利ACCESS_SYSTEM_SECURITY,在使用者可以修改对象的SACL前,它必须由信任成员持有(本章稍后将会更详细讨论稽核的内容)。

最大的允许位元代表「非存取权利」MAXIMUM_ ALLOWED,我称它为非存取权利是因为它从不会在储存于DACL的ACE中发现。只在呼叫函数要求存取时被使用。

例如,以下的程序代码片段在撷取指定事件对象的handle时使用MAXIMUM_ALLOWED标记:

HANDLE hEvent = OpenEvent(MAXIMUM_ALLOWED, FALSE, TEXT("MyEvent"));

在这个实例中,系统会在对象上执行存取检查,而非允许或拒绝存取检查,它会传回授予您这个对象之最大权利的存取遮罩。这似乎是个非常方便的特色(在某些情况下它是),当要求一个handle时,它允许您总是传递MAXIMUM_ ALLOWED,而不强迫您正确地描绘所需对象的哪个权利。然而,有一个不用如此做的好理由。

当您取得对象的handle时,通常会被系统告知您被允许以某些方法使用这个对象。假如您在要求handle时被拒绝,通常即表示着您不被允许作所要求的任何事,此时您的软件可以采取适当的方法。

假如您每次需要存取时皆传递MAXIMUM_ALLOWED到对象上,那么您的程序代码在一段长时间内可能会运作良好。但是当您的程序第一次遇到没有授予足够存取的对象时,您的软件在撷取对象handle前,可能不会抓取错误。执行失败的函数可能甚至不传回ERROR_ACCESS_DENIED。函数会传回另一个错误,例如ERROR_INVALID_PARAMETER,是很有可能的事,因为您传递了一个handle以及对象的不充分存取权限给它。有这种问题的程序代码可能更难除错。

 标准存取权利 系统定义了五个标准权利。除了这些之外,另外五个「复合的」存取权利则由系统定义对应到五个标准权利的某些组合。

并非所有的标准权利都与系统之所有安全对象有关,但是每个标准权利都是特殊的,因为其本身的涵义不是从对象变成对象。例如,不是所有的对象都能被删除,所以标准权利DELETE对某些对象来说没有意义。然而,对于可以被删除的对象来说,标准权利DELETE可从一个对象类型传递相同的涵义到下一个可删除对象权利的持有者。表10-13列出所有标准及复合权利。)。执行后产生如表10-15的内容。

 

 
Windows2000 服务器端应用程序开发设计指南-存取控制(6) - Mickor.Guo - Mickor.Guo Windows2000 服务器端应用程序开发设计指南-存取控制(6) - Mickor.Guo - Mickor.Guo

 

 

设为首页

 

加入收藏

 

 
  首页 Windows2000 服务器端应用程序开发设计指南-存取控制(6) - Mickor.Guo - Mickor.Guo 文章 Windows2000 服务器端应用程序开发设计指南-存取控制(6) - Mickor.Guo - Mickor.Guo 资料 Windows2000 服务器端应用程序开发设计指南-存取控制(6) - Mickor.Guo - Mickor.Guo 论坛  
   位置: ACE开发者 >> 文章 >> 网络编程 >> 正文  

 

 

 
阅读→Windows2000 服务器端应用程序开发设计指南-存取控制(2)

 

热   Windows2000 服务器端应用程序开发设计指南-存取控制(6) - Mickor.Guo - Mickor.Guo

 

 

 

 

 

 

Windows2000 服务器端应用程序开发设计指南-存取控制(2)

 

 

[日期:2006-10-30    来源:ACE开发者    作者:Jeffrey Richter Jason D. Clark]

 

 

[字体: Windows2000 服务器端应用程序开发设计指南-存取控制(6) - Mickor.Guo - Mickor.Guo]

 

 

 

 

 表10-15 常见安全对象的一般对应
对象类型通用权利标准及特定对应的权利
文件    
 

 

GENERIC_READ  

GENERIC_WRITE  

GENERIC_EXECUTE                                

      GENERIC_ALL

 

 

FILE_GENERIC_READ  

FILE_GENERIC_WRITE  

FILE_GENERIC_EXECUTE                                

      FILE_ALL_ACCESS

 

目录    
 

 

GENERIC_READ

 

 

STANDARD_RIGHTS_READ|  

FILE_LIST_DIRECTORY |                                

      FILE_ADD_FILE

 

 

 

GENERIC_WRITE

 

 

STANDARD_RIGHTS_WRITE|  

FILE_ADD_SUBDIRECTORY |                                

      FILE_READ_EA

 

 

 

GENERIC_EXECUTE

 

 

STANDARD_RIGHTS_EXECUTE|  

FILE_LIST_DIRECTORY |                                

      FILE _ADD_FILE

 

 

 

GENERIC_ALL

 

 

STANDARD_RIGHTS_REQUIRED|  

FILE_LIST_DIRECTORY |  

FILE_ADD_FILE|  

FILE_ADD_SUBDIRECTORY |                              

      FILE_READ_EA

 

服务    
 

 

GENERIC_READ

 

 

STANDARD_RIGHTS_READ|  

SERVICE_QUERY_CONFIG|  

SERVICE_QUERY_STATUS|  

SERVICE_ENUMERATE_DEPENDENTS|  

SERVICE_INTERROGATE|                                

      SERVICE_USER_DEFINED_CONTROL

 

 

 

GENERIC_WRITE

 

 

STANDARD_RIGHTS_WRITE|                                

      SERVICE_CHANGE_CONFIG

 

 

 

GENERIC_EXECUTE

 

 

STANDARD_RIGHTS_EXECUTE|  

SERVICE_START|  

SERVICE_STOP|  

SERVICE_PAUSE_CONTINUE|  

SERVICE_INTERROGATE|                                

      SERVICE_USER_DEFINED_CONTROL

 

 

 

GENERIC_ALL

 

 

SERVICE_ALL_ACCESS

 

打印机    
 

 

GENERIC_READ  

GENERIC_WRITE

GENERIC_EXECUTE                                

      GENERIC_ALL

 

 

PRINTER_READ  

PRINTER_WRITE  

PRINTER_EXECUTE                              

      PRINTER_ALL_ACCESS

 

登录机码    
 

 

GENERIC_READ  

GENERIC_WRITE  

GENERIC_EXECUTE                                

      GENERIC_ALL

 

 

KEY_READ  

KEY_WRITE  

KEY_EXECUTE                              

      KEY_ALL_ACCESS

 

程序    
 

 

GENERIC_READ

 

 

STANDARD_RIGHTS_READ|  

PROCESS_VM_READ|                                

      PROCESS_QUERY_INFORMATION

 

 

 

GENERIC_WRITE

 

 

STANDARD_RIGHTS_WRITE|  

PROCESS_CREATE_PROCESS|  

PROCESS_CREATE_THREAD|  

PROCESS_VM_OPERATION|  

PROCESS_VM_WRITE|  

PROCESS_DUP_HANDLE|  

PROCESS_TERMINATE|

PROCESS_SET_QUOTA|                                

      PROCESS_SET_INFORMATION

 

 

 

GENERIC_EXECUTE

 

 

STANDARD_RIGHTS_EXECUTE|                              

      SYNCHRONIZE

 

 

 

GENERIC_ALL

 

 

PROCESS_ALL_ACCESS

 

线程    
 

 

GENERIC_READ

 

 

STANDARD_RIGHTS_READ|  

THREAD_GET_CONTEXT|                                

      THREAD_QUERY_INFORMATION

 

 

 

GENERIC_WRITE

 

 

STANDARD_RIGHTS_WRITE|  

THREAD_TERMINATE|  

THREAD_SUSPEND_RESUME|  

THREAD_SET_INFORMATION|                                

      THREAD_SET_CONTEXT

 

 

 

GENERIC_EXECUTE

 

 

STANDARD_RIGHTS_EXECUTE|                                

      SYNCHRONIZE

 

 

 

GENERIC_ALL

 

 

THREAD_ALL_ACCESS

 

工作    
 

 

GENERIC_READ

 

 

STANDARD_RIGHTS_READ|                                

      JOB_OBJECT_QUERY

 

 

 

GENERIC_WRITE

 

 

STANDARD_RIGHTS_WRITE|  

JOB_OBJECT_ASSIGN_PROCESS|  

JOB_OBJECT_SET_ATTRIBUTES|                                

      JOB_OBJECT_TERMINATE

 

 

 

GENERIC_EXE, CUTE

 

 

STANDARD_RIGHTS_EXECUTE|                                

      SYNCHRONIZE

 

 

 

GENERIC_ALL

 

 

JOB_OBJECT_ALL_ACCESS

 

号志(Semaphore)    
 

 

GENERIC_READ

 

 

STANDARD_RIGHTS_READ|                                

      MUTANT_QUERY_STATE

 

 

 

GENERIC_WRITE

 

 

STANDARD_RIGHTS_WRITE|                                

      SEMAPHORE_MODIFY_STATE

 

 

 

GENERIC_EXECUTE

 

 

STANDARD_RIGHTS_EXECUTE|                                

      SYNCHRONIZE

 

 

 

GENERIC_ALL

 

 

SEMAPHORE_ALL_ACCESS

 

事件    
 

 

GENERIC_READ

 

 

STANDARD_RIGHTS_READ|                                

      MUTANT_QUERY_STATE

 

 

 

GENERIC_WRITE

 

 

STANDARD_RIGHTS_WRITE|                                

      EVENT_MODIFY_STATE

 

 

 

GENERIC_EXECUTE

 

 

STANDARD_RIGHTS_EXECUTE|                                

      SYNCHRONIZE

 

 

 

GENERIC_ALL

 

 

EVENT_ALL_ACCESS

 

Mutex    
 

 

GENERIC_READ

 

 

STANDARD_RIGHTS_READ|                                      MUTANT_QUERY_STATE

 

 

 

GENERIC_WRITE

 

 

STANDARD_RIGHTS_WRITE

 

 

 

GENERIC_EXECUTE

 

 

STANDARD_RIGHTS_EXECUTE|                                     SYNCHRONIZE

 

 

 

GENERIC_ALL

 

 

MUTEX_ALL_ACCESS

 

文件对应对象    
 

 

GENERIC_READ

 

 

STANDARD_RIGHTS_READ |  

FILE_MAP_COPY |                                

      FILE_MAP_READ

 

 

 

GENERIC_WRITE

 

 

STANDARD_RIGHTS_WRITE|                                

      FILE_MAP_WRITE

 

 

 

GENERIC_EXECUTE

 

 

STANDARD_RIGHTS_EXECUTE|                                

      FILE_MAP_EXECUTE

 

 

 

GENERIC_ALL

 

 

FILE_MAP_ALL_ACCESS

 

可等待的计时器    
 

 

GENERIC_READ

 

 

STANDARD_RIGHTS_READ|                                

      TIMER_QUERY_STATE

 

 

 

GENERIC_WRITE

 

 

STANDARD_RIGHTS_WRITE|                                

      TIMER_MODIFY_STATE

 

 

 

GENERIC_EXECUTE

 

 

STANDARD_RIGHTS_EXECUTE|                                

      SYNCHRONIZE

 

 

 

GENERIC_ALL

 

 

TIMER_ALL_ACCESS

 

权杖(Token)    
 

 

GENERIC_READ  

GENERIC_WRITE

GENERIC_EXECUTE                                

      GENERIC_ALL

 

 

TOKEN_READ  

TOKEN_WRITE  

TOKEN_EXECUTE                                

      TOKEN_ALL_ACCESS

 

Window 站台    
 

 

GENERIC_READ

 

 

WINSTA_ENUMDESKTOPS|  

WINSTA_READATTRIBUTES|  

WINSTA_ENUMERATE |  

WNSTA_READSCREEN|                                

      STANDARD_RIGHTS_READ

 

 

 

GENERIC_WRITE

 

 

WINSTA_ACCESSCLIPBOARD|  

WINSTA_CREATEDESKTOP|  

WINSTA_WRITEATTRIBUTES|                                

      STANDARD_RIGHTS_WRITE

 

 

 

GENERIC_EXECUTE

 

 

WINSTA_ACCESSGLOBALATOMS |

WINSTA_EXITWINDOWS|                                

      STANDARD_RIGHTS_EXECUTE

 

 

 

GENERIC_ALL

 

 

WINSTA_ENUMDESKTOPS|  

WINSTA_READATTRIBUTES|  

WINSTA_ENUMERATE |  

WINSTA_READSCREEN|  

WINSTA_ACCESSCLIPBOARD|  

WINSTA_CREATEDESKTOP|  

WINSTA_WRITEATTRIBUTES|  

WINSTA_ACCESSGLOBALATOMS|  

WINSTA_EXITWINDOWS|                                

      STANDARD_RIGHTS_REQUIRED

 

桌面    
 

 

GENERIC_READ

 

 

DESKTOP_READOBJECTS|  

DESKTOP_ENUMERATE|                                

      STANDARD_RIGHTS_READ

 

 

 

GENERIC_WRITE

 

 

DESKTOP_WRITEOBJECTS|  

DESKTOP_CREATEWINDOW|  

DESKTOP_CREATEMENU|  

DESKTOP_HOOKCONTROL|  

DESKTOP_JOURNALRECORD|  

DESKTOP_JOURNALPLAYBACK|                                

      STANDARD_RIGHTS_WRITE

 

 

 

GENERIC_EXECUTE

 

 

DESKTOP_SWITCHDESKTOP|                                

      STANDARD_RIGHTS_EXECUTE

 

 

 

GENERIC_ALL

 

 

DESKTOP_READOBJECTS|  

DESKTOP_WRITEOBJECTS|  

DESKTOP_ENUMERATE|  

DESKTOP_CREATEWINDOW|  

DESKTOP_CREATEMENU|  

DESKTOP_HOOKCONTROL|  

DESKTOP_JOURNALRECORD|  

DESKTOP_JOURNALPLAYBACK|  

DESKTOP_SWITCHDESKTOP|                                

      STANDARD_RIGHTS_REQUIRED

 

< p>

 

 

上一页  [1] [2] [3] [4]  下一页

posted @ 2013-02-27 12:18  csafu  阅读(113)  评论(0)    收藏  举报