windows提取程序权限函数

  1. //提升权限  
  2. bool EnableSpecificPrivilege(LPCTSTR lpPrivilegeName)  
  3. {  
  4.   
  5.     HANDLE hToken = NULL;  
  6.     TOKEN_PRIVILEGES Token_Privilege;  
  7.     BOOL bRet = TRUE;  
  8.   
  9.     do   
  10.     {  
  11.         if (0 == OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))  
  12.         {  
  13.             OutputDebugView(_T("OpenProcessToken Error"));  
  14.             bRet = FALSE;  
  15.             break;  
  16.         }  
  17.   
  18.         if (0 == LookupPrivilegeValue(NULL, lpPrivilegeName, &Token_Privilege.Privileges[0].Luid))  
  19.         {  
  20.             OutputDebugView(_T("LookupPrivilegeValue Error"));  
  21.             bRet = FALSE;  
  22.             break;  
  23.         }  
  24.   
  25.         Token_Privilege.PrivilegeCount = 1;  
  26.         Token_Privilege.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;  
  27.         //Token_Privilege.Privileges[0].Luid.LowPart=17;//SE_BACKUP_PRIVILEGE  
  28.         //Token_Privilege.Privileges[0].Luid.HighPart=0;  
  29.   
  30.   
  31.         if (0 == AdjustTokenPrivileges(hToken, FALSE, &Token_Privilege, sizeof(Token_Privilege), NULL,NULL))  
  32.         {  
  33.             OutputDebugView(_T("AdjustTokenPrivileges Error"));  
  34.             bRet = FALSE;  
  35.             break;  
  36.         }  
  37.   
  38.     } while (false);  
  39.   
  40.     if (NULL != hToken)  
  41.     {  
  42.         CloseHandle(hToken);  
  43.     }  
  44.   
  45.     return bRet;  
  46.   
  47. }  

[cpp]  view plain copy
  1.   

lpPrivilegeName 取值:

#define SE_CREATE_TOKEN_NAME              TEXT("SeCreateTokenPrivilege")
#define SE_ASSIGNPRIMARYTOKEN_NAME        TEXT("SeAssignPrimaryTokenPrivilege")
#define SE_LOCK_MEMORY_NAME               TEXT("SeLockMemoryPrivilege")
#define SE_INCREASE_QUOTA_NAME            TEXT("SeIncreaseQuotaPrivilege")
#define SE_UNSOLICITED_INPUT_NAME         TEXT("SeUnsolicitedInputPrivilege")
#define SE_MACHINE_ACCOUNT_NAME           TEXT("SeMachineAccountPrivilege")
#define SE_TCB_NAME                       TEXT("SeTcbPrivilege")
#define SE_SECURITY_NAME                  TEXT("SeSecurityPrivilege")
#define SE_TAKE_OWNERSHIP_NAME            TEXT("SeTakeOwnershipPrivilege")
#define SE_LOAD_DRIVER_NAME               TEXT("SeLoadDriverPrivilege")
#define SE_SYSTEM_PROFILE_NAME            TEXT("SeSystemProfilePrivilege")
#define SE_SYSTEMTIME_NAME                TEXT("SeSystemtimePrivilege")
#define SE_PROF_SINGLE_PROCESS_NAME       TEXT("SeProfileSingleProcessPrivilege")
#define SE_INC_BASE_PRIORITY_NAME         TEXT("SeIncreaseBasePriorityPrivilege")
#define SE_CREATE_PAGEFILE_NAME           TEXT("SeCreatePagefilePrivilege")
#define SE_CREATE_PERMANENT_NAME          TEXT("SeCreatePermanentPrivilege")
#define SE_BACKUP_NAME                    TEXT("SeBackupPrivilege")
#define SE_RESTORE_NAME                   TEXT("SeRestorePrivilege")
#define SE_SHUTDOWN_NAME                  TEXT("SeShutdownPrivilege")
#define SE_DEBUG_NAME                     TEXT("SeDebugPrivilege")
#define SE_AUDIT_NAME                     TEXT("SeAuditPrivilege")
#define SE_SYSTEM_ENVIRONMENT_NAME        TEXT("SeSystemEnvironmentPrivilege")
#define SE_CHANGE_NOTIFY_NAME             TEXT("SeChangeNotifyPrivilege")
#define SE_REMOTE_SHUTDOWN_NAME           TEXT("SeRemoteShutdownPrivilege")
#define SE_UNDOCK_NAME                    TEXT("SeUndockPrivilege")
#define SE_SYNC_AGENT_NAME                TEXT("SeSyncAgentPrivilege")
#define SE_ENABLE_DELEGATION_NAME         TEXT("SeEnableDelegationPrivilege")
#define SE_MANAGE_VOLUME_NAME             TEXT("SeManageVolumePrivilege")
#define SE_IMPERSONATE_NAME               TEXT("SeImpersonatePrivilege")
#define SE_CREATE_GLOBAL_NAME             TEXT("SeCreateGlobalPrivilege")
#define SE_TRUSTED_CREDMAN_ACCESS_NAME    TEXT("SeTrustedCredManAccessPrivilege")
#define SE_RELABEL_NAME                   TEXT("SeRelabelPrivilege")
#define SE_INC_WORKING_SET_NAME           TEXT("SeIncreaseWorkingSetPrivilege")
#define SE_TIME_ZONE_NAME                 TEXT("SeTimeZonePrivilege")
#define SE_CREATE_SYMBOLIC_LINK_NAME      TEXT("SeCreateSymbolicLinkPrivilege")

