
whoami.exe やそれに類するバイナリを呼び出さずに現在のユーザー名を取得するための実験です。
PEB 構造体から環境変数を取得し、その中からユーザー名を解析します。
NtQueryInformationProcess 関数は、PEB ベースアドレスへのポインタを含む "PROCESS_BASIC_INFORMATION" 構造体を返します。
PEB 構造体には、RTL_USER_PROCESS_PARAMETERS 構造体へのポインタ "ProcessParameters" が含まれています。
その構造体から、環境変数へのポインタ "Environment" と、環境変数のサイズへのポインタ "EnvironmentSize" を取得できます。
"EnvironmentSize" で指定されたバイト数を、"Environment" アドレスから UNICODE テキストとして読み取り、環境変数を解析して "USERNAME" という名前のものを出力します。すべての環境変数を取得したい場合は、このリポジトリ を参照してください。


トークンにアクセスし、ユーザーの SID を文字列形式で取得した後、LookupAccountSid 関数を使用してユーザー名に変換します。
NtOpenProcessToken 関数は、現在のプロセスに関連付けられたアクセストークンを作成します。
NtQueryInformationToken 関数は、作成したトークンから情報を取得します。"TOKEN_INFORMATION_CLASS" フィールドに値 "tokenUser" (1) を使用すると、ユーザー名に関する情報が取得され、ポインタ "TokenInformation" に格納されます。
ConvertSidToStringSid 関数は、ユーザー名の SID をバイナリ形式から文字列形式に変換します。
LookupAccountSid 関数は、文字列形式の SID を受け取り、ユーザー名を返します。


トークンと Policy オブジェクトにアクセスし、LsaLookupSids 関数を使用してユーザー名を取得します。
NtOpenProcessToken 関数と NtQueryInformationToken 関数は方法 2 と同様に使用され、ユーザーの SID をバイナリ形式で含むポインタ "TokenInformation" を返します。
LsaOpenPolicy 関数は、現在のシステムの Policy オブジェクトへのハンドルを作成します。
LsaLookupSids 関数は、SID へのポインタを受け取り、ユーザー名を含む LSA_TRANSLATED_NAME 構造体を返します。


名前付きパイプとセカンダリスレッドを作成し、名前付きパイプに書き込みと読み取りを行い、未文書化関数 NpGetUsername からユーザー名を取得します。


CoCreateInstance 関数を使用して、MSDN の例 と同様に、コンピューターがドメインに参加している場合にユーザー名を取得します。ActiveDS.dll の ADSystemInfoClass クラス、および ADSystemInfo インターフェイスと IADsADSystemInfo インターフェイスを使用します。これらはプロジェクトフォルダに既に含まれているため、DLL は必要ありません。
AD との接続がない場合:

接続がある場合:
