// Fetches the MAC address and prints it static void GetMACaddress(void) { unsigned char MACData[8]; // Allocate data structure for MAC (6 bytes needed) WKSTA_TRANSPORT_INFO_0 *pwkti; // Allocate data structure for Netbios DWORD dwEntriesRead; DWORD dwTotalEntries; BYTE *pbBuffer; // Get MAC address via NetBios's enumerate function NET_API_STATUS dwStatus = NetWkstaTransportEnum( NULL, // [in] server name 0, // [in] data structure to return &pbBuffer, // [out] pointer to buffer MAX_PREFERRED_LENGTH, // [in] maximum length &dwEntriesRead, // [out] counter of elements actually enumerated &dwTotalEntries, // [out] total number of elements that could be enumerated NULL); // [in/out] resume handle assert(dwStatus == NERR_Success); pwkti = (WKSTA_TRANSPORT_INFO_0 *)pbBuffer; // type cast the buffer for (DWORD i = 0; i< dwEntriesRead; i++) // first address is 00000000, skip it { // enumerate MACs and print swscanf((wchar_t *)pwkti[i].wkti0_transport_address, L"%2hx%2hx%2hx%2hx%2hx%2hx", &MACData[0], &MACData[1], &MACData[2], &MACData[3], &MACData[4], &MACData[5]); PrintMACaddress(MACData); } // Release pbBuffer allocated by above function dwStatus = NetApiBufferFree(pbBuffer); assert(dwStatus == NERR_Success); }
static INT DisplayWorkstationConfig(VOID) { PWKSTA_INFO_100 WorkstationInfo = NULL; PWKSTA_USER_INFO_1 UserInfo = NULL; PWKSTA_TRANSPORT_INFO_0 TransportInfo = NULL; DWORD dwRead = 0, dwTotal = 0, i; INT nPaddedLength = 38; NET_API_STATUS Status; Status = NetWkstaGetInfo(NULL, 100, (PBYTE*)&WorkstationInfo); if (Status != NERR_Success) goto done; Status = NetWkstaUserGetInfo(NULL, 1, (PBYTE*)&UserInfo); if (Status != NERR_Success) goto done; Status = NetWkstaTransportEnum(NULL, 0, (PBYTE*)&TransportInfo, MAX_PREFERRED_LENGTH, &dwRead, &dwTotal, NULL); if (Status != NERR_Success) goto done; PrintPaddedMessageString(4450, nPaddedLength); ConPrintf(StdOut, L"\\\\%s\n", WorkstationInfo->wki100_computername); PrintPaddedMessageString(4468, nPaddedLength); ConPuts(StdOut, L"...\n"); PrintPaddedMessageString(4451, nPaddedLength); ConPrintf(StdOut, L"%s\n", UserInfo->wkui1_username); ConPuts(StdOut, L"\n"); PrintPaddedMessageString(4453, nPaddedLength); ConPuts(StdOut, L"\n"); for (i = 0; i < dwRead; i++) { ConPrintf(StdOut, L" %s (%s)\n", &TransportInfo[i].wkti0_transport_name[8], TransportInfo[i].wkti0_transport_address); } ConPuts(StdOut, L"\n"); PrintPaddedMessageString(4452, nPaddedLength); ConPrintf(StdOut, L"%lu.%lu\n", WorkstationInfo->wki100_ver_major, WorkstationInfo->wki100_ver_minor); ConPuts(StdOut, L"\n"); PrintPaddedMessageString(4455, nPaddedLength); ConPrintf(StdOut, L"%s\n", WorkstationInfo->wki100_langroup); PrintPaddedMessageString(4469, nPaddedLength); ConPuts(StdOut, L"...\n"); PrintPaddedMessageString(4456, nPaddedLength); ConPrintf(StdOut, L"%s\n", UserInfo->wkui1_logon_domain); ConPuts(StdOut, L"\n"); PrintPaddedMessageString(4458, nPaddedLength); ConPuts(StdOut, L"...\n"); PrintPaddedMessageString(4459, nPaddedLength); ConPuts(StdOut, L"...\n"); PrintPaddedMessageString(4460, nPaddedLength); ConPuts(StdOut, L"...\n"); done: if (TransportInfo != NULL) NetApiBufferFree(TransportInfo); if (UserInfo != NULL) NetApiBufferFree(UserInfo); if (WorkstationInfo != NULL) NetApiBufferFree(WorkstationInfo); return 0; }
bool CMacFetcher::GetMACbyNetBiosRedir(MACAddress& addr) { WKSTA_TRANSPORT_INFO_0 *pwkti = NULL; DWORD dwEntriesRead; DWORD dwTotalEntries; BYTE *pbBuffer = NULL; // 通过 NetBIOS的枚举函数获取MAC地址 NET_API_STATUS dwStatus = NetWkstaTransportEnum( NULL, 0, &pbBuffer, MAX_PREFERRED_LENGTH, &dwEntriesRead, &dwTotalEntries, NULL); if (dwStatus != NERR_Success) { return false; } if (pbBuffer == NULL || dwEntriesRead == 0) { return false; } pwkti = (WKSTA_TRANSPORT_INFO_0 *)pbBuffer; // 指针类型转换 for(DWORD i = 0; i < dwEntriesRead && pwkti; ++i) { short usMac[6] = { 0 }; // 读取并打印MAC地址 #if _MSC_VER <= 1200 if (swscanf((wchar_t *)pwkti[i].wkti0_transport_address, L"%2hx%2hx%2hx%2hx%2hx%2hx", &usMac[0], &usMac[1], &usMac[2], &usMac[3], &usMac[4], &usMac[5]) == 6) #else if (swscanf_s((wchar_t *)pwkti[i].wkti0_transport_address, L"%2hx%2hx%2hx%2hx%2hx%2hx", &usMac[0], &usMac[1], &usMac[2], &usMac[3], &usMac[4], &usMac[5]) == 6) #endif { for (int j = 0; j < 6; ++j) { addr.v[j] = (unsigned char)(usMac[j] & 0x00ff); } if (addr != MACAddress()) { break; } } } NetApiBufferFree(pbBuffer); return true; }