Note:访问令牌说简单了就是个访问权限的数据集合,令牌中包含用户所有的权限,校验令牌可以识别用户是否有权限访问他要访问的位置
LookupPrivilegeValue 函数查看系统权限的特权值,返回信息到一个LUID结构体里。
  BOOL LookupPrivilegeValue(LPCTSTR lpSystemName,LPCTSTR lpName,PLUID lpLuid);
  第一个参数表示所要查看的系统,本地系统直接用NULL
  第二个参数表示所要查看的特权信息的名称,定义在winnt.h中,具体指请MSDN索引“windows nt privileges”
  第三个参数用来接收所返回的制定特权名称的信息。
  函数调用成功后,信息存入第三个类型为LUID的结构体中,并且函数返回非0。
  函数定义在winbase.h中,链接使用advapi32.lib库。
AdjustTokenPrivileges 函数启用或禁止 指定访问令牌的特权。
启用或禁用特权一个有TOKEN_ADJUST_PRIVILEGES访问的访问令牌.
   BOOL AdjustTokenPrivileges(
   HANDLE  TokenHandle //包含特权的句柄
   BOOL  DisableAllPrivileges ,
  //禁用所有权限标志
   PTOKEN_PRIVILEGES  NewState ,
  //新特权信息的指针(结构体)
   DWORD  BufferLength //大小,以字节为单位的PreviousState的缓存区(sizeof)
   PTOKEN_PRIVILEGES  PreviousState ,
  //接收被改变特权当前状态的Buffer
   PDWORD  ReturnLength//接收PreviousState缓存区要求的大小
   );
   参数
   TokenHandle
  包含要修改特权的访问令牌的标识(句柄).这个句柄必须有TOKEN_ADJUST_PRIVILEGES访问令牌.如果PreviousState不是NULL,这个句柄还必须有TOKEN_QUERY访问特权.
   DisableAllPrivileges
  标志这个函数是否禁用该令牌的所有特权.如果为TRUE,这个函数禁用所有特权,NewState参数无效.如果为假,以NewState参数指针的信息为基础来修改特权.
   NewState
  一个 TOKEN_PRIVILEGES结构体的指针指定了一组特权和他们的属性.
  如果参数DisableAllPrivileges为FALSE, AdjustTokenPrivileges启用或禁用这些令牌的特权.
  如果你给一个特权设置了SE_PRIVILEGE_ENABLED的属性,这个函数将启动特权,否则禁用特权.
  如果DisableAllPrivileges为TRUE,这个参数无效.
   BufferLength
  标志参数PreviousState指针以字节大小缓存区(sizeof).
  如果参数PreviousState是NULL,这个参数可以为NULL.
   PreviousState
  这个函数填充一个TOKEN_PRIVILEGES结构体【指针】,它包括该函数修改之前任何特权状态.这个参数可以为NULL.
  如果指定的缓冲区太小,无法收到完整的修改权限列表,这个函数失败并不会修改任何特权.
  这个函数设置了一个 拥有修改权限完成列表【 参数ReturnLength 】的字节数 的指针变量.[结果的Buffer]
   ReturnLength
  接收 参数PreviousState的缓存区指针的 字节大小 的 变量指针(长度指针).
  如果PreviousState为NULL,这个参数可以为NULL.
   返回值
  如果这个函数成功,返回非0.为了确定这个函数是否修改了所有指定的特权,可以调用 GetLastError函数,当这个函数返回下面的值之一时就代表函数成功:

提权函数之 RtlAdjustPrivilege()

