本帖最后由 wyf1890 于 2011-07-20 14:03:00 编辑

解决方案 »

  1.   

    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();
    }
      

  2.   

    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; 
            }