この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を使用する方法に苦労しています。