web-dev-qa-db-ja.com

.NET(インストール後)でWindowsサービスのスタートアップの種類を変更するにはどうすればよいですか?

サービスをインストールするプログラムがあります。後でユーザーにスタートアップの種類を「自動」に変更するオプションを提供できるようにしたいと考えています。

OSはXP-違いがある場合(Windows API?))。

.NETでこれを行うにはどうすればよいですか?可能であればC#! :)

30
joshcomley

そのために、OpenService()およびChangeServiceConfig()ネイティブWin32 APIを使用できます。 pinvoke.net にはいくつかの情報があり、もちろん [〜#〜] msdn [〜#〜] にも情報があると思います。 P/Invoke Interopt Assistant を確認してください。

10
Christian.K

P/Invokeを使用してこれを行う方法について ブログ投稿 を書きました。私の投稿のServiceHelperクラスを使用すると、次のようにして開始モードを変更できます。

var svc = new ServiceController("ServiceNameGoesHere");  
ServiceHelper.ChangeStartMode(svc, ServiceStartMode.Automatic); 
53
Peter Kelly

サービスインストーラーで言う必要があります

[RunInstaller(true)]
public class ProjectInstaller : System.Configuration.Install.Installer 
{
    public ProjectInstaller()
    {
        ...
        this.serviceInstaller1.StartType = System.ServiceProcess.ServiceStartMode.Automatic;
    }
}

インストール中にユーザーに尋ねて、この値を設定することもできます。または、このプロパティをビジュアルスタジオデザイナーで設定します。

13
Arthur

WMIを使用してすべてのサービスを照会し、サービス名を入力されたユーザー値と照合できます。

サービスが見つかったら、StartModeプロパティを変更するだけです。

if(service.Properties["Name"].Value.ToString() == userInputValue)
{
    service.Properties["StartMode"].Value = "Automatic";
    //service.Properties["StartMode"].Value = "Manual";
}

//This will get all of the Services running on a Domain Computer and change the "Apple Mobile Device" Service to the StartMode of Automatic.  These two functions should obviously be separated, but it is simple to change a service start mode after installation using WMI

private void getServicesForDomainComputer(string computerName)
{
    ConnectionOptions co1 = new ConnectionOptions();
    co1.Impersonation = ImpersonationLevel.Impersonate;
    //this query could also be: ("select * from Win32_Service where name = '" + serviceName + "'");
    ManagementScope scope = new ManagementScope(@"\\" + computerName + @"\root\cimv2");
    scope.Options = co1;

    SelectQuery query = new SelectQuery("select * from Win32_Service");

    using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query))
    {
        ManagementObjectCollection collection = searcher.Get();

        foreach (ManagementObject service in collection)
        {
            //the following are all of the available properties 
            //boolean AcceptPause
            //boolean AcceptStop
            //string Caption
            //uint32 CheckPoint
            //string CreationClassName
            //string Description
            //boolean DesktopInteract
            //string DisplayName
            //string ErrorControl
            //uint32 ExitCode;
            //datetime InstallDate;
            //string Name
            //string PathName
            //uint32 ProcessId
            //uint32 ServiceSpecificExitCode
            //string ServiceType
            //boolean Started
            //string StartMode
            //string StartName
            //string State
            //string Status
            //string SystemCreationClassName
            //string SystemName;
            //uint32 TagId;
            //uint32 WaitHint;
            if(service.Properties["Name"].Value.ToString() == "Apple Mobile Device")
            {
                service.Properties["StartMode"].Value = "Automatic";
            }
        }
    }         
}

この応答を改善したかった...指定されたコンピューター、サービスのstartModeを変更する1つの方法:

public void changeServiceStartMode(string hostname, string serviceName, string startMode)
{
    try
    {
        ManagementObject classInstance = 
            new ManagementObject(@"\\" + hostname + @"\root\cimv2",
                                 "Win32_Service.Name='" + serviceName + "'",
                                 null);

        // Obtain in-parameters for the method
        ManagementBaseObject inParams = classInstance.GetMethodParameters("ChangeStartMode");

        // Add the input parameters.
        inParams["StartMode"] = startMode;

        // Execute the method and obtain the return values.
        ManagementBaseObject outParams = classInstance.InvokeMethod("ChangeStartMode", inParams, null);

        // List outParams
        //Console.WriteLine("Out parameters:");
        //richTextBox1.AppendText(DateTime.Now.ToString() + ": ReturnValue: " + outParams["ReturnValue"]);
    }
    catch (ManagementException err)
    {
        //richTextBox1.AppendText(DateTime.Now.ToString() + ": An error occurred while trying to execute the WMI method: " + err.Message);
    }
}
6
John Bartels

ProjectInstaller.csで、デザイン画面のService1コンポーネントをクリックまたは選択します。プロパティwindoには、これを設定するためのstartTypeプロパティがあります。

2
Matt Wrock

それを行うためにc:\ windows\system32\sc.exeを使用するのはどうですか?

VB.NETコードで、System.Diagnostics.Processを使用してsc.exeを呼び出し、Windowsサービスの起動モードを変更します。以下は私のサンプルコードです

    Public Function SetStartModeToDisabled(ByVal ServiceName As String) As Boolean
    Dim sbParameter As New StringBuilder
    With sbParameter
        .Append("config ")
        .AppendFormat("""{0}"" ", ServiceName)
        .Append("start=disabled")
    End With

    Dim processStartInfo As ProcessStartInfo = New ProcessStartInfo()
    Dim scExeFilePath As String = String.Format("{0}\sc.exe", Environment.GetFolderPath(Environment.SpecialFolder.System))
    processStartInfo.FileName = scExeFilePath
    processStartInfo.Arguments = sbParameter.ToString
    processStartInfo.UseShellExecute = True

    Dim process As Process = process.Start(processStartInfo)
    process.WaitForExit()

    Return process.ExitCode = 0 

終了機能

2
Chou George
ServiceInstaller myInstaller = new System.ServiceProcess.ServiceInstaller();
myInstaller.StartType = System.ServiceProcess.ServiceStartMode.Automatic;
0
CSharpAtl

ServiceInstaller.StartTypeプロパティを取得した値に設定することで(サービスはユーザーが指定するため、カスタムアクションでこれを行う必要があります)、またはサービスの「 Start "REG_DWORDエントリ。値2は自動、3は手動です。 HKEY_LOCAL_MACHINE\SYSTEM\Services\YourServiceNameにあります

0
SpaceghostAli