

secur32.dllのLsaLogonUserを利用してログイン認証を行っています。  
LsaLogonUserの戻り値がSTATUS_SUCCESS(0)になっているにも関わらず、取得したtokenからGetTokenInformationを実行すると「ハンドルが無効です。」のエラーになってしまい、ユーザー情報が取得できません（ユーザーのSIDを取得したいです）。

ただ、このコードをx86でビルドした場合には取得することができます。  
x64だと取得に失敗する理由が分かりませんでした。  
すみませんが、ご教示頂ければと思います。

なお、取得されるtokenはx86の場合は「0x00000b80」や「0x00000a4c」になるのに対し、x64の場合は常に「0x0000000005410001」が返ってきます。

末尾の行のGetTokenInformationのResultがfalseになり、Marshal.GetLastWin32Error()を呼び出すと6（ハンドルが無効です。）になります。

以下、関連する部分を抜粋します。

[code]

            private bool CheckLoginUser(uint authPackage, IntPtr outCredBuffer, uint outCredSize)
            {
                const string PG_NAME = "Sample";
    
                WinStatusCodes status = LsaConnectUntrusted(out IntPtr lsaHandle);
                if (status != WinStatusCodes.STATUS_SUCCESS) return false;
    
                using (LsaStringWrapper originName = new LsaStringWrapper(PG_NAME))
                {
                    //ログイン試行実施
                    TOKEN_SOURCE source = new TOKEN_SOURCE(PG_NAME);
                    status = LsaLogonUser(lsaHandle, ref originName._string, SecurityLogonType.Interactive,
                                          authPackage, outCredBuffer, outCredSize, IntPtr.Zero, ref source, out IntPtr profileBuffer,
                                          out uint profileBufferLength, out long logonId, out IntPtr token, out QUOTA_LIMITS quotas, out WinStatusCodes subStatus);
    
                    //ログインに失敗すると1326が返る
                    var ntStatus = LsaNtStatusToWinError((uint)status);
                    Console.WriteLine("ntStatus: " + ntStatus);
    
                    if (profileBuffer != IntPtr.Zero) LsaFreeReturnBuffer(profileBuffer);
    
                    //ユーザー認証失敗（戻り値が成功でない）
                    if (status != WinStatusCodes.STATUS_SUCCESS) return false;  //パスワードを間違えると、STATUS_LOGON_FAILURE（3221225581 = 0xC000006D）が返る
    
                    //tokenからユーザー情報を取得
                    int TokenInfLength = 0;
                    // first call gets lenght of TokenInformation
                    bool Result = GetTokenInformation(token, TOKEN_INFORMATION_CLASS.TokenUser, IntPtr.Zero, TokenInfLength, out TokenInfLength);
                    IntPtr TokenInformation = Marshal.AllocHGlobal(TokenInfLength);
                    Result = GetTokenInformation(token, TOKEN_INFORMATION_CLASS.TokenUser, TokenInformation, TokenInfLength, out TokenInfLength);
    
[/code]


CC BY-SA 4.0
2021-11-25T15:58:18.593
83806
2021-11-26T00:33:15.397
2021-11-26T00:33:15.397
3060
49222
question
c#
LsaLogonUserで取得したtokenからGetTokenInformationを実行すると、x64でビルドした場合にユーザーのSIDが取得できない