请教高手:如何让服务以administrator来创建某一进程
服务一般运行于system级,用服务创建的进程(CreateProcess)一般也是system级的
如何让服务以administrator来创建某一进程?高手请指点!!!
问题点数:20、回复次数:7Top
1 楼Ah(蓝过天)回复于 2005-04-04 15:28:57 得分 5
BOOL CreateProcessAsUser(
HANDLE hToken, // handle to user token
LPCTSTR lpApplicationName, // name of executable module
LPTSTR lpCommandLine, // command-line string
LPSECURITY_ATTRIBUTES lpProcessAttributes, // SD
LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
BOOL bInheritHandles, // inheritance option
DWORD dwCreationFlags, // creation flags
LPVOID lpEnvironment, // new environment block
LPCTSTR lpCurrentDirectory, // current directory name
LPSTARTUPINFO lpStartupInfo, // startup information
LPPROCESS_INFORMATION lpProcessInformation // process information
);
Top
2 楼wjl_2001(wjl_2001)回复于 2005-04-04 22:42:03 得分 0
不是吧,大哥,就这样啊,上面这个函数的调用可不简单啊,Top
3 楼idAnts(此广告位招租)回复于 2005-04-06 14:43:50 得分 15
如果当前用户为administrator就好办了。
我的方法是遍历进程,找到windows探险者(explorer.exe),然后取得它的token,然后可以用CreateProcessAsUser来创建了,呵呵。
不过要是当前用户不是administrator,就没办法了。
Top
4 楼idAnts(此广告位招租)回复于 2005-04-07 13:19:07 得分 0
给你例子:
BOOL GetExplorerToken(HANDLE &hToken)
{
HANDLE hProcessSnap = NULL;
BOOL bRet = FALSE;
PROCESSENTRY32 pe32 = {0};
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == INVALID_HANDLE_VALUE)
return (FALSE);
pe32.dwSize = sizeof(PROCESSENTRY32);
if (Process32First(hProcessSnap, &pe32))
{
do
{
if(!strcmp(_strupr(pe32.szExeFile),"EXPLORER.EXE"))
{
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,
FALSE,pe32.th32ProcessID);
bRet = OpenProcessToken(hProcess,TOKEN_ALL_ACCESS,&hToken);
CloseHandle (hProcessSnap);
return (bRet);
}
}
while (Process32Next(hProcessSnap, &pe32));
bRet = TRUE;
}
else
bRet = FALSE;
CloseHandle (hProcessSnap);
return (bRet);
}
BOOL RunProcess(LPCSTR lpImage)
{
HANDLE hToken;
if(!GetExplorerToken(hToken))
{
return FALSE;
}
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb= sizeof(STARTUPINFO);
si.lpDesktop = TEXT("winsta0\\default");
BOOL bResult = CreateProcessAsUser(hToken,lpImage,NULL,NULL,NULL,
FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi);
CloseHandle(hToken);
if(bResult)
{
OutputDebugString("CreateProcessAsUser ok!\r\n");
}
else
{
OutputDebugString("CreateProcessAsUser false!\r\n");
}
return bResult;
}
在ServiceCtrlHandler例程里调用:
……
case SERVICE_CONTROL_RUNPROCESS: //自定义消息
OutputDebugString("Code SERVICE_CONTROL_RUNPROCESS\r\n");
RunProcess("C:\\NOTEPAD.EXE");
MyServiceStatus.dwCurrentState = SERVICE_RUNNING;
break;
……
Top
5 楼wjl_2001(wjl_2001)回复于 2005-04-07 21:25:03 得分 0
楼上的朋友,会不会把我骗去当鸭啊?????????????我的体力可不行啊Top
6 楼wjl_2001(wjl_2001)回复于 2005-04-08 01:27:38 得分 0
1.SERVICE_CONTROL_RUNPROCESS这个自定义消息放在哪里呢,值多大?
2.MyServiceStatus.dwCurrentState = SERVICE_RUNNING;
MyServiceStatus中其它变量不用赋值吗?如dwCheckPoint??Top
7 楼idAnts(此广告位招租)回复于 2005-04-08 08:54:27 得分 0
1.SERVICE_CONTROL_RUNPROCESS定义可以放在统一的头文件里,因为控制服务程序的程序也要用到它。它的值可以在128 到 255之间。
2.dwCheckPoint的值不用管它。Top