RtlAdjustPrivilege() 这玩意是在 NTDLL.DLL 里的一个不为人知的函数,MS没有公开,原因就是这玩意实在是太NB了,以至于不需要任何其他函数的帮助,仅凭这一个函数就可以获得进程ACL的任意权限!下面是函数定义:NTSTATUS RtlAdjustPrivilege(         ULONG   Privilege,        BOOLEANEnable,        BOOLEANCurrentThread,        PBOOLEANEnabled)参数的含义:Privilege [In] Privilege index to change.                         // 所需要的权限名称,可以到 MSDN 查找关于 Process Token & Privilege 内容可以查到Enable [In] If TRUE, then enable the privilege otherwise disable. // 如果为True 就是打开相应权限,如果为False 则是关闭相应权限CurrentThread [In] If TRUE, then enable in calling thread, otherwise process. // 如果为True 则仅提升当前线程权限,否则提升整个进程的权限Enabled [Out] Whether privilege was previously enabled or disabled.// 输出原来相应权限的状态(打开 | 关闭), 注意:该参数赋予空指针会出错,我测试过。eg:RtlAdjustPrivilege(SE_DEBUG_PRIVILEGE,1,0,NULL);比用 AdjustTokenPrivileges 来提升进程权限方便很多,所以自己整理下备忘这个函数封装在NtDll.dll中(在所有DLL加载之前加载),被微软严格保密,就是说你在MSDN上查不到关于他的任何信息。

常用:常量 SE_BACKUP_PRIVILEGE = 0x11h常量 SE_RESTORE_PRIVILEGE = 0x12h常量 SE_SHUTDOWN_PRIVILEGE = 0x13h常量 SE_DEBUG_PRIVILEGE = 0x14h

全部:

These must be converted to LUIDs before use.//#define SE_MIN_WELL_KNOWN_PRIVILEGE         (2L)#define SE_CREATE_TOKEN_PRIVILEGE           (2L)#define SE_ASSIGNPRIMARYTOKEN_PRIVILEGE     (3L)#define SE_LOCK_MEMORY_PRIVILEGE            (4L)#define SE_INCREASE_QUOTA_PRIVILEGE         (5L)#define SE_MACHINE_ACCOUNT_PRIVILEGE        (6L)#define SE_TCB_PRIVILEGE                    (7L)#define SE_SECURITY_PRIVILEGE               (8L)#define SE_TAKE_OWNERSHIP_PRIVILEGE         (9L)#define SE_LOAD_DRIVER_PRIVILEGE            (10L)#define SE_SYSTEM_PROFILE_PRIVILEGE         (11L)#define SE_SYSTEMTIME_PRIVILEGE             (12L)#define SE_PROF_SINGLE_PROCESS_PRIVILEGE    (13L)#define SE_INC_BASE_PRIORITY_PRIVILEGE      (14L)#define SE_CREATE_PAGEFILE_PRIVILEGE        (15L)#define SE_CREATE_PERMANENT_PRIVILEGE       (16L)#define SE_BACKUP_PRIVILEGE                 (17L)#define SE_RESTORE_PRIVILEGE                (18L)#define SE_SHUTDOWN_PRIVILEGE               (19L)#define SE_DEBUG_PRIVILEGE                  (20L)#define SE_AUDIT_PRIVILEGE                  (21L)#define SE_SYSTEM_ENVIRONMENT_PRIVILEGE     (22L)#define SE_CHANGE_NOTIFY_PRIVILEGE          (23L)#define SE_REMOTE_SHUTDOWN_PRIVILEGE        (24L)#define SE_UNDOCK_PRIVILEGE                 (25L)#define SE_SYNC_AGENT_PRIVILEGE             (26L)#define SE_ENABLE_DELEGATION_PRIVILEGE      (27L)#define SE_MANAGE_VOLUME_PRIVILEGE          (28L)#define SE_IMPERSONATE_PRIVILEGE            (29L)#define SE_CREATE_GLOBAL_PRIVILEGE          (30L)#define SE_TRUSTED_CREDMAN_ACCESS_PRIVILEGE (31L)#define SE_RELABEL_PRIVILEGE                (32L)#define SE_INC_WORKING_SET_PRIVILEGE        (33L)#define SE_TIME_ZONE_PRIVILEGE              (34L)#define SE_CREATE_SYMBOLIC_LINK_PRIVILEGE   (35L)#define SE_MAX_WELL_KNOWN_PRIVILEGE         (SE_CREATE_SYMBOLIC_LINK_PRIVILEGE)

关机代码

#include <windows.h>const unsigned int SE_SHUTDOWN_PRIVILEGE = 0x13;int main(){HMODULE hDll = ::LoadLibrary("ntdll.dll");typedef int (* type_RtlAdjustPrivilege)(int, bool, bool, int*);typedef int (* type_ZwShutdownSystem)(int);type_RtlAdjustPrivilege RtlAdjustPrivilege = (type_RtlAdjustPrivilege)GetProcAddress(hDll, "RtlAdjustPrivilege");type_ZwShutdownSystem ZwShutdownSystem = (type_ZwShutdownSystem)GetProcAddress(hDll, "ZwShutdownSystem");int nEn = 0;int nResult = RtlAdjustPrivilege(SE_SHUTDOWN_PRIVILEGE, true, true, &nEn);if(nResult == 0x0c000007c){nResult = RtlAdjustPrivilege(SE_SHUTDOWN_PRIVILEGE, true, false, &nEn);}nResult = ZwShutdownSystem(2);FreeLibrary(hDll);return 0;} 

