设置Windows服务允许进行桌面交互,实现屏幕监控

默认情况下,Windows服务基于安全考虑,是不允许任何服务程序和桌面进行交互的,也就是说,使用任何的Windows Form 的很多特性将会莫名奇妙的不起作用,如进行屏幕截图,或者使用System.Windows.Form.Timer对象也不行。由于Windows服务具有难以调试的特点,如果不注意这点,你反复检查自己的代码,都很难发现问题的所在的,我开始就是摸索了很久才发现,呵呵。

Windows服务的优点有:1. 能够自动运行。2. 不要求用户交互。3. 在后台运行。

一般情况下,Windows服务被用于耗费时间很多的进程中,例如备份数据库,数据同步等等。 

本文介绍如何开启Windows服务桌面交互的设置,以便进行屏幕监控的功能开发,首先介绍一下屏幕监控的程序--绿苗帮电脑监控软件,它是随系统自动启动,在服务中定时进行屏幕截图的一个小软件,给家长提供监控小孩电脑使用情况使用的,系统管理界面如下所示 。

Windows服务默认情况下,不支持进行屏幕截图的,需要在安装程序的时候,把系统的参数修改一下才可以,下面是两种方式实现该功能的开启 :

       private void serviceInstaller_AfterInstall(object sender, InstallEventArgs e)
        {
            base.OnAfterInstall(e.SavedState);

            ManagementObject wmiService = null;
            ManagementBaseObject InParam = null;
            try
            {
                wmiService = new ManagementObject(string.Format("Win32_Service.Name='{0}'", Constants.ServiceName));
                InParam = wmiService.GetMethodParameters("Change");
                InParam["DesktopInteract"] = true;
                wmiService.InvokeMethod("Change", InParam, null);
            }
            finally
            {
                if (InParam != null)
                    InParam.Dispose();
                if (wmiService != null)
                    wmiService.Dispose();
            }
        }

