4

主に、SQL Serverで特定のグループのメンバーであるユーザーの一覧を取得する必要がありました。私は完全に動作しているネット上の何かを見つけることができました。示すように、解決策は以下のとおりです。Active Directory - 特定のグループのメンバーであるユーザーとグループを取得する

今の
CREATE PROCEDURE [dbo].[NES_GetADGroupMembers] 
    (@groupName VARCHAR(max)) 
AS 
BEGIN 
    CREATE TABLE #MemberOfGroups 
    (
     groupName varchar(400), 
     cn varchar(400), 
     displayName varchar(400) 
    ) 

    SET NOCOUNT ON 

    DECLARE @t varchar(100), @t2 varchar(1000), 
      @ot varchar (4000), @tt varchar (4000); 

    DECLARE gC CURSOR FOR 
     SELECT cn, distinguishedName 
     FROM openquery (ADSI, 'SELECT cn, distinguishedName 
           FROM ''''LDAP://Mydomaindomain/CN=users,DC=Mydomain,DC=com'''' 
           WHERE objectCategory = ''group''') 

    OPEN gC 

    FETCH NEXT FROM gC INTO @t, @t2 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     SET @ot = '''SELECT cn, displayName 
        FROM ''''LDAP://Mydomaindomain/CN=users,DC=Mydomain,DC=com'''' 
        WHERE objectCategory = ''''Person'''' AND objectClass = ''''user'''' 
        AND memberOf=''''' + @t2 + ''''''; 

     SET @tt = 'select '+ ''''[email protected]+'''' +' As groupName, cn, displayName from openquery(ADSI,'+ @ot +''') order by cn' 

     INSERT INTO #MemberOfGroups (groupName, cn, displayName) 
      EXEC (@tt) 

     FETCH NEXT FROM gC INTO @t, @t2 
    END 

    CLOSE gC 
    DEALLOCATE gC 

    SELECT 
     groupName, displayName 
    FROM 
     #MemberOfGroups 

、そのだけで入力されたグループのユーザーを返し、正常に動作します。

しかし、私は新しい要求を持っています。ユーザーが好きなように、グループにメンバーとして他のグループを持たせることができます。

WHERE条件でフィルタを更新して、objectClass = ''group''を含めるようにしましたが、動作しません。

誰でもこれらのクエリについて少し知っていますし、グループ(入力グループのメンバー)も取得するのに役立ちますか?

+0

あなたの問題はフィルタにあると思います。ObjectCategory = Personを取り出してください。「グループ」はおそらく人ではないので、答えが得られるかどうかを確認してください。 –

+0

私はそれを削除しようとしましたが、グループで、しかし無駄に 'OR'ステートメントを追加しました。 –

答えて

0

あなたのグループはユーザーのOU(フォルダ)内にあると仮定しますか?私のADセットアップでは、SecurityGroupsという別のCNにグループがあります。技術的にはあなたが行うことができます:

SELECT cn, member FROM ''''LDAP://Mydomaindomain/CN=<actual OU of groups?>,DC=Mydomain,DC=com''''

memberとしては、あなたにそのグループのすべてのメンバーのDNを与えるだろう。次に、メンバーの配列があり、対応するユーザー(またはグループ!)オブジェクトに一致させるだけです。これは本質的にDNの連想配列を返すので、グループオブジェクトをフィルタリングして、それらのメンバのためにクエリを再度実行するようにネストすることができます。

+0

'member'を使用すると、次のエラーが発生します。 'リンクサーバー "ADSI"のOLE DBプロバイダ "ADsDSOObject"から行のデータを取得できません。符号の不一致やオーバーフロー以外の理由でデータ値を変換できませんでした。 ' –

関連する問題