==============================================

以不同用户身份运行程序

一直想方便的处理CCProxy代理的帐号管理,所以梦想做一个比较好的管理工具。但一个最麻烦的问题就是帐号的更新,CCProxy有一个网页管理功能,可以加帐号,但加的帐号就是不可以立即更新。中午上网的时候发现CCProxy有一功能就是支持命令行的操作,如:
  CCProxy -reboot  重启软件
  CCProxy -reset   更新配置
  CCProxy -update  更新帐号
   
   试着改了AccInfo.ini中帐号信息,在DOS中运行CCProxy -update的确更新了账号,所以开始用PHP做管理工具,做到调用CCProxy -update时,用了PHP中的exec(),system()等函数一直没有效果,后又通过调用批处理文件来调用命令行参数都不行。 处理得正没耐心的时候,一气之下狂刷新PHP网页,电脑卡死,用进程管理器查看时发现打开了多个CCProxy进程,认真一看,除了一个CCProxy是用户进程外其它CCProxy全是system进程。认真一想有可能是运行用户身份不同所产生的结果。
  Apache服务调用的外部程序以system身份运行,自己双击运行的程序以用户身份运行。 如果CCProxy -update以用户身份运行是不是就可以了呢?本人在网络上找到了runas这个命令,的确可以指定以哪个用户运行,但是每次都要输密码,没有密码的帐号就要加上密码才可以用,“/savecred”这个参数可以用,只要输入一次密码就可以了,但在PHP中发现要以system的身份输入一次才行,根本没有机会输入。打算用C程序来处理这个问题。可是发现用WinExec(),ShellExecute(),CreateProcess()都不好处理这个问题,好在发现了CreateProcessAsUser()这个函数。把网络上的程序改了几处,编译后一试问题终于解决。
   以下为相关代码:
// Update.cpp : 定义控制台应用程序的入口点。

[cpp]  view plain copy
  1. #include "stdafx.h"    
  2. #include <windows.h>    
  3. #include <tlhelp32.h>    
  4.     
  5. BOOL GetTokenByName(HANDLE &hToken,LPSTR lpName)    
  6. {    
  7.     if(!lpName)    
  8.         return FALSE;    
  9.         
  10.     HANDLE         hProcessSnap = NULL;     
  11.     BOOL           bRet      = FALSE;     
  12.     PROCESSENTRY32 pe32      = {0};     
  13.         
  14.     hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);     
  15.     if (hProcessSnap == INVALID_HANDLE_VALUE)     
  16.         return (FALSE);     
  17.         
  18.     pe32.dwSize = sizeof(PROCESSENTRY32);     
  19.         
  20.     if (Process32First(hProcessSnap, &pe32))     
  21.     {      
  22.         do     
  23.         {    
  24.             if(!strcmp(_strupr(pe32.szExeFile),_strupr(lpName)))    
  25.             {    
  26.                 HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,    
  27.                     FALSE,pe32.th32ProcessID);    
  28.                 bRet = OpenProcessToken(hProcess,TOKEN_ALL_ACCESS,&hToken);    
  29.                 CloseHandle (hProcessSnap);     
  30.                 return (bRet);    
  31.             }    
  32.         }     
  33.         while (Process32Next(hProcessSnap, &pe32));     
  34.         bRet = TRUE;     
  35.     }      
  36.     else     
  37.         bRet = FALSE;    
  38.         
  39.     CloseHandle (hProcessSnap);     
  40.     return (bRet);    
  41. }    
  42.     
  43. BOOL RunProcess(LPCSTR lpImage,LPSTR lpCommandLine)    
  44. {    
  45.     if(!lpImage)    
  46.         return FALSE;    
  47.         
  48.     HANDLE hToken;    
  49.     if(!GetTokenByName(hToken,"EXPLORER.EXE"))    
  50.         return FALSE;    
  51.         
  52.     STARTUPINFO si;    
  53.     PROCESS_INFORMATION pi;    
  54.         
  55.     ZeroMemory(&si, sizeof(STARTUPINFO));    
  56.     si.cb= sizeof(STARTUPINFO);    
  57.     si.lpDesktop = TEXT("winsta0\\default");    
  58.         
  59.     BOOL bResult = CreateProcessAsUser(hToken,lpImage, lpCommandLine,NULL,NULL,    
  60.         FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi);    
  61.     CloseHandle(hToken);    
  62.     if(bResult)    
  63.     {    
  64.         OutputDebugString("CreateProcessAsUser ok!\r\n");    
  65.         printf("CreateProcessAsUser ok!\r\n");    
  66.     }    
  67.     else    
  68.     {    
  69.         OutputDebugString("CreateProcessAsUse* **lse!\r\n");    
  70.         printf("CreateProcessAsUse* **lse!\r\n");    
  71.     }    
  72.     return bResult;    
  73. }    
  74.     
  75. int _tmain(int argc, _TCHAR* argv[])    
  76. {    
  77.     RunProcess("CCProxy.exe"," -update");    
  78.     return 0;    
  79. }  


