直接上代码,获取sid,并且转换成字符串形式。没有仔细优化代码,这只能是一段demo代码,但是能跑成功。跟大家share一下。

// LDAPTest.cpp : Defines the entry point for the console application.
//#include "stdafx.h"#include <windows.h>
#include "Winldap.h"
#include <Dsgetdc.h>
#include <Sddl.h>
#include <string>
#include <algorithm>
//#include <locale>#define MAX_NAME 1024std::string ConvertToStringSid(const unsigned char* bsid, const int len);
namespace myldap
{std::wstring LogInWithLdap(const std::wstring& strLdapServer, const std::wstring& strDomain, const std::wstring& strUserName, const std::wstring& strPwd){const WCHAR* kSAMAccountName = L"sAMAccountName";const WCHAR* kObjectSid = L"objectSid";ULONG rt;LDAP* ld = ldap_initW((PWSTR)strLdapServer.c_str(), 0);rt = ldap_set_option(ld, LDAP_OPT_PROTOCOL_VERSION, (void*)3);rt = ldap_connect(ld, NULL);std::wstring strLoginName;strLoginName.append(strDomain);strLoginName.append(L"\\");strLoginName.append(strUserName);rt = ldap_simple_bind_s(ld, (PWSTR)strLoginName.c_str(), (PWSTR)strPwd.c_str());LDAPMessage *pMsg = NULL;WCHAR* attrs[] = {(WCHAR*)kObjectSid, NULL};WCHAR filter[1000] =  {0};wsprintf(filter, L"(%s=%s)", kSAMAccountName, strUserName.c_str());rt = ldap_search_sW(ld, L"", LDAP_SCOPE_SUBTREE, filter, attrs, 0, &pMsg);ULONG entry_count = ldap_count_entries(ld, pMsg);std::wstring ret;LDAPMessage *e = NULL;  for (e = ldap_first_entry(ld, pMsg); e != NULL; e = ldap_next_entry(ld, e))  {PWCHAR pp = ldap_get_dnW(ld, e);std::wstring dn(pp);std::transform(dn.begin(), dn.end(), dn.begin(), tolower);auto i1 = dn.find(L"dc=");auto i2 = dn.find(L",", i1);auto dc = dn.substr(i1 + 3, i2 - i1 - 3);if (_wcsicmp(dc.c_str(), strDomain.c_str()) != 0){continue;}BerElement* ber = NULL;WCHAR* attribute = ldap_first_attributeW(ld, e, &ber);while (attribute){berval** attrList;if (attrList = ldap_get_values_lenW(ld, e, attribute)){for (int i = 0; attrList[i]; i++ ){std::string sid = ConvertToStringSid((const unsigned char*)attrList[i]->bv_val, attrList[i]->bv_len);ret = std::wstring(sid.begin(), sid.end());}ldap_value_free_len(attrList);}ldap_memfreeW(attribute);attribute = ldap_next_attributeW(ld, e, ber);}}return ret;}
}std::string ConvertToStringSid(const unsigned char* bsid, const int len)
{if (len < 8)  // at least 8 bytes{return "";}char buf[1024] = {0};std::string sid("S");// revisionint revision = bsid[0];memset(buf, 0, sizeof(buf));sprintf_s(buf, "-%d", revision);sid.append(buf);// 6 typesunsigned char temp[6] = {0};for (int i = 0; i < 6; ++i){temp[6 - i - 1] = bsid[2 + i];}long long d3 = 0;memcpy(&d3, temp, 6);memset(buf, 0, sizeof(buf));sprintf_s(buf, "-%ld", d3);sid.append(buf);// 32bit (4bytes) dashesint dashes = (int)bsid[1];  // second byte determines dash number. dashes = total dashes - 2if (dashes * 4 != len - 8){return "";  // wrong format}for (int i = 0; i < dashes; ++i){unsigned int v = 0;memcpy(&v, bsid + 8 + i * 4, 4);memset(buf, 0, sizeof(buf));sprintf_s(buf, "-%u", v);sid.append(buf);}return sid;
}int _tmain(int argc, _TCHAR* argv[])
{std::wstring strSid = myldap::LogInWithLdap(L"qapf1.qalab01.nextlabs.com:3268", L"qapf1", L"john.tyler", L"john.tyler");return 0;
}

