方法一:

在ProjectInstaller.cs重写 install() ,Uninstall()方法

public override void Install(IDictionary stateServer)
  {
   Microsoft.Win32.RegistryKey system,
    //HKEY_LOCAL_MACHINE\Services\CurrentControlSet
    currentControlSet,
    //...\Services
    services,
    //...\<Service Name>
    service,
    //...\Parameters - this is where you can put service-specific configuration
    config;

try
   {
    //Let the project installer do its job
    base.Install(stateServer);

//Open the HKEY_LOCAL_MACHINE\SYSTEM key
    system = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("System");
    //Open CurrentControlSet
    currentControlSet = system.OpenSubKey("CurrentControlSet");
    //Go to the services key
    services = currentControlSet.OpenSubKey("Services");
    //Open the key for your service, and allow writing
    service = services.OpenSubKey(this.serviceInstaller1.ServiceName, true);
    //Add your service's description as a REG_SZ value named "Description"
    service.SetValue("Description","PI实时数据采集:能源--每天8点或20点取一次数据;汽车衡--每天1点取一次数据;设备状态--每分钟取一次数据。");
    //(Optional) Add some custom information your service will use...
    //允许服务与桌面交互
    service.SetValue("Type",0x00000110);
    config = service.CreateSubKey("Parameters");
   }
   catch(Exception e)
   {
    Console.WriteLine("An exception was thrown during service installation:\n" + e.ToString());
   }
  }

public override void Uninstall(IDictionary stateServer)
  {
   Microsoft.Win32.RegistryKey system,
    currentControlSet,
    services,
    service;

try
   {
    //Drill down to the service key and open it with write permission
    system = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("System");
    currentControlSet = system.OpenSubKey("CurrentControlSet");
    services = currentControlSet.OpenSubKey("Services");
    service = services.OpenSubKey(this.serviceInstaller1.ServiceName, true);
    //Delete any keys you created during installation (or that your service created)
    service.DeleteSubKeyTree("Parameters");
    //...
   }
   catch(Exception e)
   {
    Console.WriteLine("Exception encountered while uninstalling service:\n" + e.ToString());
   }
   finally
   {
    //Let the project installer do its job
    base.Uninstall(stateServer);
   }
  }

方法二:
此方法经测试,发现无效,勾是选上了,但程序启动后还是没有界面出现,好像需要电脑重启才生效

我们写一个服务,有时候要让服务启动某个应用程序,就要修改服务的属性,勾选允许服务与桌面交互,

