结果,服务程序运行了一个system的工作进程,而我自己还能再开一个administrator的进程。注:这个进程是做了互斥限制的,也就是说只能有一个实例运行。
想问问,服务程序启动的进程和用户启动的进程有什么区别?怎样才能实现我想要的功能呢?
由于注册CSDN不久,所以没有什么分,谢谢各位了!
17 个解决方案
#1
不在相同的会话层中,你可以到vista或者windows7下做下测试,我记得不在同一会话中的监控不太好做。
#2
服务启动的进程继承了服务的权限!属于它 的子进程
#3
我用的是Windows2003, 而且我发现服务只是启动了这个进程,而这个进程不会显示界面,也不会运行程序 的功能,我很纳闷! 而我自己在adminstrator下开的进程虽然是启动了,有界面,但是却无法写入数据库,而程序表面完全正常!
#4
To: fangchao918628
您所说的我不太明白,那我应该如何在服务进程中让我的工作进程正常执行呢?
您所说的我不太明白,那我应该如何在服务进程中让我的工作进程正常执行呢?
#5
我用的是Windows2003, 而且我发现服务只是启动了这个进程,而这个进程不会显示界面,也不会运行程序 的功能,我很纳闷! 而我自己在adminstrator下开的进程虽然是启动了,有界面,但是却无法写入数据库,而程序表面完全正常!
=====================
服务进程和普通进程的用户不同,而一般服务是不具备与桌面交互的能力的,所以你的程序不会显示桌面。
=====================
服务进程和普通进程的用户不同,而一般服务是不具备与桌面交互的能力的,所以你的程序不会显示桌面。
#7
服务启动时要指定特定用户来启动,并且默认情况下是无法访问桌面的,而启动应用程序则是以当前用户运行的。system权限>admin权限,可以枚举admin的进程~这个没有问题
#8
To: fangchao918628
我安装的时候是通过命令安装的。
我安装的时候是通过命令安装的。
#9
创建服务时将服务创建成可交互的,这样创建的子进程应该可以和桌面交互
#10
看下服务的属性,登陆,将允许与界面 交互勾上,看能出界面不
不过可能还是连接不上数据库
不过可能还是连接不上数据库
#11
我已经用administartor的方式登陆服务了,但是还是没有界面,进程中显示服务所启动的进程是adminstrator的了,但是还是不能写库!
#12
非常悲剧的是,我仍然可以手动启动我的工作进程!
#13
可能的一个原因
HANDLE m_hMutex = ::CreateMutex(NULL, TRUE, L"XXXX");
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
exit(0);
return FALSE;
}
LZ的代码如果是这样写的,else就放行,当你双击打开的时候返回的是ERROR_ACCESS_DENIED这样一样可以运行,所以打开了两个,纯属猜测!!!
#14
希望杯具能变成洗具
#15
一般的服务程序是不能和桌面交互的,要和用户进行交互(如显示窗口),我们必须打开用户WinSta0和desktop,给段代码给你:
HDESK hdeskCurrent;
HDESK hdesk;
HWINSTA hwinstaCurrent;
HWINSTA hwinsta;
hwinstaCurrent = GetProcessWindowStation();
if (hwinstaCurrent == NULL){
LogEvent(_T("get window station err"));
return FALSE;
}
hdeskCurrent = GetThreadDesktop(GetCurrentThreadId());
if (hdeskCurrent == NULL){
LogEvent(_T("get window desktop err"));
return FALSE;
}
//打开winsta0
hwinsta = OpenWindowStation("winsta0", FALSE,
WINSTA_ACCESSCLIPBOARD |
WINSTA_ACCESSGLOBALATOMS |
WINSTA_CREATEDESKTOP |
WINSTA_ENUMDESKTOPS |
WINSTA_ENUMERATE |
WINSTA_EXITWINDOWS |
WINSTA_READATTRIBUTES |
WINSTA_READSCREEN |
WINSTA_WRITEATTRIBUTES);
if (hwinsta == NULL){
LogEvent(_T("open window station err"));
return FALSE;
}
if (!SetProcessWindowStation(hwinsta)){
LogEvent(_T("Set window station err"));
return FALSE;
}
//打开desktop
hdesk = OpenDesktop("default", 0, FALSE,
DESKTOP_CREATEMENU |
DESKTOP_CREATEWINDOW |
DESKTOP_ENUMERATE |
DESKTOP_HOOKCONTROL |
DESKTOP_JOURNALPLAYBACK |
DESKTOP_JOURNALRECORD |
DESKTOP_READOBJECTS |
DESKTOP_SWITCHDESKTOP |
DESKTOP_WRITEOBJECTS);
if (hdesk == NULL){
LogEvent(_T("Open desktop err"));
return FALSE;
}
SetThreadDesktop(hdesk);
//到这一步,我们获取了和用户交互(如显示窗口)的权利
CMsgDlg dlgMsg;
//显示一个dialog
dlgMsg.DoModal();
if (!SetProcessWindowStation(hwinstaCurrent))
return FALSE;
if (!SetThreadDesktop(hdeskCurrent))
return FALSE;
if (!CloseWindowStation(hwinsta))
return FALSE;
if (!CloseDesktop(hdesk))
return FALSE;
HDESK hdeskCurrent;
HDESK hdesk;
HWINSTA hwinstaCurrent;
HWINSTA hwinsta;
hwinstaCurrent = GetProcessWindowStation();
if (hwinstaCurrent == NULL){
LogEvent(_T("get window station err"));
return FALSE;
}
hdeskCurrent = GetThreadDesktop(GetCurrentThreadId());
if (hdeskCurrent == NULL){
LogEvent(_T("get window desktop err"));
return FALSE;
}
//打开winsta0
hwinsta = OpenWindowStation("winsta0", FALSE,
WINSTA_ACCESSCLIPBOARD |
WINSTA_ACCESSGLOBALATOMS |
WINSTA_CREATEDESKTOP |
WINSTA_ENUMDESKTOPS |
WINSTA_ENUMERATE |
WINSTA_EXITWINDOWS |
WINSTA_READATTRIBUTES |
WINSTA_READSCREEN |
WINSTA_WRITEATTRIBUTES);
if (hwinsta == NULL){
LogEvent(_T("open window station err"));
return FALSE;
}
if (!SetProcessWindowStation(hwinsta)){
LogEvent(_T("Set window station err"));
return FALSE;
}
//打开desktop
hdesk = OpenDesktop("default", 0, FALSE,
DESKTOP_CREATEMENU |
DESKTOP_CREATEWINDOW |
DESKTOP_ENUMERATE |
DESKTOP_HOOKCONTROL |
DESKTOP_JOURNALPLAYBACK |
DESKTOP_JOURNALRECORD |
DESKTOP_READOBJECTS |
DESKTOP_SWITCHDESKTOP |
DESKTOP_WRITEOBJECTS);
if (hdesk == NULL){
LogEvent(_T("Open desktop err"));
return FALSE;
}
SetThreadDesktop(hdesk);
//到这一步,我们获取了和用户交互(如显示窗口)的权利
CMsgDlg dlgMsg;
//显示一个dialog
dlgMsg.DoModal();
if (!SetProcessWindowStation(hwinstaCurrent))
return FALSE;
if (!SetThreadDesktop(hdeskCurrent))
return FALSE;
if (!CloseWindowStation(hwinsta))
return FALSE;
if (!CloseDesktop(hdesk))
return FALSE;
#16
mark
#17
同志们,这个问题我找了一会,也听了大家说的,可能还是要具体问题具体分析吧,但是还是没有给自己满意的答案,就此结帐了,不过我会继续找下去的,有了新的进展再发帖啊!谢谢各位了!
#1
不在相同的会话层中,你可以到vista或者windows7下做下测试,我记得不在同一会话中的监控不太好做。
#2
服务启动的进程继承了服务的权限!属于它 的子进程
#3
我用的是Windows2003, 而且我发现服务只是启动了这个进程,而这个进程不会显示界面,也不会运行程序 的功能,我很纳闷! 而我自己在adminstrator下开的进程虽然是启动了,有界面,但是却无法写入数据库,而程序表面完全正常!
#4
To: fangchao918628
您所说的我不太明白,那我应该如何在服务进程中让我的工作进程正常执行呢?
您所说的我不太明白,那我应该如何在服务进程中让我的工作进程正常执行呢?
#5
我用的是Windows2003, 而且我发现服务只是启动了这个进程,而这个进程不会显示界面,也不会运行程序 的功能,我很纳闷! 而我自己在adminstrator下开的进程虽然是启动了,有界面,但是却无法写入数据库,而程序表面完全正常!
=====================
服务进程和普通进程的用户不同,而一般服务是不具备与桌面交互的能力的,所以你的程序不会显示桌面。
=====================
服务进程和普通进程的用户不同,而一般服务是不具备与桌面交互的能力的,所以你的程序不会显示桌面。
#6
#7
服务启动时要指定特定用户来启动,并且默认情况下是无法访问桌面的,而启动应用程序则是以当前用户运行的。system权限>admin权限,可以枚举admin的进程~这个没有问题
#8
To: fangchao918628
我安装的时候是通过命令安装的。
我安装的时候是通过命令安装的。
#9
创建服务时将服务创建成可交互的,这样创建的子进程应该可以和桌面交互
#10
看下服务的属性,登陆,将允许与界面 交互勾上,看能出界面不
不过可能还是连接不上数据库
不过可能还是连接不上数据库
#11
我已经用administartor的方式登陆服务了,但是还是没有界面,进程中显示服务所启动的进程是adminstrator的了,但是还是不能写库!
#12
非常悲剧的是,我仍然可以手动启动我的工作进程!
#13
可能的一个原因
HANDLE m_hMutex = ::CreateMutex(NULL, TRUE, L"XXXX");
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
exit(0);
return FALSE;
}
LZ的代码如果是这样写的,else就放行,当你双击打开的时候返回的是ERROR_ACCESS_DENIED这样一样可以运行,所以打开了两个,纯属猜测!!!
#14
希望杯具能变成洗具
#15
一般的服务程序是不能和桌面交互的,要和用户进行交互(如显示窗口),我们必须打开用户WinSta0和desktop,给段代码给你:
HDESK hdeskCurrent;
HDESK hdesk;
HWINSTA hwinstaCurrent;
HWINSTA hwinsta;
hwinstaCurrent = GetProcessWindowStation();
if (hwinstaCurrent == NULL){
LogEvent(_T("get window station err"));
return FALSE;
}
hdeskCurrent = GetThreadDesktop(GetCurrentThreadId());
if (hdeskCurrent == NULL){
LogEvent(_T("get window desktop err"));
return FALSE;
}
//打开winsta0
hwinsta = OpenWindowStation("winsta0", FALSE,
WINSTA_ACCESSCLIPBOARD |
WINSTA_ACCESSGLOBALATOMS |
WINSTA_CREATEDESKTOP |
WINSTA_ENUMDESKTOPS |
WINSTA_ENUMERATE |
WINSTA_EXITWINDOWS |
WINSTA_READATTRIBUTES |
WINSTA_READSCREEN |
WINSTA_WRITEATTRIBUTES);
if (hwinsta == NULL){
LogEvent(_T("open window station err"));
return FALSE;
}
if (!SetProcessWindowStation(hwinsta)){
LogEvent(_T("Set window station err"));
return FALSE;
}
//打开desktop
hdesk = OpenDesktop("default", 0, FALSE,
DESKTOP_CREATEMENU |
DESKTOP_CREATEWINDOW |
DESKTOP_ENUMERATE |
DESKTOP_HOOKCONTROL |
DESKTOP_JOURNALPLAYBACK |
DESKTOP_JOURNALRECORD |
DESKTOP_READOBJECTS |
DESKTOP_SWITCHDESKTOP |
DESKTOP_WRITEOBJECTS);
if (hdesk == NULL){
LogEvent(_T("Open desktop err"));
return FALSE;
}
SetThreadDesktop(hdesk);
//到这一步,我们获取了和用户交互(如显示窗口)的权利
CMsgDlg dlgMsg;
//显示一个dialog
dlgMsg.DoModal();
if (!SetProcessWindowStation(hwinstaCurrent))
return FALSE;
if (!SetThreadDesktop(hdeskCurrent))
return FALSE;
if (!CloseWindowStation(hwinsta))
return FALSE;
if (!CloseDesktop(hdesk))
return FALSE;
HDESK hdeskCurrent;
HDESK hdesk;
HWINSTA hwinstaCurrent;
HWINSTA hwinsta;
hwinstaCurrent = GetProcessWindowStation();
if (hwinstaCurrent == NULL){
LogEvent(_T("get window station err"));
return FALSE;
}
hdeskCurrent = GetThreadDesktop(GetCurrentThreadId());
if (hdeskCurrent == NULL){
LogEvent(_T("get window desktop err"));
return FALSE;
}
//打开winsta0
hwinsta = OpenWindowStation("winsta0", FALSE,
WINSTA_ACCESSCLIPBOARD |
WINSTA_ACCESSGLOBALATOMS |
WINSTA_CREATEDESKTOP |
WINSTA_ENUMDESKTOPS |
WINSTA_ENUMERATE |
WINSTA_EXITWINDOWS |
WINSTA_READATTRIBUTES |
WINSTA_READSCREEN |
WINSTA_WRITEATTRIBUTES);
if (hwinsta == NULL){
LogEvent(_T("open window station err"));
return FALSE;
}
if (!SetProcessWindowStation(hwinsta)){
LogEvent(_T("Set window station err"));
return FALSE;
}
//打开desktop
hdesk = OpenDesktop("default", 0, FALSE,
DESKTOP_CREATEMENU |
DESKTOP_CREATEWINDOW |
DESKTOP_ENUMERATE |
DESKTOP_HOOKCONTROL |
DESKTOP_JOURNALPLAYBACK |
DESKTOP_JOURNALRECORD |
DESKTOP_READOBJECTS |
DESKTOP_SWITCHDESKTOP |
DESKTOP_WRITEOBJECTS);
if (hdesk == NULL){
LogEvent(_T("Open desktop err"));
return FALSE;
}
SetThreadDesktop(hdesk);
//到这一步,我们获取了和用户交互(如显示窗口)的权利
CMsgDlg dlgMsg;
//显示一个dialog
dlgMsg.DoModal();
if (!SetProcessWindowStation(hwinstaCurrent))
return FALSE;
if (!SetThreadDesktop(hdeskCurrent))
return FALSE;
if (!CloseWindowStation(hwinsta))
return FALSE;
if (!CloseDesktop(hdesk))
return FALSE;
#16
mark
#17
同志们,这个问题我找了一会,也听了大家说的,可能还是要具体问题具体分析吧,但是还是没有给自己满意的答案,就此结帐了,不过我会继续找下去的,有了新的进展再发帖啊!谢谢各位了!