论安全萌新的自我修养

   :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

普通版本

#include <stdio.h>
#include <Windows.h>
#include <lmaccess.h>

#pragma comment(lib, "Netapi32.lib")
	//wmain是main函数的宽字符版本  在Unicode编码下使用
int wmain(int argc, wchar_t* argv[]) {//argc是输入参数的个数,argv存储了所有命令行的参数
	if (argc != 3) {			//如果这里的参数个数不是3个,则触发如下
		wprintf(L"Usage: +  \"groupname\"    \\\\servername\n");
		wprintf(L"Eg:    +  \"domain admins\" \\\\127.0.0.1\n");
		wprintf(L"      !!!  target ip must DC's ip  !!!   \n");
		exit(1);    //程序的退出,同break
	}
	wprintf(L"target servername:%s\n", argv[2]);
	wprintf(L"target groupname:%s\n", argv[1]);
	
	LPCWSTR servername = argv[2];	// 已经建立ipc连接的IP
	LPCWSTR groupname = argv[1];
	//DWORD  level 调用时候再给
	GROUP_USERS_INFO_1* cunchu;			//GROUP_USERS_INFO_1结构和下面构造函数的level相关,选用0有较多限定,还是用1,变量cunchu存放获取到的信息
	DWORD dwPrefmaxlen = MAX_PREFERRED_LENGTH;	// 指定返回数据的首选最大长度,以字节为单位。如果指定MAX_PREFERRED_LENGTH,该函数将分配数据所需的内存量。
	DWORD dwEntriesread;						// 指向一个值的指针,该值接收实际枚举的元素数。
	DWORD dwTotalentries;						//指向一个值的值,该值接收可能已从当前简历位置枚举的条目总数
	
	DWORD result;
	result = NetGroupGetUsers(servername, groupname,1, (LPBYTE*)&cunchu, dwPrefmaxlen, &dwEntriesread, &dwTotalentries, NULL);
	//上边的1就是函数里的等级level
	
	for (DWORD i = 0; i < dwEntriesread; i++) {  // i < dwEntriesread 小于收到的指针的元素数量
	
		wprintf(L"%s\n", cunchu[i].grui1_name);
	}
}

附带错误代码版本

#include <stdio.h>
#include <Windows.h>
#include <lmaccess.h>

#pragma comment(lib, "Netapi32.lib")
//wmain是main函数的宽字符版本  在Unicode编码下使用
int wmain(int argc, wchar_t* argv[]) {//argc是输入参数的个数,argv存储了所有命令行的参数
	if (argc != 3) {			//如果这里的参数个数不是3个,则触发如下
		wprintf(L"Usage: +  \"groupname\"    \\\\servername\n");
		wprintf(L"Eg:    +  \"domain admins\" \\\\192.168.3.144\n");
		wprintf(L"      !!!  target ip must DC's ip  !!!   \n");
		exit(1);    //程序的退出,同break
	}
	wprintf(L"target servername:%s\n", argv[2]);
	wprintf(L"target groupname:%s\n", argv[1]);

	LPCWSTR servername = argv[2];	// 已经建立ipc连接的IP
	LPCWSTR groupname = argv[1];
	//DWORD  level 调用时候再给
	GROUP_USERS_INFO_1* cunchu;			//GROUP_USERS_INFO_1结构和下面构造函数的level相关,选用0有较多限定,还是用1,变量cunchu存放获取到的信息
	DWORD dwPrefmaxlen = MAX_PREFERRED_LENGTH;	// 指定返回数据的首选最大长度,以字节为单位。如果指定MAX_PREFERRED_LENGTH,该函数将分配数据所需的内存量。
	DWORD dwEntriesread;						// 指向一个值的指针,该值接收实际枚举的元素数。
	DWORD dwTotalentries;						//指向一个值的值,该值接收可能已从当前简历位置枚举的条目总数

	DWORD result;
	result = NetGroupGetUsers(servername, groupname, 1, (LPBYTE*)&cunchu, dwPrefmaxlen, &dwEntriesread, &dwTotalentries, NULL);
	//上边的1就是函数里的等级level

	if (result == NO_ERROR) {
		for (DWORD i = 0; i < dwEntriesread; i++)
		{
			wprintf(L"[%u] %s \n", i, cunchu[i].grui1_name);
		}
	}
	else
	{
		wprintf(L"wrong number :%u",result);
	}
}


参考
https://docs.microsoft.com/en-us/windows/win32/api/lmaccess/nf-lmaccess-netgroupgetusers
https://docs.microsoft.com/en-us/windows/win32/netmgmt/network-management-error-codes
https://docs.microsoft.com/en-us/windows/win32/api/lmaccess/ns-lmaccess-group_users_info_1
https://github.com/SkewwG/domainTools/blob/master/NetGroupGetUsers/%E6%BA%90.cpp
posted on 2021-02-09 21:38  Yangsir34  阅读(182)  评论(0编辑  收藏  举报