可以用修改注册表实现,我们必须在安装后操作,所以请重写Installer的OnAfterInstall。

        protected override void OnAfterInstall(System.Collections.IDictionary savedState) {            RegistryKey rk = Registry.LocalMachine;            string key = @"SYSTEM\CurrentControlSet\Services\" + this.sInstaller.ServiceName;            RegistryKey sub = rk.OpenSubKey(key, true);            int value = (int)sub.GetValue("Type");            if (value < 256) {                sub.SetValue("Type", value | 256);            }            base.OnAfterInstall(savedState);        }onstart的时候修改注册表      [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\你的服务名]      "Type"=dword:00000010      key    value+256      比如现在00000010是16+256=272      16进制就是00000110 
方法三:使用System.ServiceProcess.ServiceController            ConnectionOptions coOptions = new ConnectionOptions();            coOptions.Impersonation = ImpersonationLevel.Impersonate;            ManagementScope mgmtScope = new System.Management.ManagementScope(@"root\CIMV2", coOptions);            mgmtScope.Connect();            ManagementObject wmiService;            wmiService = new ManagementObject("Win32_Service.Name='" + ServiceController.ServiceName + "'");            ManagementBaseObject InParam = wmiService.GetMethodParameters("Change");            InParam["DesktopInteract"] = true;            ManagementBaseObject OutParam = wmiService.InvokeMethod("Change", InParam, null);            ServiceController.Start();

描述:在自己写的一个系统服务程序,需要经常用到“允许与桌面进行交互”的设置,网上很多使用修改注册表的形式实现,我测试过,修改注册表后,选中的勾是选上了,

但不能弹出应用程序;据说重启电脑后可以,但我不想重启,实际应用也不允许重启,故没有测试重启是否可行的情况。如图:

例如:

当我需要运行服务程序的时候,弹出我的应用程序,则要在Windows服务“允许服务与桌面交互”中打勾,

当我不想弹出应用程序界面的时候,则去掉其中的勾选。

实现方式:

1.在服务程序安装时编程实现,ProjectInstaller.cs

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration.Install;
//using System.Linq;
using Microsoft.Win32; //对注册表操作一定要引用这个命名空间
namespace MonitorService
{
    [RunInstaller(true)]
    public partial class ProjectInstaller : Installer
    {
        public ProjectInstaller()
        {
            InitializeComponent();            
            //this.Context.Parameters["ServerCode"].ToString(); // 读取安装时输入的服务器编号           
        }
        private void ProjectInstaller_AfterInstall(object sender, InstallEventArgs e)
        {
            //设置允许服务与桌面交互
            SetServiceTable("MonitorService");            
        }
        /// <summary>
        /// 设置允许服务与桌面交互 ,修改了注册表,要重启系统才能生效
        /// </summary>
        /// <param name="ServiceName">服务程序名称</param>
        private void SetServiceTable(string ServiceName)
        {
            RegistryKey rk = Registry.LocalMachine;
            string key = @"SYSTEM\CurrentControlSet\Services\" + ServiceName;
            RegistryKey sub = rk.OpenSubKey(key, true);
            int value = (int)sub.GetValue("Type");
            sub.SetValue("Type", value | 256);
        }
    }
}

2.注册表修改

onstart的时候修改注册表   
   [HKEY_LOCAL_MACHINE"SYSTEM"CurrentControlSet"Services"你的服务名]   
   "Type"=dword:00000010   
   key    value+256   
   比如现在00000010是16+256=272   
   16精制就是00000110

3.SC程序修改, 允许与桌面进行交互

在dos命令提示符下输入:
sc config MonitorService type= interact type= own

回车即可。

可以用批处理的方式实现,把下面代码保存为 myservice.bat 即可:

rem 配置服务程序为允许与桌面进行交互方式
@echo "准备停止服务程序..."
sc stop MyService
@echo "设置允许与桌面进行交互方式允许"
sc config MyService type= interact type= own
@echo "正在重新启动服务..."
sc start MyService
@echo "启动服务成功!"

取消“允许与桌面进行交互”

DOS命令提示符下运行下面语句即可:

sc config MyService type= own

经测试:1,2 可以选中“允许与桌面进行交互”,但启动服务的时候,不能弹出应用程序的界面。

3 可以完美实现所有要求。

至此,我遇到的问题也完美的得到解决。

用VS2003部署,让服务程序安装完后立即启动服务并且选中“允许服务与桌面交互”及添加服务描述的方法

view plaincopy to clipboardprint?
-----------立即启动--------------   
private void serviceInstaller1_AfterInstall(object sender, System.Configuration.Install.InstallEventArgs e)   
{   
ServiceController myService = new ServiceController("XJOAPigeonholeServer");   
myService.Start();   
myService.Dispose();   
}   
  
  
添加描述:1.1没有直接方法,2.0里有直接的方法 ServiceInstaller.Description   
//----------------------------添加服务描述信息 开始 ------------   
public override void Install(IDictionary stateServer)   
{   
Microsoft.Win32.RegistryKey system,   
//HKEY_LOCAL_MACHINE\Services\CurrentControlSet   
currentControlSet,   
//...\Services   
services,   
//...\ <Service Name>   
service,   
//...\Parameters - this is where you can put service-specific configuration   
config;   
try   
{   
//Let the project installer do its job   
base.Install(stateServer);   
  
//Open the HKEY_LOCAL_MACHINE\SYSTEM key   
system = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("System");   
//Open CurrentControlSet   
currentControlSet = system.OpenSubKey("CurrentControlSet");   
//Go to the services key   
services = currentControlSet.OpenSubKey("Services");   
//Open the key for your service, and allow writing   
service = services.OpenSubKey(this.serviceInstaller1.ServiceName, true);   
//Add your service's description as a REG_SZ value named "Description"   
service.SetValue("Description","XJOA系统自动归档服务(BeijiOffice)");   
//(Optional) Add some custom information your service will use...   
//允许服务与桌面交互   
service.SetValue("Type",0x00000110);   
config = service.CreateSubKey("Parameters");   
}   
catch(Exception e)   
{   
Console.WriteLine("An exception was thrown during service installation:\n" + e.ToString());   
}   
}   
  
public override void Uninstall(IDictionary stateServer)   
{   
Microsoft.Win32.RegistryKey system,   
currentControlSet,   
services,   
service;   
  
try   
{   
//Drill down to the service key and open it with write permission   
system = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("System");   
currentControlSet = system.OpenSubKey("CurrentControlSet");   
services = currentControlSet.OpenSubKey("Services");   
service = services.OpenSubKey(this.serviceInstaller1.ServiceName, true);   
//Delete any keys you created during installation (or that your service created)   
service.DeleteSubKeyTree("Parameters");   
//...   
}   
catch(Exception e)   
{   
Console.WriteLine("Exception encountered while uninstalling service:\n" + e.ToString());   
}   
finally   
{   
//Let the project installer do its job   
base.Uninstall(stateServer);   
}   
}   
//---------------------------- 结束 ----------------------------

四、这一服务程序运行时没有图形界面?

不错,刚才直接运行mfc1.exe时我们看到了图形界面,但在服务列表中用右键菜单中的“启动”时却看不到任何界面。这该怎么办?

我们还需要在使用CreateService函数时(Install()中),加上一个参数,这样才能允许程序与桌面交互,也就是可以显示界面。这个参数是SERVICE_INTERACTIVE_PROCESS。

填加后的CreateService:

  SC_HANDLE hService = ::CreateService(
     hSCM, m_szServiceName, m_szServiceName,
     SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS,
     SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
     szFilePath, NULL, NULL, _T("RPCSS"), NULL, NULL);

  
再次编译mfc1,卸载服务后,安装服务。我们可以看到,通过服务列表启动mfc1,原有的对话框出现了。

如需将服务设为自动启动,则将 SERVICE_DEMAND_START 改为 SERVICE_AUTO_START。

设置c#windows服务描述及允许服务与桌面交互的几种方法相关推荐

  1. python安装到桌面的路径是什么_Python 获取windows桌面路径的5种方法小结

    这里介绍了5中python获取window桌面路径的方法,获取这个路径有什么用呢?一般是将程序生成的文档输出到桌面便于查看编辑. 前两个方法是通过注册表来获取当前windows桌面绝对路径,比较推荐使 ...

  2. Python 获取windows桌面路径的5种方法小结

    今天小编就为大家分享一篇Python 获取windows桌面路径的5种方法小结,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 这里介绍了5中python获取window桌面路径的方法 ...

  3. python怎么保存到桌面_python3应用windows api对后台程序窗口及桌面截图并保存的方法...

    python的版本及依赖的库的安装 #版本python 3.7.1 pip install pywin32==224 pip install numpy==1.15.3 pip install ope ...

  4. Windows环境下打开cmd进入到指定目录的两种方法

    文章目录 一.cmd是什么 二.在指定的目录地址栏中输入cmd敲回车即可 三."Windows+r"键打开运行对话框,在框中输入cmd敲回车,然后再输入相应的命令 四.cmd常用指 ...

  5. 桌面安装计算机,获取新计算机或重新安装Windows后快速安装桌面程序的4种方法 | MOS86...

    Windows桌面是没有应用程序商店式软件安装过程的唯一平台.智能手机,平板电脑,Mac和Linux PC都可以快速安装多个程序 安装你最喜欢的节目没有我们 使用Ninite安装多个程序 Ninite ...

  6. vue动态设置文字布局方式_详解Vue动态添加模板的几种方法

    动态添加模板需要收集原始数据的页面,这个时候我们需要很多原始数据收集模板,下面给大家详解Vue 动态添加模板的几种方法,希望对你学习这方面知识有所帮助. 通常我们会在组件里的 template 属性定 ...

  7. windows 7计算机用户,win7系统打开超级账户的两种方法(图文)

    有时候win7系统修改或删除文件需要使用超级用户Administrator,但有些系统中没有Administrator超级用户的帐户,其实不是没有超级账户,是有的Administrator超级用户的帐 ...

  8. 曙光服务器如何重新设置u盘启动_u盘装系统设置u盘启动的两种方法

    u盘装系统现在已经成为了电脑装系统的主要方式,在装系统之前,我们得设置电脑u盘启动,由于不同的电脑其BIOS的设置方法不同,有的设置教程可能适合他但并不适合你,但总的来说,设置电脑u盘启动主要有2种方 ...

  9. Windows 10中重命名文件和文件夹的6种方法

    You can rename files on Windows 10 in many ways. If you're still right-clicking and selecting " ...

最新文章

  1. 在php中如何实现cookie即时生效,不用刷新就可以使用
  2. Oracle数据库多表查询
  3. GRPC golang版源码分析之客户端(一)
  4. IOS15之JSON的解析字典转模型
  5. Elasticsearch Pipeline 详解
  6. Facebook产品更新,官方通知你收到了吗?
  7. [译]R语言——Shiny框架之入门(三):如何启动一个Shiny应用
  8. 腾讯网易音乐版权之争,拼的是什么?
  9. 百度图神经网络学习——day01
  10. 12.1 LNMP架构介绍 12.2 MySQL安装 12.3/12.4 PHP安装 12.5 Ng
  11. 技术项目 - MySQL多从系统的主库选择
  12. JAVA基础编程练习题--50道
  13. 微信小程序 自定义导航栏
  14. 服务器和微信公众号的区别,微信小程序和公众号的区别,看这三点就懂了
  15. python打印购物小票
  16. uni-app开发中的#ifdef MP是什么意思?条件编译
  17. Word更新所有域的代码
  18. android 图库刷新,关于主动刷新Android系统图库方法总结
  19. 扬州首套旅游数字藏品“扬州园林”,打造数字化元宇宙城市名片
  20. 数据分析学习:数据分析学习步骤有哪些

热门文章

  1. Java高并发编程:总线锁定和缓存一致性的问题
  2. android 除了webview 浏览器控件,AgentWeb是基于Android WebView一个功能完善小型浏览器库...
  3. 服务器多难管理怎么办?给你一个服务器批量管理工具
  4. 何时使用构造函数,构造函数使用new关键字
  5. Java虚拟机详解(八)------虚拟机监控和分析工具(2)——可视化
  6. Harvard's CS50
  7. 洛谷——P3811 【模板】乘法逆元
  8. Python 里面如何生成随机数?
  9. 超便携式截屏录屏软件FastStone Capture
  10. Android基础教程pdf