AppServer/

通过 php 来批量禁用 active directory 用户

发布
更新
字数
695
阅读
2 分钟

我们可以通过 php 的 ldap 来对 windows server 的 active directory 上的用户进行操作,比如建立、禁用、启用、重置密码等。这里说一下它的禁用操作。
实现的前提条件是:
1、有自己的 hr 系统,系统中记录每个人的工号和在职状态;
2、在 active directory 中用工号做为每个人的用户名。

php
$stringLDAPConnectUserName = 'administrator@mydomain.com';
$stringLDAPConnectPassword = 'adminpassword';
$stringLDAPServer = 'activedirectoryserver-ip';
$connectionLDAP = ldap_connect($stringLDAPServer);
$stringLDAPServerDC1 = 'mydomain';
$stringLDAPServerDC2 = 'com';

if (false === $connectionLDAP){
    echo 'LDAP 服务器连接失败!';
    exit();
}

ldap_set_option($connectionLDAP, LDAP_OPT_PROTOCOL_VERSION, 3) or die('Unable to set LDAP protocol version');
ldap_set_option($connectionLDAP, LDAP_OPT_REFERRALS, 0);

if (false === ldap_bind($connectionLDAP, $stringLDAPConnectUserName, $stringLDAPConnectPassword)){
    echo 'LDAP 服务器绑定失败。';
    exit();
}

$stringLDAPBaseDN = 'DC=' . $stringLDAPServerDC1 . ',DC=' . $stringLDAPServerDC2;
$stringSearchFilter = '(&(objectClass=user)(objectCategory=person)(samaccountname=*))';
$arrayLDAPUserAttributes = array();
$arrayLDAPUserAttributes[] = 'givenname';
$arrayLDAPUserAttributes[] = 'displayName';
$arrayLDAPUserAttributes[] = 'mail';
$arrayLDAPUserAttributes[] = 'samaccountname';
$arrayLDAPUserAttributes[] = 'userprincipalname';
$arrayLDAPUserAttributes[] = 'userAccountControl';
$arrayLDAPUserAttributes[] = 'sn';

// enable pagination with a page size of 100.
$intPageSize = 100;

$stringCookie = '';

do {
    ldap_control_paged_result($connectionLDAP, $intPageSize, true, $stringCookie);

    $resultLDAPSearch = ldap_search($connectionLDAP, $stringLDAPBaseDN, $stringSearchFilter, $arrayLDAPUserAttributes);
    $arraySearchResult = ldap_get_entries($connectionLDAP, $resultLDAPSearch);

    if(!empty($arraySearchResult)){
        for ($i = 0; $i < $arraySearchResult['count']; $i++) {
            // 找到状态是启用的,并且不是 administrator 的用户
            if (in_array($arraySearchResult[$i]['useraccountcontrol'][0], array(512, 544, 66048, 66080, 262656, 262688, 328192, 328224)) and $arraySearchResult[$i]['samaccountname'][0] <> 'Administrator'){
                $arrayData[] = array(
                        'samaccountname' => $arraySearchResult[$i]['samaccountname'][0],
                        'userprincipalname' => $arraySearchResult[$i]['userprincipalname'][0],
                        'status' => 0
                );
            }
        }
    }
    ldap_control_paged_result_response($connectionLDAP, $resultLDAPSearch, $stringCookie);

} while($stringCookie !== null && $stringCookie != '');

$arrayEmployeeList = array();
foreach($arrayData as $arrayValue){
    if ($arrayValue['status'] == 0 and $arrayValue['userprincipalname'] <> ''){
        $arrayEmployeeList[] = str_replace('@mydomain.com', '', $arrayValue['userprincipalname']);
    }
}

$stringEmployeeList = "'" . implode("','", $arrayEmployeeList) . "'";

// 假如我们有一个 hr 系统数据库,可以在里面通过 employee code 来获取员工状态
$stringSQL_202005091756 = "select employee_code from hr_user_db where employee_code in ($stringEmployeeList) and employee_status = 1";
$arrayResult_202005091756 = mySQLExec('eHR-DB', $stringSQL_202005091756);

$connectionLDAP = ldap_connect($stringLDAPServer);
ldap_set_option($connectionLDAP, LDAP_OPT_PROTOCOL_VERSION, 3) or die('Unable to set LDAP protocol version');
ldap_set_option($connectionLDAP, LDAP_OPT_REFERRALS, 0);

if (false === ldap_bind($connectionLDAP, $stringLDAPConnectUserName, $stringLDAPConnectPassword)){
    echo 'LDAP 服务器绑定失败。';
    exit();
}

foreach($arrayResult_202005091756 as $arrayValue){
    echo $arrayValue['Code'];
    echo ' - ';

    $stringCurrentEmployeeFullName = $arrayValue['Code'] . '@' . $stringLDAPServerDC1 . '.' . $stringLDAPServerDC2;

    $stringSearchFilter = '(&(objectClass=user)(objectCategory=person)(userprincipalname=' . $stringCurrentEmployeeFullName . '))';
    $arrayLDAPUserAttributes = array();
    $arrayLDAPUserAttributes[] = 'givenname';
    $arrayLDAPUserAttributes[] = 'displayName';
    $arrayLDAPUserAttributes[] = 'mail';
    $arrayLDAPUserAttributes[] = 'samaccountname';
    $arrayLDAPUserAttributes[] = 'userPrincipalName';
    $arrayLDAPUserAttributes[] = 'userAccountControl';
    $arrayLDAPUserAttributes[] = 'sn';

    $resultLDAPSearch = ldap_search($connectionLDAP, $stringLDAPBaseDN, $stringSearchFilter, $arrayLDAPUserAttributes);
    $arraySearchResult = ldap_get_entries($connectionLDAP, $resultLDAPSearch);

    $stringCurrentEmployeeDN = $arraySearchResult[0]['dn'];

    // 66048 是启用;66050 是禁用
    //$arrayCurrentEmployeeStatusData["useraccountcontrol"][0] = 66048;
    $arrayCurrentEmployeeStatusData["useraccountcontrol"][0] = 66050;

    $resultLDAPModify = ldap_modify($connectionLDAP, $stringCurrentEmployeeDN, $arrayCurrentEmployeeStatusData);

    if ($resultLDAPModify){
        echo '禁用成功。';
    }else{
        echo '禁用失败。';
    }

}

顺便列一下整理的 Active Directory 中的用户状态值的对应关系:

text
512: Enabled Account
514: Disabled Account
544: Enabled, Password Not Required
546: Disabled, Password Not Required
66048: Enabled, Password Doesn't Expire
66050: Disabled, Password Doesn't Expire
66080: Enabled, Password Doesn't Expire & Not Required
66082: Disabled, Password Doesn't Expire & Not Required
262656: Enabled, Smartcard Required
262658: Disabled, Smartcard Required
262688: Enabled, Smartcard Required, Password Not Required
262690: Disabled, Smartcard Required, Password Not Required
328192: Enabled, Smartcard Required, Password Doesn't Expire
328194: Disabled, Smartcard Required, Password Doesn't Expire
328224: Enabled, Smartcard Required, Password Doesn't Expire & Not Required
328226: Disabled, Smartcard Required, Password Doesn't Expire & Not Required

评论

正在载入评论…

留下评论

人机验证
四位数字,看不清可点击图片刷新

评论经审核后显示。

回到顶部 ↑