Installshield使用特定的登录用户帐户创建服务

时间:2012-05-02 23:03:45

标签: c# asp.net windows-services windows-installer installshield

使用这个c#代码,我可以获得我的Windows服务用户

        System.Management.SelectQuery sQuery = new System.Management.SelectQuery(string.Format("select Name,startname from Win32_Service where name ='MyWindowsServices' ")); 

            using (System.Management.ManagementObjectSearcher mgmtSearcher = new System.Management.ManagementObjectSearcher(sQuery))
            {
                foreach (System.Management.ManagementObject service1 in mgmtSearcher.Get())
                {

            //If not local system , then associated with different user                                  
             if(service1["startname"].ToString().ToLower()!="localsystem")
                               {
                             service1["startname"].ToString()).ToString()
                               }
                   }
               }

这是我的installshield脚本,用于创建我的Windows服务安装。即。如果系统已经安装了我的Windows服务,当他们再次重新安装时,我需要确保我需要指向运行Windows服务的用户。 (如果它的本地系统它应该指向localsystem,如果它的特定用户像sharpeye500有一些密码,那么它应该指向sharpeye500(用户)& pop up(如设置服务登录)以显示密码)。

Set objCreate = objWMIService.Get("Win32_BaseService")


Get Window Service 
Set colListOfServices = objWMIService.ExecQuery _
 ("Select * from Win32_Service Where Name = 'MyWindowsServices'")
'First Stop and Delete service and then install
For Each objService in colListOfServices  

//我获得了与服务相关联的用户名

 startName=objService.StartName   
    objService.StopService()   
    Next   

'I have delete service logic & then i install Window Service again

objCreate.Create "MyWindowsServices" ,"My Windows Service Description" ,
"c:\test\" & "MyWindowsServices.exe", OWN_PROCESS, NORMAL_ERROR_CONTROL,
 "Automatic", NOT_INTERACTIVE, startName, ""  

但是当我在上面的语法中传递startName时,我的安装失败,但是如果我通过Null,它会创建一个带有localsystem用户帐户的Windows服务安装。

如何获得与Windows服务相关的用户帐户&通过installshield脚本将其分配回安装?


  System.Management.SelectQuery sQuery = new System.Management.SelectQuery(string.Format("select startname from Win32_Service where name ='MyWindowsService' ")); 
            using (System.Management.ManagementObjectSearcher mgmtSearcher = new System.Management.ManagementObjectSearcher(sQuery))
            {
                foreach (System.Management.ManagementObject service in mgmtSearcher.Get())
                {
                    if (service["startname"].ToString().ToLower() != "localsystem" || service["startname"].ToString().ToLower() != "localservice")
                    {
                        this.ServiceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.User;
                        this.ServiceProcessInstaller1.Username = service["startname"].ToString();
                    }
                    else
                    {

                        this.ServiceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem;
                        this.ServiceProcessInstaller1.Password = null;
                        this.ServiceProcessInstaller1.Username = null;
                    }

                }
            }

我有这个逻辑,我需要做的就是将它放在installscript中(在vb中),但我正在努力如何在installscript中使用ManagementObject。

1 个答案:

答案 0 :(得分:0)

这种方法不起作用。首先,虽然您可以随时获取服务帐户的用户名,但您无法调用方法来获取帐户的密码(明显的安全限制)。

删除服务将顺利进行,但Create方法需要用户名和&除了LocalSystem之外的任何帐户的密码(再次,为安全起见),您将不会完全拥有该密码。对于LocalSystem以外的任何帐户,这都是一个问题。

为什么你要删除&重新安装您的服务?你能简单地停止服务并更新服务调用的底层可执行文件/ dll吗?您甚至可以使用API​​函数更改服务的命令行...