首页
社区
课程
招聘
[求助]win7下管理员权限的进程如何创建一个非管理员权限进程
发表于: 2012-6-25 10:42 11314

[求助]win7下管理员权限的进程如何创建一个非管理员权限进程

2012-6-25 10:42
11314
权限问题好头疼,求码。

也看了不少资料CreateprocessAsUser总是不成功
@err,hr        0x00000522 客户端没有所需的特权。

说明一下不是服务进程,就是普通的R3应用程序。

[注意]看雪招聘,专注安全领域的专业人才平台!

收藏
免费 1
支持
分享
赞赏记录
参与人
雪币
留言
时间
伯爵的信仰
为你点赞~
2023-8-7 00:04
最新回复 (7)
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
有答案了没?
2012-6-25 11:25
0
雪    币: 303
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
试试。。。

CreateProcessWithLogonW
2012-6-25 11:59
0
雪    币: 458
活跃值: (426)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
4
还没。



这个函数需要用户名密码的。。。
2012-6-25 15:17
0
雪    币: 25
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
ShellExecute,Operation参数写"RunAs"
2012-6-28 18:04
0
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我是来领钱的。
2012-11-8 23:10
0
雪    币: 458
活跃值: (426)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
7
结贴。楼上是我一朋友,刚好这个问题昨天解决了,想把kx给他转正,求大家不要举报我啊~~~谢谢各位大神。。。

http://hi.baidu.com/blueapple_c/item/52b7d529beb7c30f76272cd7

下面公布代码,可能有点细节需要调整:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
-------- CreateProcessEx.h文件 --------
#ifndef _CREATE_PROCESS_EX_H_
#define _CREATE_PROCESS_EX_H_
#include <windows.h>
#include "tchar.h"
#pragma comment(lib, "shell32")
#pragma comment(lib, "user32")
#pragma comment(lib, "Advapi32.lib")
 
//以普通权限启动进程
BOOL CreateProcessLow(TCHAR * lpApplicationName,
 TCHAR * lpCommandLine = NULL,
 TCHAR * lpDirectory = NULL,
 UINTnShow = SW_SHOWNORMAL);
//以管理员权限启动进程
BOOL CreateProcessHigh(TCHAR * strProcessName,
 TCHAR * strCommandLine = NULL,
 TCHAR * lpDirectory = NULL,
 UINTnShow = SW_SHOWNORMAL);
#endif //_CREATE_PROCESS_EX_H_
-------- CreateProcessEx.h文件 --------
 
 
-------- CreateProcessEx.cpp文件 --------
#include "CreateProcessEx.h"
#include <string>
using namespace std;
 
typedef BOOL (WINAPI *F_CreateProcessWithTokenW)(
__in          HANDLE hToken,
__in          DWORD dwLogonFlags,
__in          LPCWSTR lpApplicationName,
__in          LPWSTR lpCommandLine,
__in          DWORD dwCreationFlags,
__in          LPVOID lpEnvironment,
__in          LPCWSTR lpCurrentDirectory,
__in          LPSTARTUPINFOW lpStartupInfo,
__out         LPPROCESS_INFORMATION lpProcessInfo
);
 
HANDLE DupExplorerToken();
BOOL IsVistaOrLater();
BOOL IsAdminPrivilege();
 
 
//以普通权限启动进程
BOOL CreateProcessLow(TCHAR * lpApplicationName,
 TCHAR * lpCommandLine,
 TCHAR * lpDirectory,
 UINTnShow)
{
if (!IsVistaOrLater()
|| !IsAdminPrivilege())
{
HINSTANCE hRet = ShellExecute(NULL, _T("open"), lpApplicationName, lpCommandLine, lpDirectory, nShow);
return ((int)hRet > 32);
}
HANDLE hToken = DupExplorerToken();
 
if (hToken == NULL)
return FALSE;
 
static HMODULE hDll = LoadLibrary(_T("ADVAPI32.dll"));
if (!hDll)
{
CloseHandle(hToken);
return FALSE;
}
F_CreateProcessWithTokenW pfn = (F_CreateProcessWithTokenW)GetProcAddress(hDll, "CreateProcessWithTokenW");
if (!pfn)
{
CloseHandle(hToken);
return FALSE;
}
 
STARTUPINFO si = {sizeof(STARTUPINFO)};
PROCESS_INFORMATION pi = {0};
BOOL ret = pfn(hToken,
LOGON_WITH_PROFILE,
lpApplicationName,
lpCommandLine,
NORMAL_PRIORITY_CLASS,
NULL,
lpDirectory,
&si,
&pi);
if (ret)
{
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
 
CloseHandle(hToken);
return ret;
}
 
//以管理员权限启动进程
BOOL CreateProcessHigh(TCHAR * lpApplicationName,
  TCHAR * lpCommandLine,
  TCHAR * lpDirectory,
  UINTnShow)
{
#ifdef _UNICODE
wstring command;
#else
string command;
#endif
 
if (lpCommandLine)
{
command = lpCommandLine;
}
if (IsVistaOrLater()
&& !IsAdminPrivilege())
{
command += _T(" -Admin");
}
 
HINSTANCE hRet = ShellExecute(NULL, _T("runas"), lpApplicationName, command.c_str(), lpDirectory, nShow);
return ((int)hRet > 32);
}
 
 
HANDLE DupExplorerToken()
{
DWORD dwPid = 0;
HWND hwnd = FindWindow(_T("Shell_TrayWnd"), NULL);
if (NULL == hwnd)
return NULL;
 
GetWindowThreadProcessId(hwnd, &dwPid);
if (dwPid == 0)
return NULL;
 
HANDLE hExplorer = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, dwPid);
if (hExplorer == NULL)
return NULL;
 
HANDLE hToken = NULL;
OpenProcessToken(hExplorer, TOKEN_DUPLICATE, &hToken);
CloseHandle(hExplorer);
 
HANDLE hNewToken = NULL;
DuplicateTokenEx(hToken, TOKEN_ALL_ACCESS, NULL, SecurityImpersonation, TokenPrimary, &hNewToken);
CloseHandle(hToken);
 
return hNewToken;
}
 
BOOL IsVistaOrLater()
{
OSVERSIONINFOEX version = {sizeof(OSVERSIONINFOEX)};
if (!GetVersionEx((LPOSVERSIONINFO)&version))
{
version.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if (!GetVersionEx((LPOSVERSIONINFO)&version))
{
return FALSE;
}
}
 
return (version.dwMajorVersion >= 6);
}
 
BOOL IsAdminPrivilege()
{
BOOL bIsAdmin = FALSE;
BOOL bRet = FALSE;
SID_IDENTIFIER_AUTHORITY idetifier = SECURITY_NT_AUTHORITY;
PSID pAdministratorGroup;
if (AllocateAndInitializeSid(
&idetifier,
2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS,
0,0,0,0,0,0,
&pAdministratorGroup))
{
if (!CheckTokenMembership(NULL, pAdministratorGroup, &bRet))
{
bIsAdmin = FALSE;
}
if (bRet)
{
bIsAdmin = TRUE;
}
FreeSid(pAdministratorGroup);
}
 
return bIsAdmin;
}
-------- CreateProcessEx.cpp文件 --------
2012-11-8 23:13
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
CreateProcessLow在管理员下,调用创建非管理员进程失败啊
2015-6-5 15:22
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册