社内ApacheサイトでWindowsユーザー名を得る方法

 社内のWebサービスでユーザー別のアクセスログをとる必要がありまして、クライントは全部Windowsなので統合Windows認証を使えば特にクライアント側で操作せずにそのままWindowsのログイン名を入手できます。IEやEdgeはもちろんですがChromeも特に設定不要でした。Firefoxではログインのダイアログが出ますが、IEChromeと同じに出さなくする設定は可能なようで、方法を調べるとあちこちにあります。
 サーバー側はIISなら簡単にできるのですが、うちのサーバーはLinuxなのでちょっと手間が必要です。とはいっても統合Windows認証によるSingle Sign-Onというよりはユーザー名の取得が目的なので、LDAPとかWinbindも必要なくこちらのPHPスクリプトを組み込むだけで可能でした。ソースを見ればわかりますが、401を投げてWWW-Authenticate: NTLMの戻り値からユーザー名、ドメイン名、マシン名を入手できるとのこと。こちらのページが説明で、このページが元みたいです。
 もう10年以上前の情報ですが、CentOS 7上のApache 2.4.6とPHP 5.4.16で問題なくユーザー名などを取得できました。ただひとつ上記ソースでは問題がありまして、文字列の取得で

if ($unicode)
	return str_replace("\0", '', substr($msg, $off, $len));
else
	return substr($msg, $off, $len);

と$unicode、デフォルトの値がtrueで雑に\0を削除だけして結果を得ており、漢字などの日本語はまったく考慮されていません。調べてみるとNTLM認証ではUTF-16のリトルエンディアンで扱われているとのことでしたので、$unicode変数はなくして

return mb_convert_encoding(substr($msg, $off, $len), "UTF-8", "UTF-16LE");

とUTF-16LEから、うちのシステム既定値のUTF-8へ変換をかけて文字化けなしにユーザー名の入手ができるようになりました。このときphp-mbstringパッケージのインストールは必要ですけど、たいていの人は入れているんじゃないでしょうか。うちも導入済みでした。
 ともかく先人の方々には感謝です。