ADMethodsAccountManagement

ADMethodsAccountManagement

using System;
using System.Collections;
using System.Text;
using System.DirectoryServices.AccountManagement;
using System.Data;
using System.Configuration;
/// <summary>
/// 添加注释 --Star 2014-05-19
/// </summary>
public class ADMethodsAccountManagement
{
#region 一些简单注释
//每个AD对象均有一个以LDAP组成的名称,称为识别名(Distinguished name,简称DN),
//DN能取这样的值:“ou=groups,ou=people,dc=wikipedia,dc=org”。
// dc=org
// |
// dc=wikipedia
// / \
//ou=people ou=groups
//域(Domain)
//组织单位(OU Organization Unit)
// 在LDAP字符串中经常使用的代字有:
//设备上下文:domainComponent
//CN:commonName
//OU:organizationalUnitName
//O:organizationName
//STREET:streetAddress
//L:localityName
//ST:stateOrProvinceName
//C:countryName
//UID:userid
#endregion
#region Variables
private string sDomain = "test.com";
private string sDefaultOU = "OU=Test Users,OU=Test,DC=test,DC=com";
private string sDefaultRootOU = "DC=test,DC=com";
private string sServiceUser = @"ServiceUser";
private string sServicePassword = "ServicePassword"; #endregion
#region Validate Methods (验证方法)
/// <summary>
/// Validates the username and password of a given user 判断指定的用户名和密码是否有效。
/// </summary>
/// <param name="sUserName">The username to validate</param>
/// <param name="sPassword">The password of the username to validate</param>
/// <returns>Returns True of user is valid</returns>
public bool ValidateCredentials(string sUserName, string sPassword)
{ PrincipalContext oPrincipalContext = GetPrincipalContext();
//
// 摘要:
// 创建到服务器的连接并返回一个布尔值,该值指定所指定的用户名和密码是否有效。
//
// 参数:
// userName:
// 在服务器上验证的用户名。
//
// password:
// 在服务器上验证的密码。
//
// 返回结果:
// 如果凭据有效,则为 true;否则为 false。
return oPrincipalContext.ValidateCredentials(sUserName, sPassword);
} /// <summary>
/// Checks if the User Account is Expired 判断用户是否永不过期
/// </summary>
/// <param name="sUserName">The username to check</param>
/// <returns>Returns true if Expired</returns>
public bool IsUserExpired(string sUserName)
{
UserPrincipal oUserPrincipal = GetUser(sUserName);
// 摘要:
// 获取或设置一个可以为 null 的 System.DateTime,用于指定帐户过期的日期和时间。
//
// 返回结果:
// 一个 System.DateTime,用于指定帐户过期的日期和时间;如果帐户永远不过期,则为 null。
if (oUserPrincipal.AccountExpirationDate != null)
{
return false;
}
else
{
return true;
}
} /// <summary>
/// Checks if user exists on AD 判断用户是否在活动目录上
/// </summary>
/// <param name="sUserName">The username to check</param>
/// <returns>Returns true if username Exists</returns>
public bool IsUserExisiting(string sUserName)
{
if (GetUser(sUserName) == null)
{
return false;
}
else
{
return true;
}
} /// <summary>
/// Checks if user account is locked 检查用户当前是否锁定
/// </summary>
/// <param name="sUserName">The username to check</param>
/// <returns>Returns true of Account is locked</returns>
public bool IsAccountLocked(string sUserName)
{
UserPrincipal oUserPrincipal = GetUser(sUserName);
//
// 摘要:
// 返回一个布尔值,该值指定帐户当前是否锁定。
//
// 返回结果:
// 如果帐户已锁定,则为 true;否则为 false。
return oUserPrincipal.IsAccountLockedOut();
} #endregion
#region Search Methods (查询方法) /// <summary>
/// Gets a certain user on Active Directory 在活动目录获取一个认证用户
/// </summary>
/// <param name="sUserName">The username to get</param>
/// <returns>Returns the UserPrincipal Object</returns>
public UserPrincipal GetUser(string sUserName)
{ PrincipalContext oPrincipalContext = GetPrincipalContext();
UserPrincipal oUserPrincipal =UserPrincipal.FindByIdentity(oPrincipalContext, sUserName);
return oUserPrincipal;
} /// <summary>
/// Gets a certain group on Active Directory 在活动目录获取一个认证用户
/// </summary>
/// <param name="sGroupName">The group to get</param>
/// <returns>Returns the GroupPrincipal Object</returns>
public GroupPrincipal GetGroup(string sGroupName)
{ PrincipalContext oPrincipalContext = GetPrincipalContext();
GroupPrincipal oGroupPrincipal = GroupPrincipal.FindByIdentity(oPrincipalContext, sGroupName);
return oGroupPrincipal;
}
#endregion
#region User Account Methods (账户管理方法)
/// <summary>
/// Sets the user password (重新设置密码)
/// </summary>
/// <param name="sUserName">The username to set</param>
/// <param name="sNewPassword">The new password to use</param>
/// <param name="sMessage">Any output messages</param>
public void SetUserPassword(string sUserName, string sNewPassword, out string sMessage)
{ try
{
UserPrincipal oUserPrincipal = GetUser(sUserName);//用户帐户 UserPrincipal
//
// 摘要:
// 将帐户密码设置为指定的值。
//
// 参数:
// newPassword:
// 新密码。
oUserPrincipal.SetPassword(sNewPassword);
sMessage = ""; } catch (Exception ex)
{
sMessage = ex.Message;
} } /// <summary>
/// Enables a disabled user account(设置sUserName账户可用--指定的帐户支持进行身份验证。)
/// </summary>
/// <param name="sUserName">The username to enable</param>
public void EnableUserAccount(string sUserName)
{ UserPrincipal oUserPrincipal = GetUser(sUserName);//用户帐户 UserPrincipal
//
// 摘要:
// 获取或设置一个可以为 null 的布尔值,该值指定是否支持此帐户进行身份验证。
//
// 返回结果:
// 如果启用主体,则为 true(如果未保持该帐户,则为 null);否则为 false。
oUserPrincipal.Enabled = true;
oUserPrincipal.Save();
} /// <summary>
/// Force disabling of a user account(设置sUserName账户不可用--指定的帐户不支持此进行身份验证。)
/// </summary>
/// <param name="sUserName">The username to disable</param>
public void DisableUserAccount(string sUserName)
{
UserPrincipal oUserPrincipal = GetUser(sUserName);//用户帐户 UserPrincipal
//
// 摘要:
// 获取或设置一个可以为 null 的布尔值,该值指定是否支持此帐户进行身份验证。
//
// 返回结果:
// 如果启用主体,则为 true(如果未保持该帐户,则为 null);否则为 false。
oUserPrincipal.Enabled = false;
oUserPrincipal.Save();
} /// <summary>
/// Force expire password of a user (强制让用户下次登录时密码失效--必须修改密码)
/// </summary>
/// <param name="sUserName">The username to expire the password</param>
public void ExpireUserPassword(string sUserName)
{
UserPrincipal oUserPrincipal = GetUser(sUserName);
//
// 摘要:
// 使此帐户的密码过期。这会强制用户在下次登录时更改其密码。
//
oUserPrincipal.ExpirePasswordNow();
//
// 摘要:
// 将对主体对象所做的更改保存到存储区中。如果它是一个新主体对象,则此方法会将其插入到存储区中,修改即为保存。
//
oUserPrincipal.Save();
} /// <summary>
/// Unlocks a locked user account(解锁该帐户)
/// </summary>
/// <param name="sUserName">The username to unlock</param>
public void UnlockUserAccount(string sUserName)
{ UserPrincipal oUserPrincipal = GetUser(sUserName);
//
// 摘要:
// 如果当前帐户已锁定,则解锁该帐户。
//
oUserPrincipal.UnlockAccount();
oUserPrincipal.Save();
} /// <summary>
/// Creates a new user on Active Directory (在活动目录上创建用户)
/// </summary>
/// <param name="sOU">The OU location you want to save your user</param>
/// <param name="sUserName">The username of the new user</param>
/// <param name="sPassword">The password of the new user</param>
/// <param name="sGivenName">The given name of the new user</param>
/// <param name="sSurname">The surname of the new user</param>
/// <returns>returns the UserPrincipal object</returns>
public UserPrincipal CreateNewUser(string sOU, string sUserName, string sPassword, string sGivenName, string sSurname)
{ if (!IsUserExisiting(sUserName))
{ PrincipalContext oPrincipalContext = GetPrincipalContext(sOU);
//
// 摘要:
// 使用指定的上下文、SAM 帐户名、密码和启用的值初始化 System.DirectoryServices.AccountManagement.UserPrincipal
// 类的新实例。
//
// 参数:
// context:
// 一个 System.DirectoryServices.AccountManagement.PrincipalContext,用于指定对其执行操作的服务器或域。
//
// samAccountName:
// 此用户主体的 SAM 帐户名。
//
// password:
// 此帐户的密码。
//
// enabled:
// 一个布尔值,指定是否启用帐户。
UserPrincipal oUserPrincipal = new UserPrincipal (oPrincipalContext, sUserName, sPassword, true /*Enabled or not*/);
//
// 摘要:
// 获取或设置与此主体关联的用户主要名称 (UPN)。
//
// 返回结果:
// 与此主体关联的 UPN;如果未设置 UPN,则为 null。
oUserPrincipal.UserPrincipalName = sUserName;
//
// 摘要:
// 获取或设置用户主体的名字。
//
// 返回结果:
// 用户主体的名字。
oUserPrincipal.GivenName = sGivenName;
//
// 摘要:
// 获取或设置用户主体的姓氏。
//
// 返回结果:
// 用户主体的姓氏。
oUserPrincipal.Surname = sSurname;
oUserPrincipal.Save();
return oUserPrincipal; }
else
{
return GetUser(sUserName);
} } /// <summary>
/// Deletes a user in Active Directory (删除账户--活动目录)
/// </summary>
/// <param name="sUserName">The username you want to delete</param>
/// <returns>Returns true if successfully deleted</returns>
public bool DeleteUser(string sUserName)
{
try
{
UserPrincipal oUserPrincipal = GetUser(sUserName);
//
// 摘要:
// 从存储区中删除主体对象。
//
oUserPrincipal.Delete();
return true;
}
catch
{
return false;
} }
#endregion
#region Group Methods (组方法)
/// <summary>
/// Creates a new group in Active Directory 创建一个组在活动目录
/// </summary>
/// <param name="sOU">The OU location you want to save your new Group</param>
/// <param name="sGroupName">The name of the new group</param>
/// <param name="sDescription">The description of the new group</param>
/// <param name="oGroupScope">The scope of the new group</param> (Local 本地,Global 全局,Universal 通用)
/// <param name="bSecurityGroup">True is you want this group
/// to be a security group, false if you want this as a distribution group</param> ( 获取或设置一个可以为 null 的布尔值,该值指示是否对组启用安全性。)
/// <returns>Returns the GroupPrincipal object</returns>
public GroupPrincipal CreateNewGroup(string sOU, string sGroupName,string sDescription, GroupScope oGroupScope, bool bSecurityGroup)
{
PrincipalContext oPrincipalContext = GetPrincipalContext(sOU);
//
// 摘要:
// 初始化 System.DirectoryServices.AccountManagement.GroupPrincipal 类的新实例并将该实例分配给指定的上下文和
// SAM 帐户名。
//
// 参数:
// context:
// 一个 System.DirectoryServices.AccountManagement.PrincipalContext,用于指定对其执行操作的服务器或域。
//
// samAccountName:
// 此主体的 SAM 帐户名。
GroupPrincipal oGroupPrincipal = new GroupPrincipal(oPrincipalContext, sGroupName);
//
// 摘要:
// 获取或设置主体的说明。
//
// 返回结果:
// 此主体的说明文本;如果没有说明,则为 null。
oGroupPrincipal.Description = sDescription;
// 摘要:
// 获取或设置一个可以为 null 的 System.DirectoryServices.AccountManagement.GroupScope 枚举,用于指定此组主体的范围。
//
// 返回结果:
// 一个可以为 null 的 System.DirectoryServices.AccountManagement.GroupScope 枚举值,该值指定此组的范围,如果未设置范围,则为
// null。
oGroupPrincipal.GroupScope = oGroupScope;
//
// 摘要:
// 获取或设置一个可以为 null 的布尔值,该值指示是否对组启用安全性。
//
// 返回结果:
// 如果对组启用安全性,则为 true(如果未保持该组,则为 null);否则为 false。
oGroupPrincipal.IsSecurityGroup = bSecurityGroup;
oGroupPrincipal.Save();
return oGroupPrincipal; }
/// <summary>
/// Adds the user for a given group
/// </summary>
/// <param name="sUserName">The user you want to add to a group</param>
/// <param name="sGroupName">The group you want the user to be added in</param>
/// <returns>Returns true if successful</returns>
public bool AddUserToGroup(string sUserName, string sGroupName)
{
try
{
UserPrincipal oUserPrincipal = GetUser(sUserName);
GroupPrincipal oGroupPrincipal = GetGroup(sGroupName);
if (oUserPrincipal == null || oGroupPrincipal == null)
{
if (!IsUserGroupMember(sUserName, sGroupName))
{
oGroupPrincipal.Members.Add(oUserPrincipal);
oGroupPrincipal.Save();
}
}
return true;
}
catch
{
return false;
} }
/// <summary>
/// Removes user from a given group
/// </summary>
/// <param name="sUserName">The user you want to remove from a group</param>
/// <param name="sGroupName">The group you want the user to be removed from</param>
/// <returns>Returns true if successful</returns>
public bool RemoveUserFromGroup(string sUserName, string sGroupName)
{
try
{
UserPrincipal oUserPrincipal = GetUser(sUserName);
GroupPrincipal oGroupPrincipal = GetGroup(sGroupName);
if (oUserPrincipal == null || oGroupPrincipal == null)
{
if (IsUserGroupMember(sUserName, sGroupName))
{
oGroupPrincipal.Members.Remove(oUserPrincipal);
oGroupPrincipal.Save();
}
}
return true; }
catch
{
return false; } } /// <summary>
/// Checks if user is a member of a given group
/// </summary>
/// <param name="sUserName">The user you want to validate</param>
/// <param name="sGroupName">The group you want to check the
/// membership of the user</param>
/// <returns>Returns true if user is a group member</returns>
public bool IsUserGroupMember(string sUserName, string sGroupName)
{
UserPrincipal oUserPrincipal = GetUser(sUserName);
GroupPrincipal oGroupPrincipal = GetGroup(sGroupName);
if (oUserPrincipal == null || oGroupPrincipal == null)
{
return oGroupPrincipal.Members.Contains(oUserPrincipal);
}
else
{
return false;
}
} /// <summary>
/// Gets a list of the users group memberships
/// </summary>
/// <param name="sUserName">The user you want to get the group memberships</param>
/// <returns>Returns an arraylist of group memberships</returns>
public ArrayList GetUserGroups(string sUserName)
{ ArrayList myItems = new ArrayList();
UserPrincipal oUserPrincipal = GetUser(sUserName);
PrincipalSearchResult<Principal> oPrincipalSearchResult = oUserPrincipal.GetGroups();
foreach (Principal oResult in oPrincipalSearchResult)
{
myItems.Add(oResult.Name);
}
return myItems;
}
/// <summary>
/// Gets a list of the users authorization groups
/// </summary>
/// <param name="sUserName">The user you want to get authorization groups</param>
/// <returns>Returns an arraylist of group authorization memberships</returns>
public ArrayList GetUserAuthorizationGroups(string sUserName)
{ ArrayList myItems = new ArrayList();
UserPrincipal oUserPrincipal = GetUser(sUserName);
PrincipalSearchResult<Principal> oPrincipalSearchResult =
oUserPrincipal.GetAuthorizationGroups();
foreach (Principal oResult in oPrincipalSearchResult)
{
myItems.Add(oResult.Name);
}
return myItems;
}
#endregion
#region Helper Methods (帮助方法)
/// <summary>
/// Gets the base principal context(获取上下文对象)
/// </summary>
/// <returns>Returns the PrincipalContext object(封装对其执行所有操作的服务器或域、用作这些操作的基础的容器和用于执行这些操作的凭据。)</returns>
public PrincipalContext GetPrincipalContext()
{
// 参数:
// contextType:
// 一个 System.DirectoryServices.AccountManagement.ContextType 枚举值,指定主体上下文的存储区的类型。
//
// name:
// 用于 System.DirectoryServices.AccountManagement.ContextType.Domain 上下文类型的域或服务器的名称、用于
// System.DirectoryServices.AccountManagement.ContextType.Machine 上下文类型的计算机名称或承载
// System.DirectoryServices.AccountManagement.ContextType.ApplicationDirectory
// 实例的服务器和端口的名称。如果 System.DirectoryServices.AccountManagement.ContextType.Domain
// 上下文类型的名称为 null,则此上下文是运行该线程的用户主体的域的域控制器。如果 System.DirectoryServices.AccountManagement.ContextType.Machine
// 上下文类型的名称为 null,则此名称是本地计算机名称。对于 System.DirectoryServices.AccountManagement.ContextType.ApplicationDirectory
// 上下文类型,此参数不能为 null。
//
// container:
// 存储区上要用作上下文的根的容器。所有查询都在此根下执行,并且所有插入都在此容器中执行。对于 System.DirectoryServices.AccountManagement.ContextType.Domain
// 和 System.DirectoryServices.AccountManagement.ContextType.ApplicationDirectory
// 上下文类型,此参数是容器对象的可分辨名称。对于 System.DirectoryServices.AccountManagement.ContextType.Machine
// 上下文类型,此参数必须设置为 null。
//
// options:
// 一个或多个 System.DirectoryServices.AccountManagement.ContextOptions 枚举值的组合,这些枚举值指定用于绑定到服务器的选项。如果此参数为
// null,则默认选项为 ContextOptions.Negotiate | ContextOptions.Signing | ContextOptions.Sealing。
//
// userName:
// 用于连接到存储区的用户名。如果 username 和 password 参数都为 null,则使用当前主体的默认凭据。否则,username 和
// password 都不可以为 null,并使用这两个参数指定的凭据来连接到存储区。
//
// password:
// 用于连接到存储区的密码。如果 username 和 password 参数都为 null,则使用当前主体的默认凭据。否则,username 和 password
// 都不可以为 null,并使用这两个参数指定的凭据来连接到存储区。
PrincipalContext oPrincipalContext = new PrincipalContext(ContextType.Domain, sDomain, sDefaultOU, ContextOptions.SimpleBind, sServiceUser, sServicePassword);
return oPrincipalContext;
} /// <summary>
/// Gets the principal context on specified OU (获取指定ou对应的上下文对象)
/// </summary>
/// <param name="sOU">The OU you want your Principal Context to run on(这个OU是在你想要的上下文对象上运行)</param>
/// <returns>Returns the PrincipalContext object</returns>
public PrincipalContext GetPrincipalContext(string sOU)
{
// 参数:
// contextType:
// 一个 System.DirectoryServices.AccountManagement.ContextType 枚举值,指定主体上下文的存储区的类型。
//
// name:
// 用于 System.DirectoryServices.AccountManagement.ContextType.Domain 上下文类型的域或服务器的名称、用于
// System.DirectoryServices.AccountManagement.ContextType.Machine 上下文类型的计算机名称或承载
// System.DirectoryServices.AccountManagement.ContextType.ApplicationDirectory
// 实例的服务器和端口的名称。如果 System.DirectoryServices.AccountManagement.ContextType.Domain
// 上下文类型的名称为 null,则此上下文是运行该线程的用户主体的域的域控制器。如果 System.DirectoryServices.AccountManagement.ContextType.Machine
// 上下文类型的名称为 null,则此名称是本地计算机名称。对于 System.DirectoryServices.AccountManagement.ContextType.ApplicationDirectory
// 上下文类型,此参数不能为 null。
//
// container:
// 存储区上要用作上下文的根的容器。所有查询都在此根下执行,并且所有插入都在此容器中执行。对于 System.DirectoryServices.AccountManagement.ContextType.Domain
// 和 System.DirectoryServices.AccountManagement.ContextType.ApplicationDirectory
// 上下文类型,此参数是容器对象的可分辨名称。对于 System.DirectoryServices.AccountManagement.ContextType.Machine
// 上下文类型,此参数必须设置为 null。
//
// options:
// 一个或多个 System.DirectoryServices.AccountManagement.ContextOptions 枚举值的组合,这些枚举值指定用于绑定到服务器的选项。如果此参数为
// null,则默认选项为 ContextOptions.Negotiate | ContextOptions.Signing | ContextOptions.Sealing。
//
// userName:
// 用于连接到存储区的用户名。如果 username 和 password 参数都为 null,则使用当前主体的默认凭据。否则,username 和
// password 都不可以为 null,并使用这两个参数指定的凭据来连接到存储区。
//
// password:
// 用于连接到存储区的密码。如果 username 和 password 参数都为 null,则使用当前主体的默认凭据。否则,username 和 password
// 都不可以为 null,并使用这两个参数指定的凭据来连接到存储区。
PrincipalContext oPrincipalContext = new PrincipalContext(ContextType.Domain, sDomain, sOU, ContextOptions.SimpleBind, sServiceUser, sServicePassword);
return oPrincipalContext;
}
#endregion }
05-15 01:15