服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - c# 修改windows中账户的用户名和密码

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

2022-10-18 11:42沙奇码丶 C#

这篇文章主要介绍了c# 改变windows中账户的用户名和密码,帮助大家更好的理解和学习C#,感兴趣的朋友可以了解下

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

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

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

?
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
38
39
40
41
42
43
44
45
46
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)。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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
    }
  }
}

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

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

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

?
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
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());
  }
}

以上就是c# 改变windows中账户的用户名和密码的详细内容,更多关于c# 更改用户名和密码的资料请关注服务器之家其它相关文章!

原文链接:https://www.cnblogs.com/seanyan/p/13167028.html

延伸 · 阅读

精彩推荐
  • C#详解C#的设计模式编程之抽象工厂模式的应用

    详解C#的设计模式编程之抽象工厂模式的应用

    这篇文章主要介绍了C#的设计模式编程之抽象工厂模式的应用,注意区分一下简单工厂模式、工厂方法模式和抽象工厂模式概念之间的区别,需要的朋友可以参...

    张龙豪6562021-11-12
  • C#C#递归算法之打靶算法分析

    C#递归算法之打靶算法分析

    这篇文章是对打靶算法分析,比较简单,但逻辑一定要清楚,分析问题的方法一定要准确,有需要的朋友可以参考一下。...

    Robin8432021-11-26
  • C#C#与C++之间类型的对应知识点总结

    C#与C++之间类型的对应知识点总结

    这篇文章主要介绍了C#与C++之间类型的对应知识点总结,对此有需要的朋友们可以参考下。...

    遥望星空8812022-08-04
  • C#Unity实现简易日志输出功能

    Unity实现简易日志输出功能

    这篇文章主要为大家详细介绍了Unity实现简易日志输出功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Blinkedu7272022-08-05
  • C#WinForm遍历窗体所有子控件的方法

    WinForm遍历窗体所有子控件的方法

    这篇文章主要介绍了WinForm遍历窗体所有子控件的方法,涉及C#递归遍历相关操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    HTL9322021-11-30
  • C#Unity3D实现模型淡入淡出效果

    Unity3D实现模型淡入淡出效果

    这篇文章主要为大家详细介绍了Unity3D实现模型淡出效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    JayW就是我吖5572022-03-11
  • C#C#时间操作类分享

    C#时间操作类分享

    这篇文章主要为大家分享了C#时间操作类,秒转换成分钟,获得两个日期的间隔等,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    孤者自清6612022-01-11
  • C#C#编程实现统计文件夹内文件和隐藏文件的方法示例

    C#编程实现统计文件夹内文件和隐藏文件的方法示例

    这篇文章主要介绍了C#编程实现统计文件夹内文件和隐藏文件的方法,结合具体实例形式分析了C#针对文件与目录的遍历及属性操作相关技巧,需要的朋友可以...

    a77194852412222022-01-12