以前書いたPC上の全てのユーザー名を取得するプログラムを拡張し、net user (ユーザー名)で出てくる、2行目のフル ネームも取得できるようにしてみました。ちなみにフル ネームがない場合はユーザー名が出てくるようにしてあります。
これは私のPCで「net user AinoMegumi」というコマンドを実行した時の出力結果の上2行です。
get_all_user_info.cpp
# ifndef UNICODE
# define UNICODE
# endif
# include <Windows.h>
# include <string>
# include <vector>
# include <LM.h>
std::vector<std::pair<std::wstring, std::wstring>> get_all_user() {
std::vector<std::pair<std::wstring, std::wstring>> re;
PVOID pv;
DWORD n, i = 0, err;
do {
switch (err = NetQueryDisplayInformation(0, 1, i, MAXDWORD, MAX_PREFERRED_LENGTH, &n, &pv)) {
case 0:
case ERROR_MORE_DATA:
if (n) {
PNET_DISPLAY_USER p = (PNET_DISPLAY_USER)pv;
do {
i = p->usri1_next_index;
if (std::wcslen(p->usri1_full_name) == 0) re.emplace_back(std::make_pair(p->usri1_name, p->usri1_name));
else re.emplace_back(std::make_pair(p->usri1_name, p->usri1_full_name));
// DbgPrint("<%S> <%S>\n", p->usri1_name, p->usri1_comment);
# if 0 // for C++ Builder XE4
OutputDebugString(p->usri1_name);
# endif
} while (p++, --n);
}
NetApiBufferFree(pv);
break;
}
} while (err == ERROR_MORE_DATA);
return re;
}
使い方例(この関数をget_all_user_info.hに書いたと仮定)
main.cpp
# include <iostream>
# include "get_all_user_info.h"
int main() {
std::wcout.imbue(std::locale(""));
for (auto& i : get_all_user()) {
std::wcout << i.first << ", " << i.second << std::endl;
}
std::getchar();
return 0;
}
HomeGroupUser$出ないようにしようかなとも考えたんですが、まあいいやってことでその処理してません。
ちなみに、当然これもnetapi32.libのリンカー指定が必要です。