Windows サービス (C#、Visual Studio 2010 で開発) が Windows 7 または Windows Server 2008 R2 を実行しているシステムにインストールされるたびに、システム エラー 7030 がログに記録されます。サービスはインタラクティブに構成されていません。私が作成したカスタムインストーラーサブクラスは、アカウントの種類を NetworkService に設定します。
private System.ServiceProcess.ServiceProcessInstaller _serviceProcessInstaller;
private System.ServiceProcess.ServiceInstaller _serviceInstaller;
public ProjectInstaller()
{
InitializeComponent();
}
private void InitializeComponent()
{
_serviceProcessInstaller = new System.ServiceProcess.ServiceProcessInstaller();
_serviceInstaller = new System.ServiceProcess.ServiceInstaller();
_serviceProcessInstaller.Account = System.ServiceProcess.ServiceAccount.NetworkService;
_serviceProcessInstaller.Password = null;
_serviceProcessInstaller.Username = null;
_serviceInstaller.ServiceName = Resources.ServiceName;
_serviceInstaller.Description = Resources.ServiceDescription;
_serviceInstaller.StartType = System.ServiceProcess.ServiceStartMode.Automatic;
Installers.AddRange(new Installer[]
{
_serviceProcessInstaller,
_serviceInstaller
});
}
また、アカウントの種類を LocalSystem に設定しようとしましたが、この場合もエラー 7030 が記録されます。
同じインストーラ サブクラスで、デスクトップにアクセスするためにコードで Windows サービスを構成するにはどうすればよいですか? に基づいて、レジストリ エントリの設定を解除しようとしました。:
/// <summary>
/// Override OnCommitted() to overwrite the value of Interactive to be false.
/// </summary>
/// <remarks>
/// See https://stackoverflow.com/questions/1945529/how-can-i-configure-my-windows-service-in-the-code-to-access-the-desktop
/// </remarks>
/// <param name="savedState"></param>
protected override void OnCommitted(System.Collections.IDictionary savedState)
{
const string pathToKey = @"SYSTEM\CurrentControlSet\services\MyService.exe";
const string type = "Type";
using (var registryKey = Registry.LocalMachine.OpenSubKey(pathToKey, true))
{
if (registryKey != null && registryKey.GetValue(type) != null)
{
registryKey.SetValue(type, (((int)registryKey.GetValue(type) & ~0x100)));
}
}
base.OnCommitted(savedState);
}
これら 2 つの修正の試みはいずれも機能しませんでした。SOで次のことも見ました。「サービスがデスクトップと対話することを許可する」の代替?およびWindows サービス インストーラーで「デスクトップと対話する」を設定する方法。