贝贝花花包包店,精品555皮具,钱夹,皮夹

字体: | 推荐给好友 上一篇 | 下一篇

Windows2000 服务器端应用程序开发设计指南-使用者环境

发布: 2008-5-01 20:40 | 作者: Jeffrey Richter Jaso | 来源: 网络转载 | 查看: 375次

HANDLE hToken; 

if(!OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY,&hToken)){
//错误
}
TOKEN_USER*ptUser =(TOKEN_USER*)AllocateTokenInformation(hToken,
TokenUser);
if (ptUser !=NULL){
//对经由ptUser->User指向的SID作些事情
}
TOKEN_DEFAULT_DACL*ptDACL =
(TOKEN_DEFAULT_DACL*)AllocateTokenInformation(hToken,
TokenDefaultDacl);
if (ptDACL !=NULL){
//对经由ptDACL->DefaultDacl指向的DACL作些事情
}

请注意,有一些经由GetTokenInformation传回的结构,使用了SID_AND_ATTRIBUTES结构,其定义如下:

typedef struct _SID_AND_ATTRIBUTES {
PSID Sid; 

DWORD Attributes;
}SID_AND_ATTRIBUTES ;

这个结构包括一个信任成员帐户的SID及一位属性 成员,它包括有关SID的资讯。有关包含一个SID_AND_ATTRIBUTES结构的特殊结构,其属性 成员的含义请参阅《Platform SDK》文件。

以下的函数,AllocateTokenLogonSID,使用AllocateTokenInformation范例函数撷取权杖的群组SIDs,然后反覆浏览SIDs,以找到本节先前讨论的登录SID。这个函数经由检查属性 成员的SE_GROUP_LOGON_ID标记找到登录SID。应该使用LocalFree释放传回的PSID。

PSID AllocateTokenLogonSID(HANDLE hToken){ 

PSID psidLogon =NULL;
TOKEN_GROUPS*ptGroups =NULL;
__try{
//取得权杖群组
ptGroups =(TOKEN_GROUPS*)
AllocateTokenInformation(hToken,TokenGroups);
if (ptGroups ==NULL)
__leave;
//找到登录SID
int nCount =ptGroups->GroupCount;
while (nCount--){
if ((ptGroups->Groups [nCount ].Attributes &SE_GROUP_LOGON_ID)
!=0)
break;
}
if (nCount ==-1)
__leave;//No logon SID found
//为传回SID的取得内存
ULONG lLen =GetLengthSid(ptGroups->Groups [nCount ].Sid);
psidLogon =(PSID)LocalAlloc(LPTR,lLen);
if (psidLogon ==NULL)
__leave;
//复制登录SID
if(!CopySid(lLen,psidLogon,ptGroups->Groups [nCount ].Sid)){
LocalFree(psidLogon);
psidLogon =NULL;
__leave;
}
}__finally{
if (ptGroups !=NULL)
LocalFree(ptGroups);
}
return (psidLogon);
}

TokenMaster范例应用程序
 

TokenMaster范例应用程序(「11 TokenMaster.exe」)示范与权杖相关之系统函数的使用,包括GetTokenInformation及SetTokenInformation。范例应用程序的原始程序代码及文件存放在随书光碟的11-TokenMaster目录中。这个程序可让您从四个来源之一获得权杖:处理程序、线程、使用者凭证或者经由复制。这个程序也可让您检视及修改权杖资讯。当使用者执行TokenMaster时,会出现如图11-1中的对话盒画面。

 图11-1 TokenMaster范例应用程序的使用者界面

这个范例的原始程序代码将能帮助您了解如何运用本章讨论过的观念。作为TokenMaster范例应用程序的使用者,您可以浏览Windows 2000中的许多使用者环境功能。在讨论某些编写程序的技巧之前,会先叙述TokenMaster的部份。

当TokenMaster被执行时,它的第一个工作即是检查它自己的使用者身分识别。假如它在本机帐户之外的任何帐户下执行,会进行以下步骤,试图提升自己:

  1. 列举系统中执行的处理程序,并且找出系统处理程序。
  2. 使用OpenProcessToken获得系统处理程序权杖的handle。
  3. 使用CreateProcessAsUser(在本章稍后讨论)在本机帐户使用者环境下再执行它自己。
  4. 假如这叁个步骤都成功,则TokenMaster会知道存在于它本身之中的一个新的且更强大的实例已经被启动。