另一种方式是通过注册表操作函数实现参数的修改:

        protected override void OnCommitted(System.Collections.IDictionary savedState)
        {
            base.OnCommitted(savedState);

            using (RegistryKey ckey = Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\Services\" + Constants.ServiceName, true))
            {
                if (ckey != null)
                {
                    if (ckey.GetValue("Type") != null)
                    {
                        ckey.SetValue("Type", (((int)ckey.GetValue("Type")) | 256));
                    }
                }
            }
        }

最终达到的效果就是注册表的参数修改了,如下图所示:

 

 本文转自博客园伍华聪的博客,原文链接:设置Windows服务允许进行桌面交互,实现屏幕监控,如需转载请自行联系原博主。

时间: 2024-07-29 08:26:09

设置Windows服务允许进行桌面交互,实现屏幕监控的相关文章

在win7下远程用Remoting和windows服务来截取桌面是黑屏

问题描述 要远程用Remoting对桌面截屏,在win7下,把程序做成控制台程序可以正确对桌面截图,但是做成windows服务来截取却是黑屏,在win2003下两种都可以对桌面截屏,不知道win7为什么截取失败?有路过高手请帮忙解决,或提出思路亦可,谢谢! 解决方案 解决方案二:估计是windows服务的权限问题,在win2003下用localsystem帐户可以,在windows7下就算用localsystem帐户也不可以.就是不知如何解决?没人关注,自己顶一下了.解决方案三:找到原因,也可以

C#通过创建Windows服务启动程序的方法详解_C#教程

本文实例讲述了C#通过创建Windows服务启动程序的方法.分享给大家供大家参考,具体如下: 1. 新建一个Windows服务应用程序 创建项目-->Visual C# 左侧的"+"-->Windows -->Windows 服务(右侧模板)-->输入名称,确定创建项目 2. 设置Windows服务的属性(Windows服务里没有窗体,所以点击左侧设计器里空白的地方即可在右侧属性栏里看到属性) 这里属性是控制服务器是否可以停止,暂停,继续等等的操作.根据需要选择

WINDOWS服务启动应用程序看不到界面

问题描述 如题,网上搜索了很久,都说是允许桌面交互的就可以了,为什么无论是手动设置.代码设置.服务器重启依旧看不到界面,网上那些方法难道都是复制粘贴没有实际应用测试吗? 解决方案 解决方案二:看看任务管理器里,是不是用"SYSTEM"用户启动的解决方案三:引用1楼rocmemory的回复: 看看任务管理器里,是不是用"SYSTEM"用户启动的 是SYSTEM用户,但是我将服务指定用户为administrator效果还是一样的.解决方案四:XP系统,windows服务

windows中允许服务与桌面交互的更改方法

 这篇文章主要介绍了windows中允许服务与桌面交互的更改方法,需要的朋友可以参考下 在Windows服务的安装类ProjectInstaller中加入以下方法:    代码如下: protected override void OnCommitted(System.Collections.IDictionary savedState) { base.OnCommitted(savedState); //将服务更改为允许桌面交互模式 ConnectionOptions coOptions =

vista和win7在windows服务中交互桌面权限问题解决方法:穿透Session 0 隔离_C#教程

Windows 服务在后台执行着各种各样任务,支持着我们日常的桌面操作.有时候可能需要服务与用户进行信息或界面交互操作,这种方式在XP 时代是没有问题的,但自从Vista 开始你会发现这种方式似乎已不起作用. Session 0 隔离实验 下面来做一个名叫AlertService 的服务,它的作用就是向用户发出一个提示对话框,我们看看这个服务在Windows 7 中会发生什么情况. using System.ServiceProcess; using System.Windows.Forms;

windows中允许服务与桌面交互的更改方法示例_实用技巧

在Windows服务的安装类ProjectInstaller中加入以下方法: 复制代码 代码如下: protected override void OnCommitted(System.Collections.IDictionary savedState){base.OnCommitted(savedState);//将服务更改为允许桌面交互模式ConnectionOptions coOptions = new ConnectionOptions();coOptions.Impersonatio

艾伟:.NET实现可交互的WINDOWS服务

这几天想做个文件监控服务,看了一下网上的关于WINDOWS服务的文章,数量都不少,都只讲了如何做一个最基本的服务,却没有讲述如何与用户进行交互.查看了MSDN,看一下关于服务的描述: Windows 服务应用程序在不同于登录用户的交互区域的窗口区域中运行.窗口区域是包含剪贴板.一组全局原子和一组桌面对象的安全对象.由于 Windows 服务的区域不是交互区域,因此 Windows 服务应用程序中引发的对话框将是不可见的,并且可能导致程序停止响应.同样,错误信息应记录在 Windows 事件日志中

.NET实现可交互的WINDOWS服务

这几天想做个文件监控服务,看了一下网上的关于WINDOWS服务的文章,数量都不少,都只讲了如何做一个最基本的服务,却没有讲述如何与用户进行交互.查看了MSDN,看一下关于服务的描述: Windows 服务应用程序在不同于登录用户的交互区域的窗口区域中运行.窗口区域是包含剪贴板.一组全局原子和一组桌面对象的安全对象.由于 Windows 服务的区域不是交互区域,因此 Windows 服务应用程序中引发的对话框将是不可见的,并且可能导致程序停止响应.同样,错误信息应记录在 Windows 事件日志中

设置Bitvise Ssh Client为Windows服务

设置Bitvise Ssh Client为Windows服务 Bitvise SSH Client就是原来的Bitvise Tunnelier,是一款功能丰富的 SSH 客户端,用来远程管理 Linux 系统,除了支持比较重要的动态端口转发外,还支持多帐号登录,图形界面的 SFTP,远程桌面等. 现在需要使用NSSM将其变为Windows服务.整理的相关脚本如下: 新建bat文件并运行,内容如下: "C:Program Files (x86)Bitvise SSH Clientnssm.exe&