这个函数中的各个参数代表着什么意思?
和它关联的这几个函数的起什么作用呢?
OpenProcessToken(),LookupPrivilegevalue(),
我在看一些例子的时候,有一个这样的类:
TTokanPrivileges. 当定义一个变量:Privileges:TTokenPrivileges;时
Privileges.PrivilegeCount其中PrivilegeCount这个字段是什么意思呢?
我在看MSDN的时候,因为全是英文,有些意思不太清楚,还请各位高手大侠指点!谢谢!
和它关联的这几个函数的起什么作用呢?
OpenProcessToken(),LookupPrivilegevalue(),
我在看一些例子的时候,有一个这样的类:
TTokanPrivileges. 当定义一个变量:Privileges:TTokenPrivileges;时
Privileges.PrivilegeCount其中PrivilegeCount这个字段是什么意思呢?
我在看MSDN的时候,因为全是英文,有些意思不太清楚,还请各位高手大侠指点!谢谢!
HANDLE TokenHandle, // handle to token
BOOL DisableAllPrivileges, // disabling option
PTOKEN_PRIVILEGES NewState, // privilege information
DWORD BufferLength, // size of buffer
PTOKEN_PRIVILEGES PreviousState, // original state buffer
PDWORD ReturnLength // required buffer size
);
第一个参数是访问令牌的句柄;第二个参数决定是进行权限修改还是除能(Disable)所有权限;第三个参数指明要修改的权限,是一个指向TOKEN_PRIVILEGES结构的指针,该结构包含一个数组,数据组的每个项指明了权限的类型和要进行的操作; 第四个参数是结构PreviousState的长度,如果
PreviousState为空,该参数应为NULL;第五个参数也是一个指向TOKEN_PRIVILEGES结构的指针,存放修改前的访问权限的信息,可空;最后一个参数为实际PreviousState结构返回的大小。在使用这个函数前再看一下TOKEN_PRIVILEGES这个结构,其声明如下:typedef struct _TOKEN_PRIVILEGES {
DWORD PrivilegeCount;
LUID_AND_ATTRIBUTES Privileges[];
} TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES; PrivilegeCount指的数组原素的个数,接着是一个LUID_AND_ATTRIBUTES类型的数组,再来看一下LUID_AND_ATTRIBUTES这个结构的内容,声明如下:typedef struct _LUID_AND_ATTRIBUTES {
LUID Luid;
DWORD Attributes;
} LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES第二个参数就指明了我们要进行的操作类型,有三个可选项:
SE_PRIVILEGE_ENABLED、SE_PRIVILEGE_ENABLED_BY_DEFAULT、
SE_PRIVILEGE_USED_FOR_ACCESS。要使能一个权限就指定Attributes为
SE_PRIVILEGE_ENABLED。第一个参数就是指权限的类型,是一个LUID的
值,LUID就是指locally unique identifier,我想GUID大家是比较熟
悉的,和GUID的要求保证全局唯一不同,LUID只要保证局部唯一,就是
指在系统的每一次运行期间保证是唯一的就可以了。另外和GUID相同的
一点,LUID也是一个64位的值,相信大家都看过GUID那一大串的值,我
们要怎么样才能知道一个权限对应的LUID值是多少呢?这就要用到另外
一个API函数LookupPrivilegeValue,其原形如下:BOOL LookupPrivilegeValue(
LPCTSTR lpSystemName, // system name
LPCTSTR lpName, // privilege name
PLUID lpLuid // locally unique identifier
);
第一个参数是系统的名称,如果是本地系统只要指明为NULL就可以了,
第三个参数就是返回LUID的指针,第二个参数就是指明了权限的名称,
如“SeDebugPrivilege”。在Winnt.h中还定义了一些权限名称的宏,
如:
#define SE_BACKUP_NAME TEXT("SeBackupPrivilege")
#define SE_RESTORE_NAME TEXT("SeRestorePrivilege")
#define SE_SHUTDOWN_NAME TEXT("SeShutdownPrivilege")
#define SE_DEBUG_NAME TEXT("SeDebugPrivilege")
这样通过这三个函数的调用,我们就可以用OpenProcess(PROCESS_ALL_ACCESS,FALSE, dwProcessID)来打获得任意进程的句柄,并
且指定了所有的访问权。