假如您在本机帐户下执行了范例应用程序,则TokenMaster的特色对您有更大的教育意义,但是执行前叁个步骤时,需要特定的权利。假如您对执行TokenMaster所有的潜在功能有兴趣,必须作以下步骤:

  1. 以系统的管理者登录。
  2. 使用第九章的TrusteeMan范例应用程序或者Microsoft管理主控台(MMC)群组原则嵌入式管理单元,增加「增加配额」及「更换程序层Token」权限到您的使用者帐户中。
  3. 登出,然后再次登录,以使新的权限生效。
  4. 启动TokenMaster。

假如您执行成功,当您执行TokenMaster时,应用程序中的状态视窗应该会包含以下的讯息:「Token Master, Status - Token Master running as SYSTEM」。否则视窗将会指示TokenMaster应以您用来启动应用程序的帐户身分执行。

应用程序的主要函数是检视有关权杖的资讯,以及修改可以被改变的资讯。以下是获得权杖的方法:

  •  从现行的处理程序或线程中开启一个权杖 您可以经由使用Processes及Threads清单方块中选择一个处理程序及附加的线程(假如您对开启一个模拟权杖有兴趣)。点选名称为OpenProcessToken或OpenThreadToken的按钮以抓取权杖。
     
  •  经由用使用者的凭证从系统撷取一个处理程序 您可以输入一个使用者名称及密码,以及选择一个登入类型及提供者。TokenMaster使用LogonUser(在本章稍后讨论)从系统撷取权杖。
     
  •  复制一个现存的权杖 假如您已经由TokenMaster中获得一个可使用的权杖,则您可以点选DuplicateTokenEx按钮来复制权杖。这个复制选项可让您设定模拟等级和新权杖的权杖类型。假如TokenMaster中有一个可被复制的权杖,则权杖资讯视窗将会显示权杖资讯。
     

在您取得一个权杖后,您将会在Token Information视窗中看到权杖资讯清单。您可以经由使用GetTokenInformation函数,以检视所有可取得的权杖资讯。

使用TokenMaster,您可以使用多种方法来修改及调整权杖:

  • 调整权杖群组及权限,包括使个别项目启动或失效的能力。
     
  • 修改权杖的预设DACL。有关预设DACLs的更多资讯,请参阅  第十章 。
     
  • 建立一个受限的权杖。
     
  • 使用权杖来启动可执行档。这是TokenMaster的一个特别有用的特色。您可以经由使用TokenMaster修改过的权杖建立一个新的处理程序。这可让您改变权杖或者以某些方法限制它,然后再启动程序代码,看看程序如何受影响。
     

强烈地建议您花些时间使用TokenMaster范例应用程序,熟悉有关Windows使用者环境的特色。

您也将发现TokenMaster可以被用来减轻侦错的处理程序。例如,我常常从本机帐户处理程序中启动应用程序以及「窃取」权杖。然后再使用这个权杖执行Microsoft Visual Studio开发环境,就可以从本机使用者帐户编译及测试程序代码。就安全性而论,在一个服务中执行类似的测试程序代码时,应使用本机帐户权杖。

这个范例应用程序的原始程序代码中示范了一些有用的程序设计策略。首先,它几乎呼叫了本章所涵盖的每个系统函数。如果您对Windows的安全性程序设计没有经验,它也提供一些对您可能有帮助的秘诀。

Windows安全性函数时常需要配置及较小缓冲器的重新配置。这个要求时常被开发人员视为麻烦,包括我自己。结果,就会很想固定缓冲器的大小,或作些能导致程序代码不密闭的其他让步。TokenMaster范例应用程序经由利用一个简单的范本类别,即CAutoBuf,提出这个要求。此时您将会看到这个类别大大地简化了程序代码的部份,在那里,系统函数可以要求可变大小的缓冲器。

 

评分:0

我来说两句

seccode