存取权利
存取权利起先看起来似乎是个需要理解的简单观点,但是有某些重点可能不够明显。要了解存取权利之细微差别的最好方法是讨论它们被使用在哪里并检查每个群组。让我们先复习已经知道的部分:
- 系统在代表信任成员的安全对象上执行任何安全性作业之前,信任成员必须持有存取权利的组合。
- 所有存取权利都被封装成一个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 服务器端应用程序开发设计指南-存取控制(2) |
热 ![Windows2000 服务器端应用程序开发设计指南-存取控制(6) - Mickor.Guo - Mickor.Guo]()
|
|
|
| |
Windows2000 服务器端应用程序开发设计指南-存取控制(2)
|
[日期:2006-10-30 来源:ACE开发者 作者:Jeffrey Richter Jason D. Clark]
|
[字体: ]
|
|
| 对象类型 | 通用权利 | 标准及特定对应的权利 |
| 文件 |
|
|
| |
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] 下一页
|
|