키워드 [Programming][VC++][Security]
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=51&MAEULNo=20&no=5736&ref=5736

사용 환경..
Windows NT/2000: Requires Windows 2000 (or Windows NT 4.0 SP6a or later with DSClient).
Windows 95/98: Requires Windows 95/98 (with IE 4.01 or later and DSClient). Not supported on Windows Me.
Header: Declared in Adshlp.h, Iads.h
Library: Use ActiveDS.Lib, ADSIid.Lib, Adptif.Lib


코드

#include <Iads.h>
#include <Adshlp.h>

HRESULT CheckUserGroups(IADsUser *pUser)
{
    IADsMembers *pGroups;
    HRESULT hr = S_OK;
    hr = pUser->Groups(&pGroups);
    pUser->Release();
    if (FAILED(hr)) return hr;

    IUnknown *pUnk;
    hr = pGroups->get__NewEnum(&pUnk);
    if (FAILED(hr)) return hr;
    pGroups->Release();

    IEnumVARIANT *pEnum;
    hr = pUnk->QueryInterface(IID_IEnumVARIANT,(void**)&pEnum);
    if (FAILED(hr)) return hr;

    pUnk->Release();

    // Now Enumerate
    BSTR bstr;
    VARIANT var;
    IADs *pADs;
    ULONG lFetch;
    IDispatch *pDisp;

    VariantInit(&var);
    hr = pEnum->Next(1, &var, &lFetch);
    while(hr == S_OK)
    {
        if (lFetch == 1)
        {
             pDisp = V_DISPATCH(&var);
             pDisp->QueryInterface(IID_IADs, (void**)&pADs);
             pADs->get_Name(&bstr);
             printf("Group belonged: %S\n",bstr);
             SysFreeString(bstr);
             pADs->Release();
        }
        VariantClear(&var);
        pDisp=NULL;
        hr = pEnum->Next(1, &var, &lFetch);
    };
    hr = pEnum->Release();
    return S_OK;
}

IADsUser *GetUserObject(LPWSTR uPath)
{
    IADsUser *pUser;
    HRESULT hr = ADsGetObject(uPath,IID_IADsUser,(void**)&pUser);
    if (FAILED(hr)) {return NULL;}
    BSTR bstr;
    hr = pUser->get_FullName(&bstr);
    printf("User: %S\n", bstr);
    SysFreeString(bstr);
    return pUser;
}

void main()
{
    HRESULT hr = CoInitialize(NULL);
    IADsUser *pUser = (IADsUser*)GetUserObject(
                      L"WinNT://KWONJH/Rkakr,user");
    pUser->AddRef();
    hr = CheckUserGroups(pUser);
    if(pUser) pUser->Release();
    CoUninitialize();
}

예제 설명..
위이 상단 두 함수는 MSDN을 참조하여 구성한 것이고..
아래의 main 문에서 실제 정보를 추출하는데 필요한 GetUserObject()에 전달되는 인자 타입에 대하여 설명한다.

IADsUser *pUser = (IADsUser*)GetUserObject( L"WinNT://KWONJH/Rkakr,user");

WinNT://KWONJH/Rkakr,user

여기서 WinNT는 NT커널임을 이야기 한다.
JWONJH는 컴터의 이름이다... 혹은 다른 컴터의 이름이나 도메인 이름이 될 수 있다.
Rkakr 는 사용자의 유저 이름이다.

혹시나 이것을 지금 로그온 한 사람의 유저 이름으로 할려면 간단하게..
char *logname =getenv("USERNAME");
이렇게 읽어 오면 된다.
user 요건은 사용자를 말하며.. 컴터를 찾을 경우는 computer라고 입력하면 된다.

실제로 위의 정보가 맞다면..

CheckUserGroups 함수 중간에 있는 프린트 문에서..
현 정보가 주어진 사용자가 속한 그룹의 리스트가 쭈~~욱 프린트 될것이다.

테스트 환경
Windows XP SP1/ Windows 2000 SP2,  VC++6.0 SP5

위의 코드를 돌려 보니 아래와 같은 결과가 나왔습니다.

User: Rkakr
Group belonged: Administrators
Group belonged: Remote Desktop Users
Group belonged: Users


그럼 즐거운 주말 되세욤 ^^;

+ Recent posts