小池啓仁 ヒロヒト応援ブログ By はてな

小池啓仁(コイケヒロヒト)の動画など。

小池啓仁 ヒロヒト応援ブログ By はてな

ログオンユーザID取得時の謎の異常終了

VBでのWINDOWSのログオンユーザID取得は、APIを使用しますが、それでも一筋縄では取得できません。

どこが一筋縄でないかというと、普通にGetUserNameでゲットするとString型のエリアを壊してしまうのです(たぶん)。そして、異常終了。

VBの仕様では、String型は2Gバイトまで自動拡張で代入できるはずなのにです。

これは、String型への代入の方式が、VBの世界ではエリアを確保したあと代入するのにたいして、APIの世界では、いきなり代入してしまうのかなと思う次第です。

したがって、あらかじめエリアを確保したあと、代入するとGetUserNameでも上手くログオンユーザIDが取得できます。

しかし、まだ、以下の条件があります。

GetUserNameで取得するログオンユーザIDのサイズはMAXで256。
取得したログオンユーザID文字列の最後の文字の直後にゼロが入っている。
したがってエリア的には、257バイト確保。上記を踏まえてコーディングすると以下のような感じになります。

    Declare Function GetUserName Lib "advapi32.dll" _
            Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long
    
    Const UNLEN = 256
    Dim intPos As Integer
    Dim strUserNameBuffer As String

    'ユーザー名を取得
    strUserNameBuffer = Space(UNLEN + 1)
    GetUserName strUserNameBuffer, UNLEN
    intPos = InStr(strUserNameBuffer, Chr$(0))
    If intPos > 0 Then
        strUserNameBuffer = Left$(strUserNameBuffer, intPos - 1)
    End If