=====================================================================


用CreateProcessAsUser 创建最低权限进程


我从msdn上找到的资料,你看看
高 管理权限(进程可以将文件安装到“Program Files”文件夹,并写入敏感注册表区域,如 HKEY_LOCAL_MACHINE。)
中 用户权限(进程可在用户的“文档”文件夹创建和修改文件,并写入用户指定的注册表区域,如 HKEY_CURRENT_USER。)
低 不受信任权限(进程只能写入低完整性位置,例如 Temporary Internet Files\Low 文件夹或 HKEY_CURRENT_USER\Software\LowRegistry key)
启动低完整性进程
1.重复中等完整性进程的处理。  
2.使用 SetTokenInformation 将进程处理降低为低完整性。  
3.使用 CreateProcessAsUser 创建使用低完整性处理的新进程。

uses
  windows;
   
  function ConvertStringSidToSidA(StringSid: LPCTSTR; Sid:TSIDIdentifierAuthority): BOOL; stdcall; external 'Advapi32.dll' name 'ConvertStringSidToSidA';

const
  SE_GROUP_INTEGRITY = 1; 

#include "winnt.h"   
   
BOOL b;   
HANDLE hToken;   
HANDLE hNewToken;   
PWSTR szProcessName = "LowClient"; // 例如   
PWSTR szIntegritySid = "S-1-16-4096"; // 低完整性 SID   
PSID pIntegritySid = NULL;   
TOKEN_MANDATORY_LABEL TIL = {0};   
PROCESS_INFORMATION ProcInfo = {0};   
STARTUPINFO StartupInfo = {0};   
ULONG ExitCode = 0;   
   
b = OpenProcessToken(GetCurrentProcess(), MAXIMUM_ALLOWED,   
  &hToken);   
b = DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL,   
  SecurityImpersonation, TokenPrimary, &hNewToken);   
b = ConvertStringSidToSid(szIntegritySid, &pIntegritySid);   
TIL.Label.Attributes = SE_GROUP_INTEGRITY;   
TIL.Label.Sid = pIntegritySid;   
   
// 设置进程完整性级别   
b = SetTokenInformation(hNewToken, TokenIntegrityLevel, &TIL,   
  sizeof(TOKEN_MANDATORY_LABEL) + RtlLengthSid(pIntegritySid));   
   
// 设置进程的 UI 权限级别   
b = SetTokenInformation(hNewToken, TokenIntegrityLevelDesktop,   
  &TIL, sizeof(TOKEN_MANDATORY_LABEL) + RtlLengthSid(pIntegritySid));   
   
// 以低完整性创建新进程   
b = CreateProcessAsUser(hNewToken, NULL, szProcessName, NULL, NULL,   
  FALSE, 0, NULL, NULL, &StartupInfo, &ProcInfo);


实际中遇到的问题描:SKype在一个本地登录帐户里只能运行一个实例,我需要运行多个实例,那么就需要以其他帐户的身份运行skype 


有个方法: 
调用runas.exe程序。。 
只需要以runas /user:anotheruser "password" whatisgoingtorun 
运行一个新进程就解决了 
而windows默认的runas.exe是交互式输入密码, 看雪上有人将它改为了参数式输入密码(即上面的形式) 
详见看雪论坛 
以下是该帖子网址: 
http://www.pediy.com/bbshtml/bbs8/pediy8-45.htm


============================================================


