写了一个服务,要求的功能很简单,这个服务在后台每过一段时间就做两件事:
一是定时去CHECK一个网络映射是否正常连通
二是定时去CHECK一个外部程序是否在正常运行,没有则起动起来。结果,写的过程却不是想的那么简单
在做网络映射连接时,用 WnetAddConnection2却不行,表现为,在“我的电脑”中出现一个打X的网络映射盘符后,又马上消失,而把这段代码COPY出来放到一个普通的程序上运行却没有问题。再者,
当由服务开起一个外部程序后,无论我是用WINEXEC,还是SHELLEXECUTE还是CREATEPROCEE,被开起来的外部程序似乎都有了“服务”的属性,就是在任务管理栏中KILL不掉了。所以问高手:
1,在服务中如何建网络磁盘映射
2,在服务中如何开起一个外部程序,而运行起来的程序要在任务管理栏中可以被KILL掉

解决方案 »

  1.   

    服务的桌面交互,需要OpenDesktop,SetThreadDesktop来处理WinSta0
    具体找Baidu
      

  2.   


    ly_liuyang 我也找到了一个方法,不过你说的这个方面也是很应该要研究一下,THS-------
    Syant J. Wang 2007/11/18然而,问题还没有完。随后又发现,由服务执行起来的外部程序却也有了如同“服务程序”般的属性,即这个被运行起来的外部程序竟然在“任务管理器”中不能被KILL掉。这可是一个重要问题,因为我的外部程序并不需要如此的“优待”,怎么解?
    于是我们不得不去研究另外一个话题了:如果以特定的用户来执行一个程序。
    当服务程序需要使用某些功能时,由于用户的关系而受到限制,比如访问注册表的HKEY_CURRENT_USER键,使用网络等等(后面马上就会碰到一个网络问题,即在服务中去创建一个网络磁盘映射也会出异常),这时候就需要以当前登陆用户的身份去进行操作,通常会创建一个进程来完成需要的功能。如果使用CreateProcess来创建进程的话,新创建的进程和服务程序依然是相同的用户身份,还是无法达到目的,只有使用CreateProcessAsUser了。CreateProcessAsUser的第一个参数是HANDLE   hToken,该参数通常应该用LogonUser来获得,只是LogonUser需要用户名和用户密码,这样在使用上很有局限。另外一种解决方法就是用CreateProcessWithLogonW,但由于这个API好象有对Windows版本的要求(我现在所用的XP SP2就不能正常工作)。其实,还有一个最简的方法,就是用系统的runas命令:
    如:
    runas/env/user:[email protected]"notepad\"myfile.txt\""by Syant J. Wang 2007/11/18
    ---------- 我现在是通过CreateToolhelp32Snapshot找到系统中EXPLORER.EXE的PROCESSID,再通过OpenProcessToken找到它的TOKEN,然后
    再CreateProcessAsUser执行外部程序,可能饶了一个大圈。