2016-04-28 17 views
0

Active Directory内のグループのユーザーメンバシップに関する質問があり、そのようなメンバシップをPHPで取得しています。私の大きな質問/状況は、私が作っているサイトがあり、基本的にActive Directoryのグループに基づいて管理者を割り当てようとしていて、アカウントのメンバーを確認する方法を知っていますが、表示されていないグループの1つが必要なグループです。そのユーザーがそのグループのメンバーであるかどうかを確認するのではなく、そのグループのメンバーであるかどうかを確認できる方法はありますか。また、特定のグループが検索に表示されない理由を知っていれば、ユーザーがそのグループにいるかどうかを確認するための単純なロジックステートメントとなるため、メンバーシップを検索することをお勧めします。私は、特定のグループが出現していないと言いました。メンバーシップがどのように保存されているのか、それが直接メンバーであるか、あなたが他のグループのメンバーであるグループのメンバーであるかどうかについて、既定のグループとして使用するグループの1つはドメインユーザーですが、メンバーのメンバーシップが直接そのメンバーのメンバーであるにもかかわらず、そのメンバーにはそのメンバーが含まれていません。LDAPグループのメンバーを見つけるPHP

このプログラムのいくつかの時点では、特定のユーザーを「管理者」としてマークする必要があります。最も簡単な方法は、特定のマネージャーグループのメンバである場合はフラグVIAセッション変数を保存することです上記の私が取り組んでいる問題は、ユーザーがグループに参加していないということです。これは機能しません。マネージャーへのアクセスを許可するグループは、私のMemberOfエリアには表示されません。最終段階では、私は5-6グループを通過し、データベースにすべてのメンバーを追加する必要があります。それは同様の問題であり、同様の解決策が必要です。あまりにも。この問題の意味するところは、「ユーザーHR」のようなグループをつかんで、与えられた名前と姓と他のフィールドの既定値でデータベースにすべてアップロードする必要がありますが、グループのユーザーをつかむ方法は分かっていますが、それでもグループの100%を取得することはできませんし、その順序を逆にしてグループとして行動し、自分のメンバーをチェックして、私たちのためにこれを行うために使っている私たちの現在のアプリケーションはASP.netですが、10年ほど前です。管理者アカウントはグループにアクセスするようにハードコードされています。グループのメンバーを得るだろう。

コード:

<?php 
$ldap = ldap_connect("192.168.1.**"); 
$ldap_dn = "DC=************,DC=local"; 
ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0); 
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3); 
$access = NULL; 
if ($bind = ldap_bind($ldap, "***********\\" . $_POST['username'], $_POST['password'])) { 
    $filter = "(sAMAccountName=" . $_POST['username'] . ")"; 
    $attr = array("memberof","givenname","sn","mail"); 
    $result = ldap_search($ldap, $ldap_dn, $filter, $attr) or exit("Unable to search LDAP server"); 
    $entries = ldap_get_entries($ldap, $result); 
    $givenname = $entries[0]['givenname'][0] . " " . $entries[0]['sn'][0]; 
    ldap_unbind($ldap); 
    //var_dump($entries[0]["sn"][0]); 
    //var_dump($givenname); 
    //var_dump($entries[0]); 
    // check groups 
    foreach($entries[0]['memberof'] as $grps) { 
     // is manager, break loop 
     //if (strpos($grps, $ldap_manager_group)) { $access = 2; break; } 
     // is user 
     //var_dump($grps); 
     if (strpos($grps, "****** * *** *****")) $access = "****** *"; 
     if (strpos($grps, "*** Group")) $access = "***"; 
     if (strpos($grps, "*** Group")) $access = "***"; 
     if (strpos($grps, "***")) $access = "***"; 
     if (strpos($grps, "*** Group")) $access = "***"; 
     if (strpos($grps, "***")) $access = "***"; 
    } 
    if ($access != NULL) { 
     // establish session variables 
     $_SESSION['user'] = $_POST['username']; 
     $_SESSION['access'] = $access; 
     $_SESSION['givenname'] = $givenname; 
     $_SESSION['email'] = $entries[0]['mail'][0]; 
     return true; 
     } else { 
     //echo "No rights?"; 
     // user has no rights 
     return false; 
    } 
} else { 
    //header("Location: login.php?Error=Invalid Identity"); 
    echo "Elese Here"; 
} 
?> 

編集:私はこのチュートリアルを使用しようとしている

samjlevy.comを、私はほとんどの部分はそれを理解するが、私はいくつかのエラーを取得しています:

Warning: ldap_search(): Search: Operations error in C:\inetpub\wwwroot\InOutBoard\test.php on line 62 

Warning: ldap_get_entries() expects parameter 2 to be resource, boolean given in C:\inetpub\wwwroot\InOutBoard\test.php on line 63 

