请问如何使用VC++获得一个用户所属的用户组? 本帖最后由 wyf1890 于 2011-07-20 14:03:00 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 void main(){ CoInitialize(NULL); IBindCtx* pBC=NULL; ::CreateBindCtx(0,&pBC); IMoniker* pMoniker; ULONG chEaten; HRESULT hr = ::MkParseDisplayName(pBC, L"WinNT://localhost/administrator,user", &chEaten, &pMoniker); if (SUCCEEDED(hr)) { IADsUser* pUser = NULL; hr = pMoniker->BindToObject(pBC, NULL, IID_IADsUser, (void**)&pUser); if (SUCCEEDED(hr)) { BSTR bstrName; pUser->get_Name(&bstrName); wprintf(L"%s\n", bstrName); SysFreeString(bstrName); IADsMembers* pGroups; hr = pUser->Groups(&pGroups); if (SUCCEEDED(hr)) { IUnknown *pUnk; hr = pGroups->get__NewEnum(&pUnk); if (SUCCEEDED(hr)) { IEnumVARIANT *pEnum; hr = pUnk->QueryInterface(IID_IEnumVARIANT,(void**)&pEnum); if (SUCCEEDED(hr)) { // 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); wprintf(L"\tGroup belonged: %s\n", bstr); SysFreeString(bstr); pADs->Release(); } VariantClear(&var); pDisp=NULL; hr = pEnum->Next(1, &var, &lFetch); }; hr = pEnum->Release(); } pUnk->Release(); } pGroups->Release(); } pUser->Release(); } pMoniker->Release(); } CoUninitialize();} http://topic.csdn.net/t/20041123/12/3579856.html很多应用程序在运行时都要求确定是否以管理优先级运行,例如,只有管理员才能使用的实用程序就是这样情况。实现这种功能的方法有很多,本文拟介绍一种方法,它通过获取进程TOKEN来实现。 第一步:调用OpenProcessToken函数获取当前进程TOKEN的句柄,方法如下: HANDLE hAccessToken; OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY,&hAccessToken); 当获得TOKEN句柄之后,我们还得获取这个TOKEN的分组信息: BYTE InfoBuffer[1024]; DWORD dwInfoBufferSize; GetTokenInfomation(hAccessToken, TokenGroups, InfoBuffer, 1024, &dwInfoBufferSize); 第二步:为Local Admin账号获取安全标示符(SID),我们要利用这个账号在所有TOKEN分组中查找Local Admin SID(不要忘了调用FreeSid函数来释放内存)。 PSID psidAdministrators; SID_IDENTIFIER_AUTHORITY siaNtAuthority = SECURITY_NT_AUTHORITY; AllocateAndInitializeSid( &siaNtAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0,0,0,0,0,0, &psidAdministrators) 最后一步:在所有TOKEN分组中查找Local Admin SID: PTOKEN_GROUPS ptgGroups = (PTOKEN_GROUPS)InfoBuffer; for(UINT i = 0; i < ptgGroups-> GroupCount; i ++) { if( EqualSid(psidAdministrators,ptgGroups-> Groups[i].Sid) ) { // 此进程有管理权限 break; } } 如何从数据库中个读取一个字段显示在combox中, 在另一个线程设置CStatic的的宽度,但CStatic的位置居然变了 如何读取浏览器中非持久cookie vc中有没有使程序自动重启的函数? Java程序员转VC++平台(三维可视化方向)大概需要多久? 常见小问题,但你知道是为什么吗? gethostname的问题 怎样获得有一个ListView视图的指针 系统找不到硬盘。高手救命!!!!! 请问哪里有可以实现类似netxray功能的VC源代码? 关于MFC DLL求助! CRichEdit在win7下滚动条不消失
{
CoInitialize(NULL);
IBindCtx* pBC=NULL;
::CreateBindCtx(0,&pBC);
IMoniker* pMoniker;
ULONG chEaten;
HRESULT hr = ::MkParseDisplayName(pBC, L"WinNT://localhost/administrator,user", &chEaten, &pMoniker);
if (SUCCEEDED(hr))
{
IADsUser* pUser = NULL;
hr = pMoniker->BindToObject(pBC, NULL, IID_IADsUser, (void**)&pUser);
if (SUCCEEDED(hr))
{
BSTR bstrName;
pUser->get_Name(&bstrName);
wprintf(L"%s\n", bstrName);
SysFreeString(bstrName); IADsMembers* pGroups;
hr = pUser->Groups(&pGroups);
if (SUCCEEDED(hr))
{
IUnknown *pUnk;
hr = pGroups->get__NewEnum(&pUnk);
if (SUCCEEDED(hr))
{
IEnumVARIANT *pEnum;
hr = pUnk->QueryInterface(IID_IEnumVARIANT,(void**)&pEnum);
if (SUCCEEDED(hr))
{
// 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);
wprintf(L"\tGroup belonged: %s\n", bstr);
SysFreeString(bstr);
pADs->Release();
}
VariantClear(&var);
pDisp=NULL;
hr = pEnum->Next(1, &var, &lFetch);
};
hr = pEnum->Release();
}
pUnk->Release();
}
pGroups->Release();
}
pUser->Release();
}
pMoniker->Release();
}
CoUninitialize();
}
很多应用程序在运行时都要求确定是否以管理优先级运行,例如,只有管理员才能使用的实用程序就是这样情况。实现这种功能的方法有很多,本文拟介绍一种方法,它通过获取进程TOKEN来实现。
第一步:调用OpenProcessToken函数获取当前进程TOKEN的句柄,方法如下: HANDLE hAccessToken;
OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY,&hAccessToken); 当获得TOKEN句柄之后,我们还得获取这个TOKEN的分组信息:
BYTE InfoBuffer[1024];
DWORD dwInfoBufferSize; GetTokenInfomation(hAccessToken,
TokenGroups,
InfoBuffer,
1024,
&dwInfoBufferSize); 第二步:为Local Admin账号获取安全标示符(SID),我们要利用这个账号在所有TOKEN分组中查找Local Admin SID(不要忘了调用FreeSid函数来释放内存)。
PSID psidAdministrators;
SID_IDENTIFIER_AUTHORITY siaNtAuthority = SECURITY_NT_AUTHORITY;
AllocateAndInitializeSid( &siaNtAuthority,
2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS,
0,0,0,0,0,0,
&psidAdministrators) 最后一步:在所有TOKEN分组中查找Local Admin SID:
PTOKEN_GROUPS ptgGroups = (PTOKEN_GROUPS)InfoBuffer; for(UINT i = 0; i < ptgGroups-> GroupCount; i ++)
{
if( EqualSid(psidAdministrators,ptgGroups-> Groups[i].Sid) )
{
// 此进程有管理权限
break;
}
}