0

この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()
                               }
                   }
               }

これは、Windows サービスのインストールを作成する installshield スクリプトです。すなわち。システムに既に Windows サービスがインストールされている場合、再インストールするときに、Windows サービスが実行されていたユーザーを指す必要があることを確認する必要があります。(その localsystem が localsystem を指す必要がある場合、sharpeye500 のような特定のユーザーがパスワードを持っている場合は、sharpeye500 (ユーザー) を指す必要があり、パスワードのポップアップ (サービス ログインの設定など) が表示されます)。

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

                }
            }

私はこのロジックを持っています。私がする必要があるのは、これをインストールスクリプト(vb)に入れることだけですが、インストールスクリプトでManagementObjectを使用する方法に苦労しています。

4

1 に答える 1

0

そのアプローチは機能しません。まず、サービスのアカウントのユーザー名は簡単に取得できますが、アカウントのパスワードを取得するメソッドを呼び出すことはできません (明らかなセキュリティ上の制限です)。

サービスの削除はスムーズに進みますが、Create メソッドでは、LocalSystem 以外のアカウントのユーザー名とパスワードの両方が必要です (これもセキュリティのため)。これは、LocalSystem 以外のすべてのアカウントで問題になります。

サービスを削除して再インストールする必要があるのはなぜですか? サービスを停止して、サービスが呼び出す基本的な実行可能ファイル/dll を更新することはできますか? API 関数を使用してサービスのコマンド ラインを変更することもできます...

于 2012-05-03T02:21:44.527 に答える