繁体   English   中英

获取Windows网络登录会话IP

[英]Get windows network logon session 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);

SECURITY_LOGON_SESSION_DATA具有DnsDomainName字段:

一个LSA_UNICODE_STRING结构,其中包含登录会话所有者的DNS名称。

如果需要IP地址,请使用gethostbyname()getaddrinfo()在该名称上进行反向DNS查找。

或者, SECURITY_LOGON_SESSION_DATA也具有“ Session字段。 如果不为0,则可以将其传递给WTSQuerySessionInformation() ,将WTSInfoClass参数设置为WTSClientAddress ,并将ppBuffer参数设置为WTS_CLIENT_ADDRESS*指针变量的地址。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM