C# 改變Windows中服務的登錄身份 (賬戶名和密碼)

来源:https://www.cnblogs.com/seanyan/archive/2020/06/19/13167028.html
-Advertisement-
Play Games

在 C# 中,我們可以使用 WMI 類中的 Win32_Service 或者 Win32 API 中的函數 ChangeServiceConfig 來修改本地或遠程電腦 Windows 服務登錄身份 (賬戶) 的用戶名和密碼。 1、使用 Win32 API 修改服務登錄身份信息: 使用 Win32 ...


在 C# 中,我們可以使用 WMI 類中的 Win32_Service 或者 Win32 API 中的函數 ChangeServiceConfig 來修改本地或遠程電腦 Windows 服務登錄身份 (賬戶) 的用戶名和密碼。

 1、使用 Win32 API 修改服務登錄身份信息:

使用 Win32 API 中的函數 ChangeServiceConfig 更改的是服務控制管理器資料庫中指定服務的配置信息。

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
        }
    }
}

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

原創出處:https://morgantechspace.com/2015/03/csharp-change-service-account-username-and-password.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. 概述 ShardingSphere是一套開源的分散式資料庫中間件解決方案組成的生態圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(計劃中)這3款相互獨立的產品組成。他們均提供標準化的數據分片、分散式事務和資料庫治理功能,可適用於如Java同構 ...
  • 三、反序列化使用 3.1 驗證 使用序列化器進行反序列化時,需要對數據進行驗證後,才能獲取驗證成功的數據或保存成模型類對象。 在獲取反序列化的數據前,必須調用**is_valid()**方法進行驗證,驗證成功返回True,否則返回False。 驗證失敗,可以通過序列化器對象的errors屬性獲取錯誤 ...
  • ###描述 給定一個字元串,在字元串中找到第一個連續出現至少k次的字元。 ###輸入 第一行包含一個正整數k,表示至少需要連續出現的次數。1 ⇐ k ⇐ 1000。 第二行包含需要查找的字元串。字元串長度在1到1000之間,且不包含任何空白符。 ###輸出 若存在連續出現至少k次的字元,輸出該字元; ...
  • 案例故事: 任何一款終端產品只要涉及視頻播放,就肯定涉及視頻的解碼播放測試, 作為一名專業的多媒體測試人員,我們需要一堆的規範的標準視頻測試文件, 但是發現現有的視頻資源名字命名的很隨意比如:big_buck_bunny_720p_h264.mp4, 以上命名不能看出視頻文件的具體編碼規格, 測試經 ...
  • 結論: PHP中提供了反射類來解析類的結構; 通過反射類可以獲取到類的構造函數及其參數和依賴; 給構造函數的參數遞歸設置預設值後,即可使用這些帶預設值的參數通過 newInstanceArgs 實例化出類對象; 在實例化的過程中,依賴的類也會被實例化,從而實現了依賴註入。 PHP中反射類的常用方法: ...
  • GIT本地庫操作基本原理 GIT作為分散式版本庫軟體,每個機器上都是一個版本庫。 git初始化後,有三個區,分別是 工作區,暫存區,本地庫; 工作區是我們編輯代碼的區別,包括新增,修改,刪除代碼操作,我們編輯代碼後,添加到暫存區; 暫存區是臨時存儲代碼的地方,方便批量提交數據到本地庫; 本地庫是最終 ...
  • 上一篇文章講到了CentOS6.7的安裝教程,安裝步驟到時區選擇這塊了,這篇文章接上篇文章,繼續講述CentOS6.7的安裝教程,直至安裝完成。 17、設置root的登錄密碼,日後登錄虛擬機,用戶名就是root,密碼就是現在設定的這個,當然密碼後期是可以更改的,這點不用操心。 18、當密碼設置的過於 ...
  • 今天就來吐槽位元組跳動的面試...... 有種飄飄然的趕腳...... 人們都說,這個世界上有兩種人註定單身,一種是太優秀的,另一種是太平凡的。 我一聽, 呀?那我這豈不是就不優秀了嗎,於是毅然決然和女朋友分了手。 人們都說,互聯網寒冬來了,這個時候還在大面積招人的公司,必然是牛逼的公司。 而這個時候 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...