服务程序启动的进程和用户启动的进程有什么区别?

时间:2022-08-29 14:54:24
    事情是这样的,我做了一个Windows服务程序(自动启动),用来监测另一个工作进程的运行,这个进程有写数据库的动作。希望达到的功能是,一旦工作进程异常断开,服务程序能够重启它。 
    结果,服务程序运行了一个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


引用 12 楼 joymshwo 的回复:
非常悲剧的是,我仍然可以手动启动我的工作进程!

可能的一个原因

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;

#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


引用 12 楼 joymshwo 的回复:
非常悲剧的是,我仍然可以手动启动我的工作进程!

可能的一个原因

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;

#16


mark

#17


同志们,这个问题我找了一会,也听了大家说的,可能还是要具体问题具体分析吧,但是还是没有给自己满意的答案,就此结帐了,不过我会继续找下去的,有了新的进展再发帖啊!谢谢各位了!