随手写了一段C++访问LDAP, 并且获取sid的代码相关推荐

  1. 如何写windbg高级脚本---以访问文件的windbg脚本为例说明

    最近需要在访问指定文件时中断下来,但不知道如何下断,在网上搜索了一番无果,只好自己摸索了.听大侠说windbg的条件断点功能异常强大,可以实现,不禁心痒,特尝试一番,顺便熟悉一下windbg的脚本语法 ...

  2. 只因写了一段爬虫,公司200多人被抓 ?

    "一个程序员写了个爬虫程序,整个公司200多人被端了." "不可能吧!" 刚从朋友听到这个消息的时候,我有点不太相信,做为一名程序员来讲,谁还没有写过几段爬虫呢 ...

  3. 第四十八期:只因写了一段爬虫,公司200多人被抓!

    刚从朋友听到这个消息的时候,我有点不太相信,做为一名程序员来讲,谁还没有写过几段爬虫呢?只因写爬虫程序就被端有点夸张了吧. 作者:纯洁的微笑|2019-10-17 09:51 "一个程序员写 ...

  4. 可怕!只因写了一段爬虫代码,全公司200人被警察一锅端!

    点击上方"码农突围",马上关注,每天上午8:50准时推送 这里是码农充电第一站,回复"666",获取一份专属大礼包 真爱,请设置"星标"或点 ...

  5. 我花 1 分钟写了一段爬虫,帮助小姐姐解放了双手

    1. 场景 最近有一位小姐姐向我抱怨,说她家宝宝最近要打预防针,受疫情影响,市区定点的社康医院太少,导致预约号基本靠抢,根本是一号难求 每次预约都要一直守在手机旁,不停地刷新页面去抢号,太耽误功夫了, ...

  6. 新人入职,上午写了一段代码,下午就被开除了

    1 有一个程序员,入职了一家公司,上午刚刚写下一段代码,没想到下午就有人事来通知他被开除了.  这个程序员表示很委屈.感觉这个方法,除了性能差一点,没啥别的问题呀... 2 除了获取时间以外,一位程 ...

  7. Java中有关日期的操作,昨天晚上赴约,搞到12点多才回来,今天写这一小段代码都花了一段漫长的时间,哎。。...

    Java中有关日期的操作,昨天晚上赴约,搞到12点多才回来,今天写这一小段代码都花了一段漫长的时间,哎.. 代码奉上: /** * * @param date * @return which mont ...

  8. 金蝶站点重新输入服务器ip,金蝶KIS客户端和服务器不在同一IP段互相访问

    金蝶KIS客户端和服务器不在同一IP段互相访问 现象:金蝶KIS的服务器在内网192.168.1.*这个网段中,同时在这个网段中我增加一个无线路由器分配的IP段是192.168.2.*:金蝶的客户端就 ...

  9. 学习期间的感悟和个人写的一段歌词

    来兄弟连 时间在不经意间已经过去了3个多月. 在这段时间内,我改变了很多很多. 学会了自主去学习,找到的新的目标,和对未来不再那么迷茫. 更让我庆幸的是,宿舍的兄弟对我非常好. 让我很庆幸当初决定来这 ...

  10. 月薪9K程序员,写完这段代码就被辞退了

    程序员头条 报道 作为一名互联网项目开发者,在工作的过程中遇到 Bug 是很正常的事情,然而有时候一些代码也是类似于 Bug 这样的存在,虽然看起来到处都是错误,可是却能正常运行! 最近有位程序员在某 ...

最新文章

  1. Java Review - PriorityQueue源码解读
  2. 常用面试题(对应的知识点)
  3. Ubuntu安装配置Python.pyDev
  4. IE 首页被改为www.1188.com的恢复办法
  5. 单片机软件模拟SPI接口—加深理解SPI总线协议
  6. 如何让shell脚本自杀
  7. 一个内存增长问题的分析和处理(二)——valgrind工具的用法
  8. C++ coredump原因总结(转载)
  9. C 线程同步的四种方式(Linux)
  10. 手把手图文并茂教你发布Android开源库
  11. 2021 王道考研 操作系统+习题讲解
  12. 统赢编程软件_统赢PressCAD线割慢走丝编程软件的线割上下异形编程设定
  13. 2016 hack.lu-ctf redacted RSA数据恢复
  14. [领域]javascript hacking guide 第5部分
  15. android layoutinflater原理分析,Android 之 LayoutInflater 全面解析
  16. 路由器/交换机/服务器的分类
  17. MySQL - 大量 sending data 状态进程,让数据库性能急剧下降。
  18. PettingZoo:多智能体游戏环境库入门
  19. 微信截屏分享、图片压缩处理!
  20. AngularJs中promise 和 $q 的一点解释

热门文章

  1. 大道至简(原标题:少是指数级的多)
  2. 分享几个国内外安全专家常用的漏洞库平台
  3. handsome for Typecho主题重建备忘
  4. 移动硬盘提示格式化解决办法,未正确删除导致不能读取文件提示格式化解决方案
  5. matlab连接mysql有什么用_MATLAB连接SQLServer和MySql数据库
  6. Retrofit源码分析
  7. Java面试-北大青鸟合肥科海学院
  8. 爱你却不能长相厮守痛楚等你殊不知道终局
  9. npm与yarn常用命令
  10. JAVA猎才学员成长心得分享