Как проверить, если учетная запись компьютера отключена в Active Directory с помощью C#/NETИспользование C#, как вы можете проверить, отключена ли учетная запись компьютера в активном каталоге?
ответ
Попробуйте эту запись:.
http://www.codeproject.com/KB/system/everythingInAD.aspx#42
Вы хотите изучить пользовательские флаги контроля учетных записей.
Попробуйте это:
class Program
{
static void Main(string[] args)
{
const string ldap = "LDAP://your-ldap-server-here";
using (DirectoryEntry conn = new DirectoryEntry(ldap))
{
using (DirectorySearcher searcher = new DirectorySearcher(conn))
{
searcher.Filter = "(|(samAccountName=userA)(samAccountName=userB))";
searcher.PropertiesToLoad.Add("samAccountName");
searcher.PropertiesToLoad.Add("userAccountControl");
using (SearchResultCollection results = searcher.FindAll())
{
foreach (SearchResult result in results)
{
int userAccountControl = Convert.ToInt32(result.Properties["userAccountControl"][0]);
string samAccountName = Convert.ToString(result.Properties["samAccountName"][0]);
bool disabled = ((userAccountControl & 2) > 0);
Console.WriteLine("{0} ({1:x}) :: {2}", samAccountName, userAccountControl, disabled);
}
}
}
}
Console.ReadLine();
}
}
Второй бит userAccountControl
будет 1, если учетная запись отключена.
без проверки битов, добавив:
(UserAccountControl: 1.2.840.113556.1.4.803: = 2)
к фильтру должен возвращать только пользователям с ограниченными возможностями. Конечно,
(UserAccountControl: 1.2.840.113556.1.4.803: = 2)
гарантирует, что пользователи не отключены, если вы предпочитаете идти по этому пути.
Если вы используете .NET 3.5, вы можете использовать новые методы пространства имен System.DirectoryServices.AccountManagment для более простого доступа к Active Directory. Объект UserPrincipal имеет свойство Enabled, которое дает вам то, что вы ищете.
В январе 2008 года в MSDN Magazine есть хороший обзор этих подпрограмм. Вы можете прочитать статью здесь: Managing Directory Security Principals in the .NET Framework 3.5
Ответ Леандро Лопеса классный и работает ...другой вариант, мы можем сделать LINQ для UserAccountControl со значениями отключения и сделать эти виды применения отключены
replie из UserAccountControl являются:
512 Enabled счета
514 отключенных аккаунты
544 Включено, пароль не требуется
546 Отключено, пароль не требуется
66048 Enabled, пароль не истекал
66050 Disabled, пароль не устаревает
66080 Enabled, пароль не истекал & Не требуется
66082 Disabled, пароль не устаревает & Не требуется
262656 Enabled, Smartcard Требуется
262658 инвалидов, Smartcard Обязательный
262688 Enabled, Smartcard Обязательный, Пароль не требуется
262690 инвалидов, Smartcard Обязательный, Пароль не требуется
328192 Enabled, Smartcard Обязательный, пароля не истекало
328194 инвалидов, Smartcard Обязательно, Пароль не устаревает
328224 Enabled, Smartcard Обязательные, пароль не истекал & не требуется
328226 инвалидов, Smartcard Обязательный, пароль не устаревают & Не требуется
эй я получил это finallyy :) вот мой код надеюсь, это поможет вам
константный Int ADS_UF_ACCOUNTDISABLE = 0x00000002;
DirectoryEntry de = new DirectoryEntry();
de.Path = "LDAP://companyname.com";
DirectorySearcher objADSearcher = new DirectorySearcher(de);
de.AuthenticationType = AuthenticationTypes.Secure;
objADSearcher.SearchRoot = de;
objADSearcher.Filter = "(SAMAccountName=" + TextBox1.Text + ")";
SearchResult results = objADSearcher.FindOne();
if (results.ToString() !="")
{
int flags= Convert.ToInt32(results.Properties["userAccountControl"][0].ToString());
// для справки results.Properties [ "UserAccountControl"] [0] .ToString() равно ("514").;
if (Convert.ToBoolean(flags & ADS_UF_ACCOUNTDISABLE))
{
Response.Write("Account Disabled");
}
Если вы используете samAcountName или любое другое поле идентификации .. это способ проще использовать UserPrincipal.FindByIdentity метод. И используйте гибридный подход к Leandro López и Deepti. оба подхода очень хороши, но очень узко сфокусированы. Подробнее об этом флаге можно найти на MSDN
Вы можете легко декодировать свойство userAccountControl, преобразовывая результат в перечисление.
int userAccountControlValue = 544;
UserAccountControl userAccountControl = (UserAccountControl) userAccountControlValue;
// This gets a comma separated string of the flag names that apply.
string userAccountControlFlagNames = userAccountControl.ToString();
// This is how you test for an individual flag.
bool isNormalAccount = (userAccountControl & UserAccountControl.NORMAL_ACCOUNT) == UserAccountControl.NORMAL_ACCOUNT;
bool isAccountDisabled = (userAccountControl & UserAccountControl.ACCOUNTDISABLE) == UserAccountControl.ACCOUNTDISABLE;
bool isAccountLockedOut = (userAccountControl & UserAccountControl.LOCKOUT) == UserAccountControl.LOCKOUT;
Вы также можете использовать его для создания фильтра LDAP:
// To get a user that is disabled.
string ldapFilter = string.Format("(&(objectCategory=person)(objectClass=user)(sAMAccountName={0})(userAccountControl:1.2.840.113556.1.4.803:={1:D}))", accountName, UserAccountControl.ACCOUNTDISABLE)
// To get a user that is not disabled.
string ldapFilter = string.Format("(&(objectCategory=person)(objectClass=user)(sAMAccountName={0})(!(userAccountControl:1.2.840.113556.1.4.803:={1:D})))", accountName, UserAccountControl.ACCOUNTDISABLE)
Также см Active Directory: LDAP Syntax Filters примеры часто используемых фильтров активных каталогов LDAP.
Вот определение перечисления, что вы хотите:
/// <summary>
/// Flags that control the behavior of the user account.
/// </summary>
[Flags()]
public enum UserAccountControl : int
{
/// <summary>
/// The logon script is executed.
///</summary>
SCRIPT = 0x00000001,
/// <summary>
/// The user account is disabled.
///</summary>
ACCOUNTDISABLE = 0x00000002,
/// <summary>
/// The home directory is required.
///</summary>
HOMEDIR_REQUIRED = 0x00000008,
/// <summary>
/// The account is currently locked out.
///</summary>
LOCKOUT = 0x00000010,
/// <summary>
/// No password is required.
///</summary>
PASSWD_NOTREQD = 0x00000020,
/// <summary>
/// The user cannot change the password.
///</summary>
/// <remarks>
/// Note: You cannot assign the permission settings of PASSWD_CANT_CHANGE by directly modifying the UserAccountControl attribute.
/// For more information and a code example that shows how to prevent a user from changing the password, see User Cannot Change Password.
// </remarks>
PASSWD_CANT_CHANGE = 0x00000040,
/// <summary>
/// The user can send an encrypted password.
///</summary>
ENCRYPTED_TEXT_PASSWORD_ALLOWED = 0x00000080,
/// <summary>
/// This is an account for users whose primary account is in another domain. This account provides user access to this domain, but not
/// to any domain that trusts this domain. Also known as a local user account.
///</summary>
TEMP_DUPLICATE_ACCOUNT = 0x00000100,
/// <summary>
/// This is a default account type that represents a typical user.
///</summary>
NORMAL_ACCOUNT = 0x00000200,
/// <summary>
/// This is a permit to trust account for a system domain that trusts other domains.
///</summary>
INTERDOMAIN_TRUST_ACCOUNT = 0x00000800,
/// <summary>
/// This is a computer account for a computer that is a member of this domain.
///</summary>
WORKSTATION_TRUST_ACCOUNT = 0x00001000,
/// <summary>
/// This is a computer account for a system backup domain controller that is a member of this domain.
///</summary>
SERVER_TRUST_ACCOUNT = 0x00002000,
/// <summary>
/// Not used.
///</summary>
Unused1 = 0x00004000,
/// <summary>
/// Not used.
///</summary>
Unused2 = 0x00008000,
/// <summary>
/// The password for this account will never expire.
///</summary>
DONT_EXPIRE_PASSWD = 0x00010000,
/// <summary>
/// This is an MNS logon account.
///</summary>
MNS_LOGON_ACCOUNT = 0x00020000,
/// <summary>
/// The user must log on using a smart card.
///</summary>
SMARTCARD_REQUIRED = 0x00040000,
/// <summary>
/// The service account (user or computer account), under which a service runs, is trusted for Kerberos delegation. Any such service
/// can impersonate a client requesting the service.
///</summary>
TRUSTED_FOR_DELEGATION = 0x00080000,
/// <summary>
/// The security context of the user will not be delegated to a service even if the service account is set as trusted for Kerberos delegation.
///</summary>
NOT_DELEGATED = 0x00100000,
/// <summary>
/// Restrict this principal to use only Data Encryption Standard (DES) encryption types for keys.
///</summary>
USE_DES_KEY_ONLY = 0x00200000,
/// <summary>
/// This account does not require Kerberos pre-authentication for logon.
///</summary>
DONT_REQUIRE_PREAUTH = 0x00400000,
/// <summary>
/// The user password has expired. This flag is created by the system using data from the Pwd-Last-Set attribute and the domain policy.
///</summary>
PASSWORD_EXPIRED = 0x00800000,
/// <summary>
/// The account is enabled for delegation. This is a security-sensitive setting; accounts with this option enabled should be strictly
/// controlled. This setting enables a service running under the account to assume a client identity and authenticate as that user to
/// other remote servers on the network.
///</summary>
TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION = 0x01000000,
/// <summary>
///
/// </summary>
PARTIAL_SECRETS_ACCOUNT = 0x04000000,
/// <summary>
///
/// </summary>
USE_AES_KEYS = 0x08000000
}
Можете ли вы добавить пример того, как сделать этот бит активен? –
Я уже возился с подобной темой. После выяснения, что учетная запись «активирована» в некоторых редких случаях там, где «проблемы с подключениями». Hier ist мое решение узнать «если активированная учетная запись недействительна»: [how-can-i-check-the-domain-account-valid-of-the-current-computer] (http: // stackoverflow. ком/вопросы/21284822/как-может-я-проверить-на-домен-счет-валидность-оф-ток-компьютер/21458490 # 21458490) – boboes