.net 使用C#更改Windows服务凭据的最佳方法是什么

qoefvg9y  于 2023-06-07  发布在  .NET
关注(0)|答案(3)|浏览(227)

我需要使用C#更改现有Windows服务的凭据。我知道有两种不同的方法可以做到这一点。

  1. ChangeServiceConfig,参见ChangeServiceConfig on pinvoke.net
    1.使用Change作为方法名称的ManagementObject.InvokeMethod。
    这两种方式似乎都不是一种非常“友好”的方式,我想知道我是否错过了另一种更好的方式来做到这一点。
5ktev3wc

5ktev3wc1#

下面是一个使用System.Management类的快速而肮脏的方法。

using System;
using System.Collections.Generic;
using System.Text;
using System.Management;

namespace ServiceTest
{
  class Program
  {
    static void Main(string[] args)
    {
      string theServiceName = "My Windows Service";
      string objectPath = string.Format("Win32_Service.Name='{0}'", theServiceName);
      using (ManagementObject mngService = new ManagementObject(new ManagementPath(objectPath)))
      {
        object[] wmiParameters = new object[11];
        wmiParameters[6] = @"domain\username";
        wmiParameters[7] = "password";
        mngService.InvokeMethod("Change", wmiParameters);
      }
    }
  }
}
xhv8bpkk

xhv8bpkk2#

ChangeServiceConfig是我过去使用的方法。WMI可能有点不稳定,我只想在没有其他选择的情况下使用它,尤其是在远程计算机上。

ulydmbyx

ulydmbyx3#

下面是一个使用System.Management类的带有参数和返回值的方法。

using System;
using System.Management;

namespace ChangeServiceCredentials
{
    public class ServiceUtil
    {
        /// <summary>
        /// Changes the user that a service runs under.
        /// </summary>
        /// <param name="serviceName">Name of the service to alter.</param>
        /// <param name="userName">Username to use as the new identity.</param>
        /// <param name="password">Password of the new identity.</param>
        public static UInt32 SetWindowsServiceCredentials(String serviceName, String userName, String password)
        {
            var servicePath = $"Win32_Service.Name='{serviceName}'";
            using (var service = new ManagementObject(new ManagementPath(servicePath)))
            {
                var wmiParams = new Object[10];

                wmiParams[6] = userName;
                wmiParams[7] = password;
                return (UInt32)service.InvokeMethod("Change", wmiParams);
            }
        }
    }
}

相关问题