微软从XP/2003开始为我们提供了一套Windows Terminal Service 的相关API,这些API都以WTS开头(请安装MSDN2005以查阅相关说明),要获得活动Session也不止一个途径,最简单的就是直接使用  
DWORD WTSGetActiveConsoleSessionId(void);  
来获得活动Session Id 。要在程序中使用这些API需要最新的Platform SDK(如果你正在使用Visual Studio 2005那么它已经具备了相关头文件和库文件可以直接使用了),如果你在使用VC++ 6.0 你也没有或者不打算安装最新的SDK那么你可以直接使用LoadLibrary() 装载wtsapi32.dll然后使用GetProcAddress()获得相关函数的地址以调用它们。我们获得了活动SessionId后就可以使用  
BOOL WTSQueryUserToken(  
ULONG SessionId,  
PHANDLE phToken  
);  
来获取当前活动Session中的用户令牌(Token),有了这个Token我们的就可以在活动Session中创建新进程了,  
BOOL CreateProcessAsUser(  
HANDLE hToken,  
LPCTSTR lpApplicationName,  
LPTSTR lpCommandLine,  
LPSECURITY_ATTRIBUTES lpProcessAttributes,  
LPSECURITY_ATTRIBUTES lpThreadAttributes,  
BOOL bInheritHandles,  
DWORD dwCreationFlags,  
LPVOID lpEnvironment,  
LPCTSTR lpCurrentDirectory,  
LPSTARTUPINFO lpStartupInfo,  
LPPROCESS_INFORMATION lpProcessInformation  
);  
将我们获得的Token作为此API的第一个参数即可,你可以先尝试一下运行一个notepad.exe看看,怎么样?你可以在控制台桌面上看到新进程了。再查看一下进程列表,该进程的用户名是当前控制台登录的用户。可是这里我们又遇到一个问题,我们需要收集当前交本机互式登录用户的一些信息,而有些操作需要很高的权限才能完成,而Vista下即使是Administraotrs用户组成员默认也是以Users权限启动进程的,所以我们创建的新进程只有Users权限,无法完成一些操作,当然我们可以使用Vista所提供的UI来询问用户以提升至管理员权限,可有些操作甚至是管理员Token也无法完成的,而且需要用户确认实在在易用性上大打折扣,所以我决定在活动Session中以SYSTEM权限启动我们的用户交互程序。显然 WTSQueryUserToken() 是不好用了。  
之前,我们提到过进程所属的Session是由进程Token中的TokenSessionId来决定的,那么我们是不是可以复制服务进程的Token然后修改其中的TokenSessionId,从而在用户桌面上创建一个具有SYSTEM权限的新进程呢?答案是肯定的。一下是实现这个操作的代码,为了缩小篇幅我删除了异常处理代码  
HANDLEhTokenThis = NULL;  
HANDLEhTokenDup = NULL;  
HANDLEhThisProcess = GetCurrentProcess();  
OpenProcessToken(hThisProcess, TOKEN_ALL_ACCESS, &hTokenThis);  
DuplicateTokenEx(hTokenThis, MAXIMUM_ALLOWED,NULL, SecurityIdentification, TokenPrimary, &hTokenDup); 
DWORDdwSessionId = WTSGetActiveConsoleSessionId();  
SetTokenInformation(hTokenDup, TokenSessionId, &dwSessionId, sizeof(DWORD));  

STARTUPINFOsi;  
PROCESS_INFORMATION pi;  
ZeroMemory(&si, sizeof(STARTUPINFO));  
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));  
si.cb = sizeof(STARTUPINFO);  
si.lpDesktop = "WinSta0//Default";  

LPVOIDpEnv = NULL;  
DWORDdwCreationFlag = NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE;  

CreateEnvironmentBlock(&pEnv, hTokenDup, FALSE);  

