키워드 [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
그럼 즐거운 주말 되세욤 ^^;
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
그럼 즐거운 주말 되세욤 ^^;