怎么在windows 服务程序里面调用一个控制台的程序?

nullptr 发布于 2014/07/17 14:20
阅读 1K+
收藏 0
在一个控制台程序里面调用另外一个控制台程序,用CreateProcess,参数用的是CREATE_NO_WINDOW,完美呈现!但是这种方式放在了服务程序里面就调用不成功了,就是被调用的那个控制台程序没有调用成功,需求是本地和域用户都能调用成功,求大神解决。C++版本的
加载中
0
Force武装卫队
Force武装卫队

CreateProcessWithTokenW

或者CreateProcessAsUser 试一试,服务的权限Token和普通程序不一样,可以获得Explorer的Token再来创建或者也可以用计划任务调用实现程序启动。
0
nullptr
nullptr

引用来自“Force武装卫队”的评论

CreateProcessWithTokenW

或者CreateProcessAsUser 试一试,服务的权限Token和普通程序不一样,可以获得Explorer的Token再来创建或者也可以用计划任务调用实现程序启动。
BOOL GetTokenByName(HANDLE &hToken,LPSTR lpName)
{
if(!lpName)
{
return FALSE;
}
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),_strupr(lpName)))
{
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)
{
if(!lpImage)
{
return FALSE;
}
HANDLE hToken;
if(!GetTokenByName(hToken,"EXPLORER.EXE"))
{
return FALSE;
}
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);
return bResult;

}



这是网上找的代码,还是不能调用,我是域用户登陆的,和这有关吗

Force武装卫队
Force武装卫队
HANDLE 本就是void指针了 还用& 就是去指针的地址,如果没用好就应该得不到结果
0
nullptr
nullptr
@Force 武装部队 本地用户也不能用啊 
返回顶部
顶部