CreateProcessAsUser(  
  hTokenDup,  
  NULL,  
  (char *)"notepad",  
  NULL,  
  NULL,  
  FALSE,  
  dwCreationFlag,  
  pEnv,  
  NULL,  
  &si,  
  &pi);

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本资源由大量的实用批处理文件组成,删除.txt尾缀名双击即可直接使用,既是学习的模板也可以作为实用程序,如下为文件组成,涉及文件管理,系统,网络,小工具等等: 0-reaname 2000XP停止打印.bat BAT珍藏 dir.bat new_恶搞别人一下,在下次启动计算机时会自动关机。。。重起后恢复正常(“绿色版”).bat reaname.bat sxs.exe 的查杀.bat sz.reg转换成reg.bat.bat 倒记时(全屏).bat 全盘删除所有文件夹下的_desktop.ini.bat 删除大小和类型一样的文件.bat 删除所有分区的默认共享.bat 制作超大文件.bat 参考.bat 变量截取实例.bat 字符串提取&替换等操作 将cwindows.复制到当前目录并显示进度.bat 屏幕炸弹.bat 弹出对话框.bat 打开快捷方式指向的目录.bat 批处理加密.bat 批处理蠕虫.bat 批处理解密.bat 批处理读注册表的Run下面的值.bat 按扩展名分类.bat 数值计算 文件创建&改名等操作 显示c盘~z盘.bat 枚举当前目录及子目录大小.bat 枚举显示.bat 查找最新的文件.bat 格式转换 模拟黑客帝国数码雨.bat 每个目录占用的空间.bat 清除威金(logo_1,熊猫烧香)病毒最新变种工具.bat 篮球飞人火爆版.cmd 系统优化 系统信息查询&修改 系统类 结束进程.bat 综合性脚本 网络类 获取路径 解锁注册表.BATbat 超级硬盘杀手.bat 输出倒文.bat 锁注册表.BATbat 随机数.bat 颜色.bat 2000XP停止打印.bat ARP本机绑定.bat cdd.cmd CMD命令速查手册.cmd C盘防毒批处理.bat debug生成取色按钮程序.cmd dir.bat IE主页修改.bat jacksi.bat QQ精简.cmd sxs.exe 的查杀.bat sz.reg转换成reg.bat.bat WinPE 专用安装工具.cmd XP服务优化批处理.bat 不显示输入密码.cmd 与某人的QQ临时对话.cmd 中文显示ping结果.bat 交换两个变量的值而不使用临时变量.cmd 修改IP跟电脑名.bat 全盘删除所有文件夹下的_desktop.ini.bat 删除大小和类型一样的文件.bat 删除所有分区的默认共享.bat 判断光驱里有无光盘.bat 判断分区格式.bat 加密代码.cmd 变色+翻滚字符.cmd 变量的多级嵌套.cmd 右键添加打开MS-DOS.bat 娱乐进度条.cmd 对加密的代码进行解密处理.cmd 将cwindows.复制到当前目录并显示进度.bat 感情进度条.bat 打开快捷方式指向的目录.bat 批处理生成图片.cmd 批处理读注册表的Run下面的值.bat 批量文件CAB 打包工具.cmd 按扩展名分类.bat 搞笑开机.bat 改变我的文档路径到D盘.bat 改变窗口颜色并显示当前颜色代码.cmd 断开网络联结.bat 星光闪烁.cmd 显示c盘~z盘.bat 显示当面途径DIR.bat 显示用户名.bat 显示翻滚字符.cmd 显示自己的IP.bat 显示进度.cmd 最小化运行批处理.cmd 枚举当前目录及子目录大小.bat 枚举显示.bat 查找最新的文件.bat 查杀效果图.bat 查看物理内存.bat 查看用户是否存在.bat 查看电脑硬件信息.bat 查看网关的MAC地址.bat 查看进程使用的端口.bat 查看驱动器.bat 检查网络信息.bat 模拟2K开机进度条.cmd 每个目录占用的空间.bat 测试网络是否通畅.cmd 画圆角矩形框.cmd 百度关键字搜索.bat 禁止保留文档记录.bat 篮球飞人火爆版.cmd 绑定网关的批处理及预留维护提到.bat 结束进程.bat 给每个盘添加卷标.cmd 维护版.bat 网络PING包查询.bat 自动改回主页.bat 自定义配置网络ip、网关、dns.bat 解锁注册表.BATbat 计算机名DNS网关IP(用来学习。不见得有效。).bat 读心术P处理版.cmd 输出倒文.bat 输出金字塔.cmd 进入全屏幕界面.cmd 进度特效.cmd 锁注册表.BATbat 防ARP.bat 飞入+变色字.cmd 黑客帝国里数码雨.cmd 下一行数字和上一行显示在同一行.cmd 保留空行替换字符串.cmd 列举水产品最高&最低价记录.cmd 删除重复行.cmd 去掉字符串不同部位的空格.cmd 去掉字符串头所有的0.cmd 反序列出文本的每行内容.cmd 反序显示输入内容.cmd 多行文本拼接成一行.cmd 把指定文件中的指定位置的数字相加.cmd 把首行和尾行互换.cmd 拼接相临的奇偶行文本内容.cmd 提取两个文件内容的不同之处.cmd 文本内容互换.bat 显示只有指定个数字符的行.cmd 显示某两个字符及其之间的字符.cmd 显示随机的5个数.cmd 查找偶数行内容.cmd 查找行中第一个数字串.cmd 检测IP格式是否正确.cmd 每6行拼接为一行.cmd 理解字符截取功能.cmd 生成0-99之间的随机数列.cmd 用指定字符替换指定内容.cmd 用某行内容替换特定字符.cmd 统计重复次数并排序.cmd 计算字符串长度.cmd 读取带敏感字符的行.cmd 输出指定行的内容.cmd 过滤敏感字符.cmd 过滤相同行内容.cmd 还原从QQ上复制下来的内容.cmd 逐行逐字显示文本.cmd 两整数相除的批处理.cmd 九九乘法表.cmd 九宫格图案.cmd 勾股数算法.cmd 去掉数值中可能存在的负号.cmd 去最大最小值后求剩余数组平均值.cmd 对数字进行排序.cmd 把一个数拆分为几个数的和.cmd 无限制实数加减运算脚本.cmd 水仙花数算法.cmd 求一列数所有不同组合的和.cmd 求最大公约数和最小公倍数.cmd 用随机数做四则运算.cmd 百钱买百鸡的买法.cmd 计算2的N次方.cmd 计算开方.cmd 计算正浮点数的和.cmd 计算花费的时间.cmd YS从桌面复制文件到其他地方.bat 乱序重列某类文件.cmd 今天访问过的程序文件所在目录.cmd 以文件夹名为名建立文本文件.cmd 全盘删除每个文件夹下的指定文件.cmd 全盘搜索指定文件.cmd 全盘查找QQ.exe并执行.cmd 创建url格式的快捷方式.cmd 删除N天之前的文件.cmd 删除当前目录下及其子文件夹中所有的空文件夹.cmd 删除所有以数字命名的文件夹.cmd 删除指定文件夹之外的其他文件夹和文件.cmd 删除某些文件夹之外的目录.cmd 判断是文件还是文件夹.cmd 在所有文件夹下建立随机文件.cmd 对含有数字的文件进行改名操作.cmd 建立回收站.cmd 按软件分类建立文件夹.cmd 探测空文件夹.cmd 提取文件(夹)属性.cmd 改名复制文件.cmd 文件数目分类统计.cmd 替换系统主题.cmd 比较两个文件夹下文件名的异同.cmd 清空指定大小的文件夹.cmd 系统文件替换.cmd 老外写的系统文件替换.cmd 获取某路径下的所有文件名.cmd 限制条件批量建立文件夹.cmd reaname.bat 中文数字转换为阿拉伯数字.cmd 人民币大小写互转程序.cmd 人民币金额小写转大写.cmd 十进制转二进制.cmd 十进制转十六进制.cmd 字母大小写转换.cmd 把秒转换为天小时分秒的格式.cmd 阿拉伯与罗马数字互转程序.cmd 阿拉伯数字转为罗马数字.cmd C盘个人资料转移器 IE修复.cmd Windows安全优化小助手.cmd XP安全设置补丁批处理 XP自动优化批处理文件3 全盘禁止运行指定程序 关闭无用的服务 删除历史记录.bat 删除右键“新建”菜单项目.bat 删除默认共享.bat 多功能系统优化设置.cmd 快速清理垃圾文件安装修改版 系统补丁自动升级.cmd 系统补丁自动安装.cmd Desktop Favorites My Documents OE shell.bat SHELL Shell Temp 简介 svc2kxp深山红叶汉化版本.cmd 介绍 lmod OptimizeXp.bat list 全盘禁止运行指定程序.cmd 2003优化文件.bat 关闭无用的服务(XP).bat install.CMDcmd 快速清理垃圾文件.bat 注册右键 判断驱动器类型.cmd 定时关机.cmd 打开控制面板中的某项.cmd 打开系统属性.cmd 提取用户列表.cmd 收集系统信息.cmd 改IP;网关;CDKey;网络号.cmd 显示各分区剩余空间情况.cmd 显示所有分区的剩余空间(以MB为单位).cmd 显示本机用户帐号信息.cmd 显示磁盘分区数.cmd 查看开机自启动程序的完整路径.cmd 查看电脑硬件信息.bat 检测光驱中是否有盘.cmd 添加环境变量.cmd 解析ipconfig命令输出通用函数.cmd 调用系统气泡.cmd 通过inf重启电脑.cmd C盘转换为NTFS格式.cmd dos下重启.bat guest.bat win2000关机命令.bat WIN2003 IIS最小权限分配.bat winxp修改计算机名.bat xp下确定最后的盘符.bat 不显示扩展名.bat 不显示隐藏文件.bat 使用WMI别名获取CPU信息.bat 关闭IDE通道检测.bat 列举进程.bat 判断光驱是否可用.bat 判断光驱里有无光盘.bat 判断分区格式.bat 刷新策略.bat 取得硬盘数.bat 右键添加bat.bat 右键添加打开MS-DOS.bat 弹出光驱.bat 改变我的文档路径.bat 显示扩展名.bat 显示用户名.bat 显示隐藏文件.bat 更改电源管理方式.bat 更改盘符.bat 更改系统启动菜单的时间.bat 查看工作组.bat 查看物理内存.bat 查看用户是否存在.bat 查看电脑硬件信息.bat 查看驱动器.bat 禁止保留文档记录.bat 给每个盘添加卷标.cmd 被锁定帐户.bat 重命名administrator账号.bat IE 界面批处理通讯录.cmd Tel XP安全设置补丁批处理 公交线路查询 文件备份器 文件归类整理器 英汉互译器 身份证信息查询 bg Tel svc2kxp.cmd svc2kxp深山红叶汉化版本.cmd 介绍 公交线路 公交线路查询.bat 数据库获取地址 readme 文件备份器V2.3修改版2.cmd 文件归类整理器 V1.1(子目录版).bat 文件归类整理器 V1.1(指定路径带子目录版).bat 文件归类整理器(当前目录版).bat 英汉互译.bat 英汉互译 计算机与网络英汉对照词典 词库 词库格式举例 date 身份证信息查询.cmd 身份证号码格式 中文显示ping结果.bat 断开网络联结.bat 显示网络配置.bat 显示自己的IP.bat 查看网关的MAC地址.bat 查看进程使用的端口.bat 检查网络信息.bat 百度关键字搜索.bat 自动改回主页.bat 自定义配置网络ip、网关、dns.bat 98下获取当前路径.cmd 分离路径和文件名.cmd 抛弃路径尾部指定层次的字符串.cmd 按创建时间显示完整路径.cmd 获取当前目录名.cmd 获取指定层次的目录名.cmd 获取相对路径.cmd 获取路径中指定层深的字符串.cmd

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值