サービスをインストールするプログラムがあります。後でユーザーにスタートアップの種類を「自動」に変更するオプションを提供できるようにしたいと考えています。
OSはXP-違いがある場合(Windows API?))。
.NETでこれを行うにはどうすればよいですか?可能であればC#! :)
そのために、OpenService()およびChangeServiceConfig()ネイティブWin32 APIを使用できます。 pinvoke.net にはいくつかの情報があり、もちろん [〜#〜] msdn [〜#〜] にも情報があると思います。 P/Invoke Interopt Assistant を確認してください。
P/Invokeを使用してこれを行う方法について ブログ投稿 を書きました。私の投稿のServiceHelperクラスを使用すると、次のようにして開始モードを変更できます。
var svc = new ServiceController("ServiceNameGoesHere");
ServiceHelper.ChangeStartMode(svc, ServiceStartMode.Automatic);
サービスインストーラーで言う必要があります
[RunInstaller(true)]
public class ProjectInstaller : System.Configuration.Install.Installer
{
public ProjectInstaller()
{
...
this.serviceInstaller1.StartType = System.ServiceProcess.ServiceStartMode.Automatic;
}
}
インストール中にユーザーに尋ねて、この値を設定することもできます。または、このプロパティをビジュアルスタジオデザイナーで設定します。
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);
}
}
ProjectInstaller.csで、デザイン画面のService1コンポーネントをクリックまたは選択します。プロパティwindoには、これを設定するためのstartTypeプロパティがあります。
それを行うために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
終了機能
ServiceInstaller myInstaller = new System.ServiceProcess.ServiceInstaller();
myInstaller.StartType = System.ServiceProcess.ServiceStartMode.Automatic;
ServiceInstaller.StartTypeプロパティを取得した値に設定することで(サービスはユーザーが指定するため、カスタムアクションでこれを行う必要があります)、またはサービスの「 Start "REG_DWORDエントリ。値2は自動、3は手動です。 HKEY_LOCAL_MACHINE\SYSTEM\Services\YourServiceNameにあります