环境:Windows Server 2003
在系统服务中,采用CreateProcess启动应用程序,在进程管理中,看到相关进程启动,但是无法看到界面。
hScm=OpenSCManager(0, 0, SC_MANAGER_CREATE_SERVICE);
hService=CreateService(
hScm,
_T("ServiceTest"),
_T("ServiceTest"),
SERVICE_ALL_ACCESS,
SERVICE_INTERACTIVE_PROCESS | SERVICE_WIN32_OWN_PROCESS,
SERVICE_AUTO_START,
SERVICE_ERROR_NORMAL,
"c:\\ServiceTest.exe",
0,0,0,0,0
);PROCESS_INFORMATION pi;
STARTUPINFO sti;
ZeroMemory(&sti,sizeof(sti));
sti.cb=sizeof(sti);
sti.lpDesktop= "WinSta0\\Default";
CreateProcess(strCmd,NULL,NULL,NULL,FALSE,0,NULL,NULL,&sti,&pi);我在XP下测试的,是可以启动界面,就是在2003 Server上不行。
在系统服务中,采用CreateProcess启动应用程序,在进程管理中,看到相关进程启动,但是无法看到界面。
hScm=OpenSCManager(0, 0, SC_MANAGER_CREATE_SERVICE);
hService=CreateService(
hScm,
_T("ServiceTest"),
_T("ServiceTest"),
SERVICE_ALL_ACCESS,
SERVICE_INTERACTIVE_PROCESS | SERVICE_WIN32_OWN_PROCESS,
SERVICE_AUTO_START,
SERVICE_ERROR_NORMAL,
"c:\\ServiceTest.exe",
0,0,0,0,0
);PROCESS_INFORMATION pi;
STARTUPINFO sti;
ZeroMemory(&sti,sizeof(sti));
sti.cb=sizeof(sti);
sti.lpDesktop= "WinSta0\\Default";
CreateProcess(strCmd,NULL,NULL,NULL,FALSE,0,NULL,NULL,&sti,&pi);我在XP下测试的,是可以启动界面,就是在2003 Server上不行。
sti.dwFlags = STARTF_USESHOWWINDOW;//标志wShowWindow参数有效
sti.wShowWindow = SW_SHOW;
在XP下,是可以的。
不知道什么在2003 Server下,就不行了。
OpenProcessToken
DuplicateToken
WTSGetActiveConsoleSessionId
SetTokenInformation
CreateProcessAsUser
如果安装的时候没有设置,是不行的(CreateService时的 SERVICE_INTERACTIVE_PROCESS
)。我一直在用 Windows Server 2003 做开发环境。
前些日子就做过,以 SYSTEM 权限启动登录用户进程,还真没遇到过你的问题。是不是你的程序由于未知原因阻塞了。
但是界面的显示,只限于本机,之前我一直使用的是远程桌面,所以一直没有看到
这都是“远程桌面”惹的祸。
远程桌面客户端 mstsc 有一个 /console 参数,模式等同于本地终端显示器登录,/console 不会去占用非 /console 远程桌面,远程桌面允许两个正常连接和一个控制台/console方式连接,并且正常连接和 /console 连接的桌面操作不能相互看见,只有通过 /console 参数远程桌面连接到 Windows 2003 服务器,才能够看到弹出的 应用程序 窗口界面注:在 Windows XP SP3 以上版本,/console 参数改名为 /admin,需要用 mstsc /admin 启动远程桌面