使用webapi實現windows本機使用者管理

來源:互聯網
上載者:User

標籤: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下注意項
  1. 在webapi下,如果使用DirectoryEntry類,需添加Microsoft.Web.Infrastructure的引用。
  2. 在web.config中,需增加如下的配置節,否則會報拒絕訪問的錯誤。
 <system.web>        <identity impersonate="true" />  </system.web>

使用webapi實現windows本機使用者管理

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.