图片 1

设置c#windows服务描述及允许服务与桌面交互的几种方法(作者博客还有一大堆C#创建服务的文章)

养虎遗患此主题素材的几个关键点如下:

重回“小编的文书档案”路线字符串

方法一:

1、该现象只会冒出在NTFS文件系统中。

Environment.GetFolderPath(Environment.SpecialFolder.Personal)

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

2、由NTFS文件系统的拜谒权限引致。

图片 1

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;

雷同手工业操作的解决方案如下:

本技艺运用GetFolderPath方法来获取指向由内定枚举标志的体系特别文件夹的路线。语法格式如下:

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

1、调控面板—文件夹选项—查看 关闭“使用简便文件共享”

public static string GetFolderPath (SpecialFolder folder)

    //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());
   }
  }

2、接受存放数据库文件的文件夹,右键选取属性,此时会多出二个“安全”选项卡,选取最终二个客商,将该顾客的权杖设为“完全调节”。

参数folder标志系统极其文件夹的枚举常数。

  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);
   }
  }

上面入眼讲这两步,用C#代码的完结,因为当大家为品种打包后,不可能让客商手工业来实践那一个操作1、C#关闭轻松文件分享的代码实今后百度、Google寻找此问题一蹴即至情势时,比比较多的操作方法并不科学,经过和煦实操测量试验,正确方法如下:
注册表文件: Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa]
“forceguest”=dword:00000000 批处理: reg add
HKLM\SYSTEM\CurrentControlSet\Control\Lsa /v forceguest /t REG_WOMuranoD
/d 0x00000000 /f 假使选中此项,则将上述 0x00000000 改为 0x00000001。
通过改动注册表的方式实现代码如下: Microsoft.Win32.RegistryKey key =
Microsoft.Win32.Registry.LocalMachine; Microsoft.Win32.RegistryKey
software = key.OpenSubKey(@”SYSTEM\CurrentControlSet\Control\Lsa”,
true); software.SetValue(“forceguest”, 0);
2、C#校订内定文件夹的客户访谈权限代码实现如下: string path =
this.Context.Parameters[“targetdir”];//得到文件夹路线 DirectoryInfo
dInfo = new DirectoryInfo(path卡塔尔国; DirectorySecurity dSecurity =
dInfo.GetAccessControl(State of Qatar; dSecurity.AddAccessRule(new
FileSystemAccessRule(Environment.UserName, FileSystemRights.CreateFiles,
AccessControlType.AllowState of Qatar卡塔尔; dInfo.SetAccessControl(dSecurity卡塔尔国;

重视代码如下:

方法二:

MessageBox.Show(“小编的文书档案系统路径:” + Environment.GetFolder帕特h(Environment.SpecialFolder.Personal卡塔尔, “笔者的文书档案”,MessageBoxButtons.OK,MessageBoxIcon.Information卡塔尔;

此办法经测量检验,发掘不行,勾是选上了,但顺序运行后只怕未有分界面现身,好像需求计算机重启才生效

参考一:C# 怎么着获得某顾客的“小编的文书档案”的目录
Console.WriteLine(System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments));

作者们写八个劳务,一时候要让服务运维有个别应用程序,将在更改服务的属性,勾选允许服务与桌面交互作用,

System.Environment.GetFolderPath 方法
赢得指向由钦点枚举标志的系统极度文件夹的路径。

能够用改进注册表达成,我们必需在设置后操作,所以请重写Installer的OnAfterInstall。

public static string GetFolderPath(
Environment.SpecialFolder folder
)
Environment.SpecialFolder 枚举表明:
分子名称 表明 
ApplicationData
目录,它看作当前参观顾客的应用程序特定数据的共用储存库。 
CommonApplicationData
目录,它作为全体客商使用的应用程序特定数据的公物积累库。 
LocalApplicationData
目录,它充任当前非漫游客户采纳的应用程序特定数据的集体储存库。 
Cookies 用作 Internet Cookie 的国有积存库的目录。 
Desktop 逻辑桌面,并非物理文件系统地点。 
Favorites 用功顾客收藏夹项的国有积攒库的目录。 
History 用作 Internet 历史记录项的集容量存库的目录。 
InternetCache 用作 Internet 有时文件的国有储存库的目录。 
Programs 包罗顾客程序组的目录。 
My计算机 “作者的微型机”文件夹。  
MyMusic “My Music”文件夹。 
MyPictures “My Pictures”文件夹。 
Recent 包罗客户近些日子利用过的文档的目录。 
SendTo 满含“发送”菜单项的目录。 
StartMenu 包罗“开首”菜单项的目录。 
Startup 对应于客商的“运转”程序组的目录。 
System “System”目录。 
Templates 用作文书档案模板的公共积累库的目录。 
DesktopDirectory 用于物理上囤积桌面上的公文对象的目录。 
Personal 用作文书档案的公共积攒库的目录。 
MyDocuments “我的微管理机”文件夹。 
ProgramFiles “Program files”目录。 
CommonProgramFiles 用于应用程序间分享的机件的目录。

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);
}

参考二:C#展开桌面等极度系统路线

onstart的时候改进注册表   
  
[HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/瑟维斯s/你的服务名]   
   “Type”=dword:00000010   
   key    value+256   
   比方未来00000010是16+256=272   
   16进制就是00000110 

昔不近年来的操作系统,桌面包车型地铁不二等秘书诀不尽相近,何况随着顾客安装地点的两样也分裂。
C#能够从Windows注册表读取得到顾客的新鲜文件夹(桌面、收藏夹等等)的地方。
代码如下:

方法三:

using Microsoft.Win32;
namespace JPGCompact
{
    public partial class MainForm : Form
    {
        private void Test()
        {
            RegistryKey folders;
            folders = OpenRegistryPath(Registry.CurrentUser,
@”\software\microsoft\windows\currentversion\explorer\shell
folders”);
            // Windows客商桌面路线
            string desktopPath =
folders.GetValue(“Desktop”).ToString();
            // Windows客商字体目录路线
            string fontsPath = folders.GetValue(“Fonts”).ToString();
            // Windows客商网络邻居路线
            string nethoodPath =
folders.GetValue(“Nethood”).ToString();
            // Windows顾客自己的文书档案路线
            string personalPath =
folders.GetValue(“Personal”).ToString();
            // Windows客商早先菜单程序路线
            string programsPath =
folders.GetValue(“Programs”).ToString();
            // Windows客户贮存客商近日看望文书档案快速格局的目录路线
            string recentPath = folders.GetValue(“Recent”).ToString();
            // Windows客户发送到目录路线
            string sendtoPath = folders.GetValue(“Sendto”).ToString();
            // Windows客商初阶菜单目录路线
            string startmenuPath =
folders.GetValue(“Startmenu”).ToString();
            // Windows客户发轫菜单运转项目录路线
            string startupPath =
folders.GetValue(“Startup”).ToString();
            // Windows顾客收藏夹目录路线
            string favoritesPath =
folders.GetValue(“Favorites”).ToString();
            // Windows顾客网页历史目录路线
            string historyPath =
folders.GetValue(“History”).ToString();
            // Windows客户Cookies目录路线
            string cookiesPath =
folders.GetValue(“Cookies”).ToString();
            // Windows客户Cache目录路线
            string cachePath = folders.GetValue(“Cache”).ToString();
            // Windows客户APP数据目录路线
            string appdataPath =
folders.GetValue(“Appdata”).ToString();
            // Windows顾客打字与印刷目录路线
            string printhoodPath =
folders.GetValue(“Printhood”).ToString();
        }

使用System.ServiceProcess.ServiceController

        private RegistryKey OpenRegistryPath(RegistryKey root, string
s)
        {
            s = s.Remove(0, 1) + @”\”;
            while (s.IndexOf(@”\”) != -1)
            {
                root = root.OpenSubKey(s.Substring(0,
s.IndexOf(@”\”)));
                s = s.Remove(0, s.IndexOf(@”\”) + 1);
            }
            return root;
        }
    }

            ConnectionOptions coOptions = new ConnectionOptions();

c#中读取系统的情形变量、小编的文书档案路径、桌面路径等

            coOptions.Impersonation = ImpersonationLevel.Impersonate;

1
直接System.Environment.GetEnvironmentVariable[“变量名”];
比方得到Computer名、程序文件夹等
[sourcecode language=’c#’]
TextBox1.Text =
System.Environment.GetEnvironmentVariable(“COMPUTERNAME”) +”rn”;
TextBox1.Text =
System.Environment.GetEnvironmentVariable(“ProgramFiles”) +”rn”;
[/sourcecode]

            ManagementScope mgmtScope = new
System.Management.ManagementScope(@”root/CIMV2″, coOptions);

有关像“桌面”“小编的文书档案”能够如此得到

            mgmtScope.Connect();

[code language=’C#’]
TextBox1.Text +=
Environment.GetFolderPath(Environment.SpecialFolder.Personal卡塔尔国+
“rn”;//笔者的文书档案
TextBox1.Text +=
Environment.GetFolderPath(Environment.SpecialFolder.Desktop) +
“rn”;//桌面
[/code]
纵使用Environment.GetFolderPath(Environment.SpecialFolder.特殊文件夹卡塔尔
像cookies、音乐、录像、发送到等等都足以如此取得路线

            ManagementObject wmiService;

2

            wmiService = new ManagementObject(“Win32_Service.Name='” +
ServiceController.ServiceName + “‘”);

C#读取系统的景况变量

            ManagementBaseObject InParam =
wmiService.GetMethodParameters(“Change”);

 

            InParam[“DesktopInteract”] = true;

using System;
using System.Collections;

class ForeachApp
{
    public static void Main()
    {
        // 把环境变量中所有的值取出来,放到变量environment中
        IDictionary environment = Environment.GetEnvironmentVariables();
       
        // 打印表头
        Console.WriteLine("环境变量名\t=\t环境变量值");

        // 遍历environment中所有键值
        foreach (string environmentKey in environment.Keys)
        {
            // 打印出所有环境变量的名称和值
            Console.WriteLine("{0}\t=\t{1}", environmentKey, environment[environmentKey].ToString());
        }
    }
}

            ManagementBaseObject OutParam =
wmiService.InvokeMethod(“Change”, InParam, null);