2014-02-11 22 views
5

Сначала из приложений, если это должно быть на сервере, но это также связано с PHP, поэтому я подумал, что это лучший сайт для него.PHP, Active Directory, управление учетными записями пользователей

Я создаю несколько методов для интеграции нашей интрасети с Active Directory. Один из методов автоматически будет искать нашу базу данных для новых пользователей и создавать учетные записи пользователей в AD, если будут найдены новые пользователи.

Аналогичным образом, если пользователь помечен как левый в базе данных, он автоматически отключит учетную запись в активном каталоге.

Я изучал атрибуты, переданные из активного каталога и, в частности, поля управления учетными записями пользователей.

На microsoft website он заявляет об этом под списком атрибутов:

The following table lists possible flags that you can assign. You cannot set some 
of the values on a user or computer object because these values can be set or 
reset only by the directory service. The flags are cumulative. To disable a 
user's account, set the UserAccountControl attribute to 0x0202 (0x002 + 0x0200). In 
decimal, this is 514 (2 + 512). 

Вопрос Мой вопрос, если мы будем использовать пример выше, чтобы пометить запись как пользователь (512) и инвалидов (2), это в конечном итоге возвращает значение поля, возвращаемое AD как 514.

В PHP, как я могу извлечь флаги, отмеченные в записи? Например, если задано 514, как я могу использовать PHP для разработки обычной учетной записи пользователя, а также отключен (2 и 512)?

Например разделить следующее:

Flag | Splits into  | Flag Meaning 
--------+------------------+--------------------------------------------------------- 
514  | 512 + 2   | Normal User Account + Disabled 
522  | 512 + 2 + 8  | Normal User Account + Disabled + Home Directory Required 
8389120 | 8388608 + 512 | Password Expired + Normal User Account 

Я надеюсь, что вы можете понять мой вопрос, но не стесняйтесь спрашивать подтверждения или получения более подробной информации.

Большое спасибо

+0

Что PHP утилиты вы используете для доступа Active Directory?Я хотел бы знать, что у меня есть аналогичное требование для интрасети. –

ответ

1

Приехал на той же ситуации сегодня, и это более кратким с:

$flag_to_find = 530; 
$flags = array(); 
for ($i=0; $i<=26; $i++){ 
    if ($flag_to_find & (1 << $i)){ 
    array_push($flags, 1 << $i); 
    } 
} 
print_r($flags); 
+0

Мне нравится этот метод больше, чем мой собственный! Спасибо за дополнительный (лучший) ответ :) –

+0

Это потрясающе, везде искал это, спасибо! –

1

Итак, после многих проб и ошибок, я работал, как это сделать!

$bits = array(
    '27' => 1, '26' => 2, '25' => 4, '24' => 8, '23' => 16, '22' => 32, 
    '21' => 64, '20' => 128, '19' => 256, '18' => 512, '17' => 1024, 
    '16' => 2048, '15' => 4096, '14' => 8192, '13' => 16328, 
    '12' => 32768, '11' => 65536, '10' => 131072, '9' => 262144, 
    '8' => 524288, '7' => 1048576, '6' => 2097152, '5' => 4194304, 
    '4' => 8388608, '3' => 16777216, '2' => 33554432, '1' => 67108864 
); 

$flag_to_find = 530; // Indicates a normal user account, which is disabled, and locked out 

$binary = str_pad(decbin($flag_to_find), count($bits), 0, STR_PAD_LEFT); 

$flags = array(); 

for($i=0; $i<strlen($binary); $i++) 
{ 
    if($binary[$i]==1) 
{ 
     $flags[] = $bits[$i+1]; 
    } 
} 

print_r($flags); 

// Outputs: 512: Normal User Account 
      16: Locked Out Account 
      2: Disabled Accout 

Он работает, получая десятичные значения ВСЕХ возможных флагов в UAC. Есть 27 - я присвоил все значения массиву $bits.

Затем вы указываете флаг для поиска.

Затем преобразуйте десятичное значение флага, в двоичное и левое поле с 0.

Прокрутите каждое значение в двоичной строке. Если значение итерации равно 1, получите его соответствующее десятичное значение флага из массива $bits.

Все возможные флаги затем сохраняются в массиве $flags.

Надеюсь, что это поможет любому в будущем с аналогичными проблемами!

2

Добавление к ответу Джеймса Слоуна, вот список флажков:

public function findFlags($flag) { 

    $flags = array(); 
    $flaglist = array(
       1 => 'SCRIPT', 
       2 => 'ACCOUNTDISABLE', 
       8 => 'HOMEDIR_REQUIRED', 
       16 => 'LOCKOUT', 
       32 => 'PASSWD_NOTREQD', 
       64 => 'PASSWD_CANT_CHANGE', 
      128 => 'ENCRYPTED_TEXT_PWD_ALLOWED', 
      256 => 'TEMP_DUPLICATE_ACCOUNT', 
      512 => 'NORMAL_ACCOUNT', 
      2048 => 'INTERDOMAIN_TRUST_ACCOUNT', 
      4096 => 'WORKSTATION_TRUST_ACCOUNT', 
      8192 => 'SERVER_TRUST_ACCOUNT', 
      65536 => 'DONT_EXPIRE_PASSWORD', 
      131072 => 'MNS_LOGON_ACCOUNT', 
      262144 => 'SMARTCARD_REQUIRED', 
      524288 => 'TRUSTED_FOR_DELEGATION', 
     1048576 => 'NOT_DELEGATED', 
     2097152 => 'USE_DES_KEY_ONLY', 
     4194304 => 'DONT_REQ_PREAUTH', 
     8388608 => 'PASSWORD_EXPIRED', 
     16777216 => 'TRUSTED_TO_AUTH_FOR_DELEGATION', 
     67108864 => 'PARTIAL_SECRETS_ACCOUNT' 
    ); 
    for ($i=0; $i<=26; $i++){ 
     if ($flag & (1 << $i)){ 
      array_push($flags, 1 << $i); 
     } 
    } 
    foreach($flags as $k=>&$v) { 
     $v = $v . ' ' . $flaglist[$v]; 
    } 
    return $flags; 
} 
+0

Работаю как шарм! благодаря – Meloman

Смежные вопросы