2017-01-12 3 views
0

Windowsマシン上の既存のログオンセッションを照会するコードを書いています。ネットワークログオンの場合、ログオンが行われたマシンのIPアドレスおよび/または名前を検索しようとしています。Windowsネットワークログオンセッションを取得するIP

これまでのところ、LsaEnumerateLogonSessions/LsaGetLogonSessionDataを使用してログオンセッションの一覧を取得しましたが、返されたSECURITY_LOGON_SESSION_DATA構造にはIPがありません。

ネットワークログオンセッションのIPアドレス/マシン名を取得するにはどうすればよいですか?

DateTime systime = new DateTime(1601, 1, 1, 0, 0, 0, 0); 

UInt64 sessionCount; 
IntPtr luidPtr; 
LsaEnumerateLogonSessions(out sessionCount, out luidPtr); 
IntPtr iter = luidPtr;        
for (ulong i = 0; i < sessionCount; i++)    
{ 
    IntPtr sessionData; 

    LsaGetLogonSessionData(iter, out sessionData); 
    var data = 
     (SECURITY_LOGON_SESSION_DATA)Marshal.PtrToStructure(sessionData, typeof(SECURITY_LOGON_SESSION_DATA)); 

    if (data.PSiD != IntPtr.Zero) 
    { 
     System.Security.Principal.SecurityIdentifier sid = new System.Security.Principal.SecurityIdentifier(data.PSiD); 

     SECURITY_LOGON_TYPE secType = (SECURITY_LOGON_TYPE)data.LogonType; 
     DateTime logonTime = systime.AddTicks((long)data.LoginTime); 

     string authpackage = Marshal.PtrToStringUni(data.AuthenticationPackage.buffer); 
     string domain = Marshal.PtrToStringUni(data.LoginDomain.buffer); 
     string username = Marshal.PtrToStringUni(data.Username.buffer); 
     string dnsDomainName = Marshal.PtrToStringUni(data.DnsDomainName.buffer); 
     string logonServer = Marshal.PtrToStringUni(data.LogonServer.buffer); 
     string upn = Marshal.PtrToStringUni(data.Upn.buffer); 

     Console.WriteLine("SID "+sid+" Type: " + secType + "\t" + domain + "\\" + username + "\tTime: " + logonTime); 

     if (secType == SECURITY_LOGON_TYPE.Network) 
     { 
      // TODO get IP/machine name 
     } 
    } 
    iter = (IntPtr)((int)iter + Marshal.SizeOf(typeof(LUID))); 
    LsaFreeReturnBuffer(sessionData); 
} 
LsaFreeReturnBuffer(luidPtr); 

答えて

1

SECURITY_LOGON_SESSION_DATADnsDomainNameフィールドがあります。ログオンセッションの所有者のためのDNS名を含む

LSA_UNICODE_STRING構造を。あなたはIPアドレスが必要な場合

gethostbyname()またはgetaddrinfo()を使用してその名前のDNSの逆引きを行います。

また、SECURITY_LOGON_SESSION_DATASessionフィールドを持ちます。 0でない場合はWTSQuerySessionInformation()に渡し、WTSInfoClassパラメータをWTSClientAddressに、ppBufferパラメータをWTS_CLIENT_ADDRESS*ポインタ変数に設定します。

関連する問題