Warning: array_shift() expects parameter 1 to be array, null given in C:\inetpub\wwwroot\InOutBoard\test.php on line 66 

Warning: Invalid argument supplied for foreach() in C:\inetpub\wwwroot\InOutBoard\test.php on line 72 
Array () 

他の部分を実行することを許可しない結果にNULLが設定されていれば、戻り値はNULLです。上記のPHPコードから同じものを使用しているので、私の$ ldap_dnが正しいかどうかはわかりません。私のレイアウトは以下の通りです(私はこれが正しいと信じています):DC = company、DC = localそしてそれは私が望むグループにすべきです:CN =グループ探して、OU = lowestLevel Ou、OU = Groups 、OU = company、DC = Company、DC = local

これを$ ldap_dnとして使用する必要がありますか?

EDIT 2:このコードは、ユーザーが、であり、非常にうまく機能し、すべてのグループが表示されている

は取るに類似したページを使用して2ページ目を書くための方法があります(コードを更新しました)それらのグループの1つとそれからすべてのメンバーをつかむ?

<?php 

$ldap = ldap_connect("192.168.1.**"); 
$ldap_dn = "DC=Company,DC=local"; 
ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0); 
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3); 
$access = NULL; 
if ($bind = ldap_bind($ldap, "**********\\" . $_POST['username'], $_POST['password'])) { 
    $filter = "(sAMAccountName=" . $_POST['username'] . ")"; 
    $attr = array("memberof","givenname","sn","mail","distinguishedname"); 
    $result = ldap_search($ldap, $ldap_dn, $filter, $attr) or exit("Unable to search LDAP server"); 
    $entries = ldap_get_entries($ldap, $result); 
    $givenname = $entries[0]['givenname'][0] . " " . $entries[0]['sn'][0]; 
    //ldap_unbind($ldap); 
    //var_dump($entries[0]["sn"][0]); 
    //var_dump($givenname); 
    //var_dump($entries[0]); 
    var_dump($entries[0]['distinguishedname'][0]); 

    $gFilter = "(&(objectClass=group)(member:1.2.840.113556.1.4.1941:=".$entries[0]['distinguishedname'][0]."))"; 
    $gAttr = array("cn"); 
    $result1 = ldap_search($ldap, $ldap_dn, $gFilter, $gAttr) or exit("Unable to search LDAP server"); 
    $groups = ldap_get_entries($ldap, $result1); 
    var_dump($groups); 
    // check groups 
    foreach($entries[0]['memberof'] as $grps) { 
     // is manager, break loop 
     //if (strpos($grps, $ldap_manager_group)) { $access = 2; break; } 

     // is user 
     //var_dump($grps); 
     if (strpos($grps, "****** * *** *****")) $access = "****** *"; 
     if (strpos($grps, "*** Group")) $access = "***"; 
     if (strpos($grps, "*** Group")) $access = "***"; 
     if (strpos($grps, "***")) $access = "***"; 
     if (strpos($grps, "*** Group")) $access = "***"; 
     if (strpos($grps, "***")) $access = "***"; 

    } 

    if ($access != NULL) { 
     // establish session variables 
     $_SESSION['user'] = $_POST['username']; 
     $_SESSION['access'] = $access; 
     $_SESSION['givenname'] = $givenname; 
     $_SESSION['email'] = $entries[0]['mail'][0]; 
     return true; 
     } else { 
     //echo "No rights?"; 
     // user has no rights 
     return false; 
    } 
} else { 
    //header("Location: login.php?Error=Invalid Identity"); 
    echo "Elese Here"; 
} 
?> 

2番目のページ:このページには、そうしようとしているが、代わりにグループのメンバーを選び出すが、私たちのOUのの一つではないこともできるようになります。グループのメンバーを見つけることになっています。下のレイアウトとそれがつかんでいるもののコードを見てください。

<?php 
function get_members($group=FALSE,$inclusive=FALSE) { 
    $ldap_host = "192.168.1.***"; 
    $ldap_dn = "OU=******,OU=*****,OU=**********,DC=Company,DC=local"; 
    $ldap_usr_dom = "@".$ldap_host; 
    $user = "*******"; 
    $password = "******"; 
    $keep = array(
     "samaccountname", 
     "distinguishedname" 
    ); 
    $ldap = ldap_connect($ldap_host) or die("Could not connect to LDAP"); 
    ldap_bind($ldap, "REGION5SYSTEMS\\" . $user, $password) or die("Could not bind to LDAP");ry 
    if($group) $query = "(&"; else $query = ""; 
    $query .= "(&(objectClass=user)(objectCategory=person))"; 
    if(is_array($group)) { 
     // Looking for a members amongst multiple groups 
      if($inclusive) { 
       $query .= "(|"; 
      } else { 
       $query .= "(&"; 
      } 
      foreach($group as $g) $query .= "(memberOf=CN=$g,$ldap_dn)"; 
      $query .= ")"; 
    } elseif($group) { 
     $query .= "(memberOf=CN=$group,$ldap_dn)"; 
    } 
    if($group) $query .= ")"; else $query .= ""; 
    $results = ldap_search($ldap,$ldap_dn,$query); 
    $entries = ldap_get_entries($ldap, $results); 
    array_shift($entries); 
    $output = array(); // Declare the output array 
    $i = 0; // Counter 
    // Build output array 
    foreach($entries as $u) { 
     foreach($keep as $x) { 
      // Check for attribute 
      if(isset($u[$x][0])) $attrval = $u[$x][0]; else $attrval = NULL; 
      $output[$i][$x] = $attrval; 
     } 
     $i++; 
    } 

    return $output; 
} 

