如何在Windows服务中以当前用户启动一个程序
2014-05-06 13:23
489 查看
总所周知,大多数Windows服务是以SYSTEM用户启动的,并且没有任何交互界面的。SYSTEM用户是系统中权限最高的用户,所以服务程序有极高的权限,可以操作注册表,系统目录等等。
但是有写东西不一定权限高就能取到,比如说想知道当前登录用户的一些相关信息,必须是当前用户启动的程序才可能得到这些信息,用SYSTEM用户启动的服务反而得不到这些信息,于是就有了需要在Windows服务中以当前用户启动一个进程的需求。
以下代码可以实现用当前用户启动一个程序,在Win7 64位机器上测试通过。
但是有写东西不一定权限高就能取到,比如说想知道当前登录用户的一些相关信息,必须是当前用户启动的程序才可能得到这些信息,用SYSTEM用户启动的服务反而得不到这些信息,于是就有了需要在Windows服务中以当前用户启动一个进程的需求。
以下代码可以实现用当前用户启动一个程序,在Win7 64位机器上测试通过。
//获取当前活动的SessionId DWORD dwSessionId = WTSGetActiveConsoleSessionId(); HANDLE hToken = NULL; HANDLE hTokenDup = NULL; LPVOID pEnv = NULL; STARTUPINFO si; PROCESS_INFORMATION pi; //获取用户Token if(!WTSQueryUserToken(dwSessionId, &hToken)) { CloseHandle(hToken); return; } //复制Token if(!DuplicateTokenEx(hToken,MAXIMUM_ALLOWED,NULL,SecurityIdentification,TokenPrimary,&hTokenDup)) { CloseHandle(hToken); return; } //获取环境信息 if(!CreateEnvironmentBlock(&pEnv,hTokenDup,FALSE)) { CloseHandle(hToken); CloseHandle(hTokenDup); return; } //设置启动参数信息 ZeroMemory( &si, sizeof( STARTUPINFO ) ); si.cb = sizeof( STARTUPINFO ); si.lpDesktop = "winsta0\\default"; ZeroMemory( &pi, sizeof(pi) ); DWORD dwCreationFlag = NORMAL_PRIORITY_CLASS|CREATE_UNICODE_ENVIRONMENT|CREATE_NEW_CONSOLE; //以当前用户启动记事本 if(!CreateProcessAsUser(hTokenDup,"notepad.exe",NULL,NULL,NULL,FALSE,dwCreationFlag,pEnv,NULL,&si,&pi)) { DestroyEnvironmentBlock(pEnv); CloseHandle(hTokenDup); CloseHandle(hToken); fOut.close(); } //等待启动的进程结束 WaitForSingleObject(pi.hProcess, INFINITE); //清理工作 DestroyEnvironmentBlock(pEnv); CloseHandle(hTokenDup); CloseHandle(hToken);
相关文章推荐
- 在服务中以当前用户身份启动一个程序
- Windows 服务程序启动当前窗口用户交互程序
- Win7中如何在服务中启动一个当前用户的进程——函数CreateProcessAsUser()的一次使用记录
- 在服务中以当前用户身份启动一个程序
- C# 编写Windows服务实现开机启动一个程序
- Windows:服务程序用当前登录用户来执行函数
- Windows核心编程-如何以管理员的身份启动一个程序
- 服务程序中如何以当前登陆用户身份运行程序
- C#判断程序是由Windows服务启动还是用户启动
- C# 自己写了一个windows服务程序,运行时错误: 错误 1053: 服务没有及时响应启动或控制请求。(推荐)
- Win7中如何在远程服务器的windows服务中启动一个软件进程
- 服务程序中如何以当前登陆用户身份运行程序
- Linux内核如何装载和启动一个可执行程序
- .NET创建一个即是可执行程序又是Windows服务的程序
- 对于启动Oracle 10g时 ORA-12514:TNS:监听程序当前无法识别连接描述符中请求的服务
- android 如何获取一个程序的当前版本号
- 如何启动一个命令,如何读取程序的一些内容和写一些东西到该进程中?
- 编写一个C#Windows服务程序,定时从数据库中拿出记录发送邮件。
- Windows 如何以管理员权限启动程序
- 服务应用程序如何访问当前登录用户的信息