4

グループ名とユーザーアカウントを指定して、指定されたユーザーが特定のグループに属しているかどうかを知りたいです。ユーザーはローカルユーザーまたはドメインユーザーであり、グループはローカルグループまたはドメイングループであり、グループは他のグループ内にネストすることもできます。要するに、私はbool IsUserMemberOf(User, Group)検索を行うために適切なWin32APIを内部的に呼び出すような関数を探しています。上記のクエリを実行するプロセスには、ローカルグループとADグループをクエリするために必要な権限が必要だと思います。エンタープライズ管理者アカウントでプロセスを実行すると、フォレスト内のDCにクエリを実行する必要がありますが、ドメインの一部ではないマシンでは機能しない可能性があります。ADだけでなくLSAにもクエリを実行できるように、このクエリプロセスを実行する必要があるアカウントに関するアイデアはありますか?

4

3 に答える 3

1

UserPrincipal.IsMemberOf(GroupPrincipal)は、「プリンシパルが指定されたグループのメンバーであるかどうかを指定するブール値を返します」。

于 2009-06-23T16:37:17.037 に答える
1

Magnus の言うとおりです。CheckTokenMembership を使用する必要があります。

UnlockPolicy.c (ここから完全なソースをダウンロードしてください)、関数ShouldUnlockForUser、およびUsagerEstDansGroupe(フランス語ですみません;) でサンプルを見つけることができます。

これがその根性です:

HRESULT IsUserInGroup(HANDLE user, const wchar_t* groupe)
{
    HRESULT result = E_FAIL;
    SID_NAME_USE snu;
    WCHAR szDomain[256];
    DWORD dwSidSize = 0;
    DWORD dwSize = sizeof szDomain / sizeof * szDomain;

    if ((LookupAccountNameW(NULL, groupe, 0, &dwSidSize, szDomain, &dwSize, &snu) == 0)
            && (ERROR_INSUFFICIENT_BUFFER == GetLastError()))
    {
        SID* pSid = (SID*)malloc(dwSidSize);

        if (LookupAccountNameW(NULL, groupe, pSid, &dwSidSize, szDomain, &dwSize, &snu))
        {
            BOOL b;

            if (CheckTokenMembership(user, pSid, &b))
            {
                if (b == TRUE)
                {
                    result = S_OK;
                }
            }
            else
            {
                result = S_FALSE;
            }
        }

        //Si tout vas bien (la presque totalitée des cas), on delete notre pointeur
        //avec le bon operateur.
        free(pSid);
    }

    return result;
}
于 2011-06-09T02:19:41.560 に答える
1

GetTokenInformation (TOKEN_USER)、AllocateAndInitializeSid、およびCheckTokenMemberShipを読む必要があります。

于 2009-06-23T15:54:16.930 に答える