关键词搜索

源码搜索 ×
×

c# 修改windows中账户的用户名和密码

发布2021-05-11浏览1417次

详情内容

在 C# 中,我们可以使用 WMI 类中的 Win32_Service 或者 Win32 API 中的函数 ChangeServiceConfig 来修改本地或远程计算机 Windows 服务登录身份 (账户) 的用户名和密码。

1、使用 Win32 API 修改服务登录身份信息:

使用 Win32 API 中的函数 ChangeServiceConfig 更改的是服务vb.net教程控制管理器数据库中指定服务的配置信息。

private const int SC_MANAGER_ALL_ACCESS = 0x000F003F;
private const uint SERVICE_NO_CHANGE = 0xffffffff; //这个值可以在 winsvc.h 中找到
private const uint SERVICE_QUERY_CONFIG = 0x00000001;
private const uint SERVICE_CHANGE_CONFIG = 0x00000002;
  
[DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern Boolean ChangeServiceConfig(IntPtr hService, UInt32 nServiceType, 
  UInt32 nStartType,UInt32 nErrorControl,String lpBinaryPathName,String lpLoadOrderGroup,
  IntPtr lpdwTagId, [In] char[] lpDependencies, String lpServiceStartName, 
  String lpPassword, String lpDisplayName);
  
[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern IntPtr OpenService(IntPtr hSCManager, string lpServiceName, uint dwDesiredAccess);
  
[DllImport("advapi32.dll", EntryPoint = "OpenSCManagerW", ExactSpelling = true, 
  CharSet = CharSet.Unicode, SetLastError = true)]
public static extern IntPtr OpenSCManager(string machineName, string databaseName, uint dwAccess);
  
public static bool ChangeServiceAccountInfo(string serviceName, string username,string password)
{
  try
  {
    IntPtr scm_Handle = OpenSCManager(null, null, SC_MANAGER_ALL_ACCESS);
    if (scm_Handle == IntPtr.Zero)
     throw new System.Runtime.InteropServices.ExternalException("打开服务管理器错误");
  
    IntPtr service_Handle = OpenService(scm_Handle, serviceName,SERVICE_QUERY_CONFIG | SERVICE_CHANGE_CONFIG);
    if (service_Handle == IntPtr.Zero)
     throw new System.Runtime.InteropServices.ExternalException("打开服务错误");
    //修改服务的账户用户名和密码
    if (!ChangeServiceConfig(service_Handle, SERVICE_NO_CHANGE, SERVICE_NO_CHANGE, 
       SERVICE_NO_CHANGE, null, null, IntPtr.Zero, null, username, password, null))
    {
      int nError = Marshal.GetLastWin32Error();
      Win32Exception win32Exception = new Win32Exception(nError);
      throw new System.Runtime.InteropServices.ExternalException("无法修改服务登录身份的用户名和密码:" + win32Exception.Message);
    }
    Console.WriteLine("服务登录身份信息修改成功!");
    return true;
  }
  catch (Exception ex)
  {
    Console.WriteLine(ex.ToString());
    return false;
  }
}

    2、使用 C# 中 WMI 修改服务登录身份信息:

    使用 WMI 服务,我们需要添加 System.Management 的引用。

    注意:如果您的远程计算机连接的是 Active Directory 域,那么使用完全限定的用户名(例如 TestDomainMorgan)而不是简单的用户名(Morgan)。

    using System.Management;
     
    public static void ChangeServiceAccountInfobyWMI(string serviceName, string username, string password)
    {
      string mgmntPath = string.Format("Win32_Service.Name='{0}'", serviceName);
      using (ManagementObject service = new ManagementObject(new ManagementPath(mgmntPath)))
      {
        object[] accountParams = new object[11];
        accountParams[6] = username;
        accountParams[7] = password;
        uint returnCode = (uint)service.InvokeMethod("Change", accountParams);
        if (returnCode == 0)
        {
           Console.WriteLine("服务登录身份信息修改成功!");
        }
        else
        {
           Console.WriteLine("服务登录身份信息修改失败");
           Console.WriteLine("错误代码:" + returnCode);
           // 此微软官方支持链接,可以查看相应的返回代码的消息:
           // https://msdn.microsoft.com/en-us/library/aa393660(v=vs.85).aspx
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    3、使用 C#中的 WMI 修改远程计算机服务的登录身份信息:

    使用 WMI 服务,我们需要添加 System.Management 的引用,并且在修改远程计算机中的服务信息时,请使用管理员凭据。

    注意:如果您的远程计算机连接的是 Active Directory 域,那么使用完全限定的用户名(例如 TestDomainMorgan)而不是简单的用户名(Morgan)。

    using System.Management;
    static void ChangeRemoteServiceAccountInfo(string remoteComputer, string serviceName, string username, string password)
    {
      try
      {
        ConnectionOptions connectionOptions = new ConnectionOptions();
        // 如需要,请使用证书
        //connectionOptions.Username = "Administrator";
        //connectionOptions.Password = "AdminPassword";
        //connectionOptions.Impersonation = ImpersonationLevel.Impersonate;
        ManagementScope scope = new ManagementScope("\" + remoteComputer + "rootCIMV2", connectionOptions);
        scope.Connect();
        string mgmntPath = string.Format("Win32_Service.Name='{0}'", serviceName);
        using (ManagementObject service = new ManagementObject(scope, new ManagementPath(mgmntPath),new ObjectGetOptions()))
        {
          object[] accountParams = new object[11];
          accountParams[6] = username;
          accountParams[7] = password;
          uint returnCode = (uint)service.InvokeMethod("Change", accountParams);
          if (returnCode == 0)
          {
            Console.WriteLine("服务登录身份信息修改成功!");
          }
          else
          {
            Console.WriteLine("服务登录身份信息修改失败");
            Console.WriteLine("错误代码:" + returnCode);
            // 此微软官方支持链接,可以查看相应的返回代码信息:
            // https://msdn.microsoft.com/en-us/library/aa393660(v=vs.85).aspx
          }
        }
      }
      catch (Exception ex)
      {
        Console.WriteLine(ex.ToString());
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    以上就是c# 改变windows中账户的用户名和密码的详细内容,更多关于c# 更改用户名和密码的资料请关注

    相关技术文章

    点击QQ咨询
    开通会员
    返回顶部
    ×
    微信扫码支付
    微信扫码支付
    确定支付下载
    请使用微信描二维码支付
    ×

    提示信息

    ×

    选择支付方式

    • 微信支付
    • 支付宝付款
    确定支付下载