如何获得本地的所有用户?

yunshiyu 2005-07-29 05:45:40
就是获得计算机管理里面的所有用户:Administrator、Guest、SQLDebugger、user等
应该有个API函数,但我没有找到,有谁知道吗?
...全文
77 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
erwinrommel 2005-07-30
  • 打赏
  • 举报
回复
学习贴,收藏,很少看到5星级人物回帖啊,呵呵!
masterz 2005-07-29
  • 打赏
  • 举报
回复
#include "stdafx.h"
#import "c:\program files\common files\system\ado\msado15.dll" rename
("EOF", "adoEOF")
#include <fstream>
#include <sstream>
#include <Iads.h>
#include <comdef.h>
#include <tchar.h>
#include <stdio.h>
#include <Adshlp.h>
#pragma comment(lib,"ActiveDS")
#pragma comment(lib,"adsiid")

#include <atlbase.h>
#include <iostream>

void print_property(HRESULT hr,_bstr_t& property_name,
_variant_t& property_value)
{
if(FAILED(hr))
{
std::cout<<"Failed to get property: "<<(LPCTSTR)property_name
<<std::endl;
return;
}
if(VT_BSTR == property_value.vt)
{
std::cout<<(LPCTSTR)property_name<<":"
<<(LPCTSTR)(_bstr_t)property_value<<std::endl;
}
if(VT_I4 == property_value.vt)
{
std::cout<<(LPCTSTR)property_name<<":"
<<(long)property_value<<std::endl;
}
if(VT_VARIANT|VT_ARRAY )
{
SAFEARRAY* psa = property_value.parray;
VARIANT* varArray=NULL;
SafeArrayAccessData(psa,(VOID**)&varArray);
UINT uDim = SafeArrayGetDim(psa);
if(1==uDim)
{
long lLbound,lRbound;
SafeArrayGetLBound(psa,1,&lLbound);
SafeArrayGetUBound(psa,1,&lRbound);
std::cout<<(LPCTSTR)property_name<<":"<<std::endl;
for(long i=lLbound;i<=lRbound;i++)
{
if(varArray[i].vt==VT_BSTR)
{
_bstr_t bstmp(varArray[i].bstrVal,true);
std::cout<<(LPCTSTR)(bstmp)<<std::endl;
}
}
SafeArrayUnaccessData(psa);
}

}

}
HRESULT get_from_current_domain(_bstr_t sFilter)
{//Tested on Windows 2000 Professional SP4, VC6 SP6
CComPtr<IADs> pRoot;
HRESULT hr = S_OK;
_bstr_t object_name = "LDAP://rootDSE";
hr = ADsGetObject(object_name,IID_IADs,(void**)&pRoot);
if(SUCCEEDED(hr))
{
BSTR bstr = NULL;
_variant_t property_value;
_bstr_t property_name = "defaultNamingContext";
hr=pRoot->Get(property_name,&property_value);
print_property(hr,property_name,property_value);
if(SUCCEEDED(hr))
{
CComPtr<IADs> pDomain;
_bstr_t ldap_domain = "LDAP://";
ldap_domain += (_bstr_t)property_value;
hr = ADsGetObject(ldap_domain,IID_IADs,(void**)&pDomain);
if(FAILED(hr))
{
return hr;
}
hr = pDomain->get_ADsPath(&bstr);
if(FAILED(hr))
return hr;
_bstr_t sBase;
sBase = "<";
sBase += bstr;
sBase += ">";
SysFreeString(bstr);
bstr = NULL;
//_bstr_t sFilter = "(&(objectCategory=person)(objectClass=user))";
_bstr_t sAttribs = "name";
_bstr_t sDepth = "subTree";
_bstr_t sQuery = sBase + ";" + sFilter + ";" + sAttribs
+ ";" + sDepth;
ADODB::_ConnectionPtr pConnection;
pConnection.CreateInstance( __uuidof( ADODB::Connection ) );
_bstr_t bstrEmpty;
pConnection->Open("Data Source=Active Directory
Provider;Provider=ADsDSOObject",
bstrEmpty, bstrEmpty, -1 );
ADODB::_RecordsetPtr pRecordset;
_variant_t records_affected;
pRecordset = pConnection->Execute(sQuery,&records_affected,0);
while(!pRecordset->adoEOF)
{
std::cout<<(LPCTSTR)(_bstr_t)pRecordset->Fields->Item["name"]->Val
ue
<<std::endl;
pRecordset->MoveNext();
}
if(pRecordset->State)
{
pRecordset->Close();
std::cout<<"Close recordset"<<std::endl;
}
if(pConnection->State)
{
pConnection->Close();
std::cout<<"Close connection"<<std::endl;
}
}
}
else
{
std::cout<<"failed to get object:"<<(LPCTSTR)object_name
<<std::endl;
}
return ERROR_SUCCESS;
}
HRESULT get_all_users()
{
std::cout<<"Get all users of current domain"<<std::endl;
return
get_from_current_domain("(&(objectCategory=person)(objectClass=user))"
);
}
HRESULT get_all_computers()
{
std::cout<<"Get all computers of current domain"<<std::endl;
return get_from_current_domain("(&(objectCategory=computer))");
}
int main(int argc, char* argv[])
{
CoInitialize(NULL);
get_all_users();
get_all_computers();
CoUninitialize();
return 0;
}
OpenHero 2005-07-29
  • 打赏
  • 举报
回复
system()命令有

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