Получение информации о пользователе домена

Дата создания: 13.09.2010
Состояние: завершена
Дата редактирования: 21.12.2010

    Этот вопрос не относится к программированию именно в AutoCAD, но на мой взгляд весьма важен, т.к. с большой долей вероятности может быть использован и при .Net-программировании в AutoCAD (где он мне собственно и понадобился при написании новой версии менеджера загрузки плагинов). 

Вопрос

    Как получить информацию о пользователе домена?

Ответ

    В качестве ответа привожу код, в котором демонстрируется решение вопроса (фрагмент кода взят из AdminCAD, разрабатываемого мною для GPSM, комментарии были выполнены мною на английском, но понять их не сложно):

   1:  //Microsoft namespaces
   2:  using System;
   3:  using System.Collections;
   4:  using System.Collections.Specialized;
   5:  using System.DirectoryServices.AccountManagement;
   6:  using System.Collections.Generic;
   7:  using System.Collections.ObjectModel;
   8:  using System.ComponentModel;
   9:  using System.Linq;
  10:  using System.Xml.Linq;
  11:  using System.Text;
  12:  using System.IO;
  13:  using System.Reflection;
  14:  using System.DirectoryServices.ActiveDirectory;
  15:   
  16:  namespace Bushman.Autodesk.AutoCAD {
  17:   
  18:      /// <summary>
  19:      /// The class giving the information on the current user, taken from ActiveDirectory
  20:      /// </summary>
  21:      public abstract class UserDomainInfo {
  22:   
  23:          /// <summary>
  24:          /// Windows system variable (%AppData%)
  25:          /// </summary>
  26:          protected const string appData = "AppData"; 
  27:          /// <summary>
  28:          /// File with data about user (room number, phone)
  29:          /// </summary>
  30:          protected XElement XmlUserInfoFile {
  31:              get { return XElement.Load(Environment.GetEnvironmentVariable(appData).CombineAsPath(Resource.MainDirName, Resource.UserInfoFileName)); }            
  32:          }
  33:   
  34:          /// <summary>
  35:          /// Current user name
  36:          /// </summary>
  37:          protected string GetCurrentUserName() {
  38:              return UserPrincipal.Current.Name;
  39:          }
  40:   
  41:          /// <summary>
  42:          /// Current user middle name
  43:          /// </summary>
  44:          protected string GetCurrentUserMiddleName() { return UserPrincipal.Current.MiddleName; }
  45:   
  46:          /// <summary>
  47:          /// Current user Surname
  48:          /// </summary>
  49:          /// <returns></returns>
  50:          protected string GetCurrentUserSurname() {
  51:              return UserPrincipal.Current.Surname;
  52:          }
  53:   
  54:          /// <summary>
  55:          /// Current user description
  56:          /// </summary>
  57:          protected string GetCurrentUserDescription() { return UserPrincipal.Current.Description; }
  58:   
  59:          /// <summary>
  60:          /// Current user display name
  61:          /// </summary>
  62:          protected string GetCurrentUserDisplayName() { return UserPrincipal.Current.DisplayName; }
  63:   
  64:          /// <summary>
  65:          /// Current user E-mail address
  66:          /// </summary>
  67:          protected string GetCurrentUserEmailAddress() { return UserPrincipal.Current.EmailAddress; }
  68:   
  69:          /// <summary>
  70:          /// Domain groups in which the current user consists
  71:          /// </summary>
  72:          protected string[] GetCurrentUserDomainGroups() { return UserPrincipal.Current.GetGroups().Select(n => n.Name).ToArray(); }
  73:   
  74:          /// <summary>
  75:          /// Get current user voice phone
  76:          /// </summary>
  77:          /// <returns></returns>
  78:          protected string GetCurrentUserPhone() {
  79:              string vn = UserPrincipal.Current.VoiceTelephoneNumber;  
  80:              string result = ((vn == string.Empty) || (vn == null)) ? XmlUserInfoFile.Element("Contact").Attribute("Phone").Value.Trim() : vn;
  81:              return result;
  82:          }
  83:   
  84:          /// <summary>
  85:          /// Get current user room number
  86:          /// </summary>
  87:          /// <returns></returns>
  88:          protected string GetCurrentUserCabinetNumber() {
  89:              string vn = string.Empty;//modify it code string
  90:              string result = ((vn == string.Empty) || (vn == null)) ? XmlUserInfoFile.Element("Contact").Attribute("CabinetNumber").Value.Trim() : vn;
  91:              return result;
  92:          }
  93:   
  94:          /// <summary>
  95:          /// Get names of domain groups of the indicated domain
  96:          /// </summary>
  97:          /// <param name="DomainName">Domain name</param>
  98:          /// <returns>Names of groups of the domain</returns>
  99:          protected IEnumerable<string> GetDomainGroups(string DomainName) {
 100:              using (var context = new PrincipalContext(ContextType.Domain, DomainName))
 101:              using (var queryFilter = new GroupPrincipal(context))
 102:              using (var searcher = new PrincipalSearcher(queryFilter)) {
 103:                  foreach (var result in searcher.FindAll().OrderBy(n=>n.SamAccountName)) {
 104:                      yield return result.SamAccountName;
 105:                      result.Dispose();
 106:                  }
 107:              }
 108:          }
 109:   
 110:          /// <summary>
 111:          /// Get names of domain groups of the current domain
 112:          /// </summary>
 113:          /// <returns>Names of groups of the domain</returns>
 114:          protected IEnumerable<string> GetCurrentDomainGroups(){
 115:              return GetDomainGroups(Domain.GetCurrentDomain().Name);
 116:          }
 117:      }
 118:  }
Comments