在Win7下使用服务调用应用程序的问题

虎滴小猪猪 2012-12-19 10:53:52
由于项目需要,需要在Win7下编写一个服务,这个服务的作用就是定时检测指定程序是否运行,如果没有运行则使用WinExec将此程序运行起来。现在服务和程序已经写成,并且在XP下运行正常。但是在Win7下运行的时候,每次服务调用Exe的时候总是会提示“交互式服务检测”。请问在Win7下如果使用服务调用Exe运行呢??
...全文
119 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
oyljerry 2012-12-25
  • 打赏
  • 举报
回复
CreateProcessAsUser()
pvlking 2012-12-25
  • 打赏
  • 举报
回复
// 创建用户Session环境 if (CreateEnvironmentBlock(&lpEnvironment, hDuplicatedToken, FALSE) == FALSE) { DWORD dwError = GetLastError(); WriteDebug("CreateEnvironmentBlock - %d",dwError); //goto Cleanup; } 你这里创建的进程环境,用的是服务令牌创建的环境,也就是Session0的环境,所以会有交互提示。 你需要把程序运行的环境设置成你当前用户所在的会话层。 添加: DWORD dwSessionId; HANDLE hUserToken = NULL; dwSessionId = WTSGetActiveConsoleSessionId(); WTSQueryUserToken( dwSessionId,&hUserToken ); //创建进程环境改成: CreateEnvironmentBlock( &lpEnvironment, hUserToken, FALSE) 你试下看看
虎滴小猪猪 2012-12-25
  • 打赏
  • 举报
回复
为啥没人帮我啊,我不想拖到2013年。哥哥姐姐们帮帮忙啊
虎滴小猪猪 2012-12-19
  • 打赏
  • 举报
回复
设置了 我在网上找的资料说 windows7的服务程序会受到会话的隔离,服务程序运行在session0,用户能看到的在session1,2,... 你可以使用NtOpenProcessToken打开自己的进程令牌,再使用NtDuplicateToken复制令牌,并用NtSetInformationToken更改新令牌的会话id为active console sessionid,由WTSGetActiveConsoleSessionId获得,最后使用CreateProcessInternalW创建进程,注意传入新令牌句柄,还要在STARTUPINFO中设置lpdesktop为WinSta0\Default 下边是我写的代码
BOOL bSuccess = FALSE;
STARTUPINFO si = {0};
// 进程信息
PROCESS_INFORMATION pi = {0};
si.cb = sizeof(si);
si.lpDesktop = "WinSta0\Default";
HANDLE hTokenThis = NULL;
HANDLE hDuplicatedToken = NULL;
LPVOID lpEnvironment = NULL;
DWORD dwSessionID;
HANDLE hThisProcess = GetCurrentProcess();
WriteDebug("GetCurrentProcess - %d",hThisProcess);
OpenProcessToken(hThisProcess, TOKEN_ALL_ACCESS, &hTokenThis);
// 复制令牌
if (DuplicateTokenEx(hTokenThis,MAXIMUM_ALLOWED, NULL,SecurityIdentification,
TokenPrimary,&hDuplicatedToken) == FALSE)
{
DWORD dwError = GetLastError();
WriteDebug("DuplicateTokenEx - %d",dwError);
//goto Cleanup;
}
//更改新令牌的会话id为active console sessionid
SetTokenInformation(hDuplicatedToken, TokenSessionId, &dwSessionID, sizeof(DWORD));
// 获得当前Session ID
dwSessionID = WTSGetActiveConsoleSessionId();
WriteDebug("WTSGetActiveConsoleSessionId - %d",dwSessionID);
// 获得当前Session的用户令牌
if (WTSQueryUserToken(dwSessionID, &hTokenThis) == FALSE)
{
DWORD dwError = GetLastError();
WriteDebug("WTSQueryUserToken - %d",dwError);
//goto Cleanup;
}
// 创建用户Session环境
if (CreateEnvironmentBlock(&lpEnvironment,
hDuplicatedToken, FALSE) == FALSE)
{
DWORD dwError = GetLastError();
WriteDebug("CreateEnvironmentBlock - %d",dwError);
//goto Cleanup;
}
// 在复制的用户Session下执行应用程序,创建进程。
// 通过这个进程,就可以显示各种复杂的用户界面了
if (CreateProcessAsUser(hDuplicatedToken,m_strThePath, NULL, NULL, NULL, FALSE,
NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE |CREATE_UNICODE_ENVIRONMENT,
lpEnvironment, NULL, &si, &pi) == FALSE)
{
DWORD dwError = GetLastError();
WriteDebug("CreateProcessAsUser - %d",dwError);
//goto Cleanup;
}
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
bSuccess = TRUE;
// 清理工作
Cleanup:
if (!bSuccess)
{
WriteDebug("无法创建复杂UI");
}
if (hTokenThis != NULL)
CloseHandle(hTokenThis);
if (hDuplicatedToken != NULL)
CloseHandle(hDuplicatedToken);
if (lpEnvironment != NULL)
DestroyEnvironmentBlock(lpEnvironment);
调试时,不对,谁能帮我看下
zwfgdlc 2012-12-19
  • 打赏
  • 举报
回复
CreateService()创建服务时,dwServiceType是否设置为SERVICE_INTERACTIVE_PROCESS?

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