// Example Output 
print_r(get_members()); // Gets all users in 'Users' 
print_r(get_members("Group I'm search for")); // Gets all members of 'Test Group' 
?> 

だから、私たちのDCは、そのような管理者のコンピュータ、連絡先、グループとしてDC =会社名、DC =ローカルと私たちはその後、フォルダやOUのとOUのの一つは、「仕入」と命名し、その中にネストされているが、OUのあるきです私が見ているOUは、ユーザであり、その中にネストされているのは、私たちの建物内の異なる組織(彼らはDomianを使用しています)と、このプロジェクトのために作られた追加のOUです。プロジェクトのバックグラウンドは従業員InoutBoardであるため、OUには3つのセキュリティグループがあり、1つは他の組織のメンバー、1つは組織のメンバー、もう1つはOrgと組織のマネージャです。彼らがそうすることを忘れた場合、他人のステータス。私たちが理想的にやりたいのは、グループのメンバーをチェックしてデータベースにアップロードするだけでなく、不在時の既定のステータスや説明などの既定値。これらのグループには人が含まれておらず、他のセキュリティグループも含まれています。これは私たちが働きたいことです。私たちは$ ldap_dnを "CN = Company、DC = Company、DC = Local"に設定すると、これらのグループのメンバーを見つけることができるようにしたいと思います。ユーザーOU内のすべてのユーザーを印刷し、そこにあるすべてのOUに移動し、実際に必要なOU以外のOUからユーザーを印刷します。そのパスを$ ldap_dnとして指定すると、array()だけが出力されます。何か案が?

答えて

0

属性には直接的なグループメンバシップしか含まれていないため、再帰的なメンバシップは表示されません。しかし、あなたは(具体的にバインドした後、ビット直接あなたのコードを適応させる)ので、のようなユーザの再帰的なグループメンバーシップを照会できます。

$filter = "(sAMAccountName=" . $_POST['username'] . ")"; 
$attr = array("givenname","sn","mail", "distinguishedname"); 
$result = ldap_search($ldap, $ldap_dn, $filter, $attr) or exit("Unable to search LDAP server"); 
$entries = ldap_get_entries($ldap, $result); 

$gFilter = "(&(objectClass=group)(member:1.2.840.113556.1.4.1941:=".$entries[0]['distinguishedname'][0]."))"; 
$gAttr = array("cn"); 
$result = ldap_search($ldap, $ldap_dn, $gFilter, $gAttr) or exit("Unable to search LDAP server"); 
$groups = ldap_get_entries($ldap, $result); 

現時点でテストし、それは、一般的なフィルタおよびプロセスではありませんそれを行うために。ユーザーのDNを取得し、一致ルールOID 1.2.840.113556.1.4.1941を使用してグループを再帰的に取得します。

"Domain Users"グループが表示されないのは、それがユーザーのprimaryGroupId属性に格納されているADの「特別な」プライマリグループであるためです。ここではその上の追加情報:

https://support.microsoft.com/en-us/kb/297951

+0

私はOIDルールを把握しようとしていますが、私は私が私の最後に引っ張る何かにその数を変更することがありますか? – AndyPet74

+0

また、コードはこのエラーを示しています:警告:ldap_search():4は、22行目のC:\ inetpub \ wwwroot \ InOutBoard \ authorize.phpの有効なLDAPリンクリソースではありません。これはgAttr領域と関係がありますか? – AndyPet74

+0

いいえ、OIDは常にその番号になります。このフィルタで実際に変更されるのは、最後に来るものだけです(現在、 'distinguishedName'属性値が置かれている場所は、ログインしているユーザによって変わります)。あなたのエラーについては...それは本当に奇妙に思える。私はロジックをかなり数回見てきましたが、どうやってそれを得ているのか分かりません。まず、 'ldap_unbind'文をコードから取り除くことから始めましょう。そうする必要はないはずです。スクリプトは元の投稿と同じように見えますか? – ChadSikorra

関連する問題