標籤:wsus 運行 direct 錯誤 val 部署 entry ret 認證
1. 引言
最近一段時間設計和實現公司內部的基於OAuth2.0的統一身份認證中心,經梳理,公司部分自研系統可以使用OAuth2.0的方式進行身份認證,還有一部分系統無原始碼,未開放介面,使用windows使用者作為系統的使用者。面對這種情況,同時為實現一個中心一鍵開關賬戶的功能,對於無源碼、未開放介面、使用windows使用者作為系統使用者的系統,單獨開發介面程式,有資料庫的直接操作資料庫將帳號密碼同步化至資料庫中;對於使用windows使用者作為系統使用者的系統,則在其部署的伺服器上部署webapi介面,同步系統管理使用者和密碼。本文主要介紹的是C#對windows本機使用者的新增、刪除、修改密碼功能以及列出所有本機使用者的功能。
2. Active Directory與DirectoryEntry 類
C#管理windows使用者,在百度上搜尋到c#操作windows本地賬戶這樣一篇文章,主要是通過匯入Netapi32.dll
檔案實現對windows本地賬戶的管理。而在之前有做過使用DirectoryEntry 類修改本機使用者密碼的功能,經搜尋,DirectoryEntry 類可封裝 Active Directory 網域服務階層中的節點或對象,也能實現對使用者的新增、刪除以及其他功能。
Active Directory
活動目錄(Active Directory)是面向Windows Standard Server、Windows Enterprise Server以及 Windows Datacenter Server的目錄服務。(Active Directory不能運行在Windows Web Server上,但是可以通過它對運行Windows Web Server的電腦進行管理。)Active Directory儲存了有關網路對象的資訊,並且讓管理員和使用者能夠輕鬆地尋找和使用這些資訊。Active Directory使用了一種結構化的資料存放區方式,並以此作為基礎對目錄資訊進行合乎邏輯的分層組織。
可參考: Active Directory的基本概念
DirectoryEntry 類
DirectoryEntry類位於System.DirectoryServices資料表空間下,可封裝 Active Directory 網域服務階層中的節點或對象。DirectoryEntry類使用 Active Directory Services Interfaces (ADSI) 技術。 ADSI 是 Microsoft 為靈活的工具提供用於處理各種網路提供者的介面的集合。 ADSI 使管理員能夠定位和管理網路上的資源相對容易地,而不考慮網路的大小。
可參考:DirectoryEntry 類
3. 管理本機使用者
using System;using System.Collections.Generic;using System.DirectoryServices;using System.Linq;using System.Web;namespace OAuthClient.Common{ public class WindowsUser : IUser { private static readonly string PATH = "WinNT://" + Environment.MachineName; /// <summary> /// 擷取所有使用者 /// </summary> /// <returns></returns> public List<User> GetAllUser() { List<User> list = new List<User>(); using (DirectoryEntry deRoot = new DirectoryEntry(PATH)) { if (deRoot.Children != null) { foreach (DirectoryEntry de in deRoot.Children) { if (de.SchemaClassName == "User" || de.SchemaClassName == "Computer" || de.SchemaClassName == "Domain") { User user = new User() { name = de.Name, fullname = de.Properties["FullName"].Value.ToString() }; list.Add(user); } } } return list; } } /// <summary> /// 新增使用者 /// </summary> /// <param name="user"></param> /// <returns></returns> public string AddUser(User user) { try { using (DirectoryEntry deRoot = new DirectoryEntry(PATH)) { using (DirectoryEntry de = deRoot.Children.Add(user.name, "User")) { de.Properties["FullName"].Add(user.fullname); //使用者全稱 de.Invoke("SetPassword", user.password); //使用者密碼 de.Invoke("Put", "Description", user.description);//使用者詳細描述 de.Invoke("Put", "UserFlags", 66049); //密碼永不到期 de.CommitChanges(); return "OK"; } } } catch (Exception ex) { return ex.Message; } } /// <summary> /// 移除使用者 /// </summary> /// <param name="name"></param> /// <returns></returns> public string RemoveUser(string name) { try { using (DirectoryEntry deRoot = new DirectoryEntry(PATH)) { using (DirectoryEntry user = deRoot.Children.Find(name, "User")) { if (user != null) dir.Children.Remove(user); return "OK"; } } } catch (Exception ex) { return ex.Message; } } /// <summary> /// 修改使用者密碼 /// </summary> /// <param name="user"></param> /// <returns></returns> public string ChangePassword(User user) { try { using (DirectoryEntry deRoot = new DirectoryEntry(PATH)) { using (DirectoryEntry de = dir.Children.Find(user.name, "User")) { de.Invoke("SetPassword", new object[] { user.password }); de.CommitChanges(); return "OK"; } } } catch (Exception ex) { return ex.Message; } } }}
4. webapi下注意項
- 在webapi下,如果使用DirectoryEntry類,需添加
Microsoft.Web.Infrastructure
的引用。
- 在web.config中,需增加如下的配置節,否則會報拒絕訪問的錯誤。
<system.web> <identity impersonate="true" /> </system.web>
使用webapi實現windows本機使用者管理