开发者

Using WTSQuerySessionInformation in Visual C#

I am trying to use the function WTSQuerySessionInformation in a Visual C# project, including the following l开发者_JAVA技巧ines in the class definition:

[DllImport("Wtsapi32.dll")]
        static extern bool WTSQuerySessionInformation(
            System.IntPtr hServer, int sessionId, WTS_INFO_CLASS wtsInfoClass, out System.IntPtr ppBuffer, out uint pBytesReturned); private Boolean remote_connected = false;

I get an error saying:

Error: he type or namespace name 'WTS_INFO_CLASS' could not be found (are you missing a using directive or an assembly reference?)

Can anyone please let me know what needs to be done in the project to fix this error?


You are nearly there:

enum WTS_INFO_CLASS
{
     WTSInitialProgram,
     WTSApplicationName,
     WTSWorkingDirectory,
     WTSOEMId,
     WTSSessionId,
     WTSUserName,
     WTSWinStationName,
     WTSDomainName,
     WTSConnectState,
     WTSClientBuildNumber,
     WTSClientName,
     WTSClientDirectory,
     WTSClientProductId,
     WTSClientHardwareId,
     WTSClientAddress,
     WTSClientDisplay,
     WTSClientProtocolType,
     WTSIdleTime,
     WTSLogonTime,
     WTSIncomingBytes,
     WTSOutgoingBytes,
     WTSIncomingFrames,
     WTSOutgoingFrames,
     WTSClientInfo,
     WTSSessionInfo
};

[DllImport("Wtsapi32.dll", SetLastError=true)]
static extern bool WTSQuerySessionInformation(
    IntPtr hServer, 
    uint sessionId, 
    WTS_INFO_CLASS wtsInfoClass, 
    out IntPtr ppBuffer, 
    out uint pBytesReturned
);

Note that sessionId is a DWORD which is an untyped 32 bit integer.


Instead of trying to fix this and get the P/Invoke correct, I would recommend using Cassia. It has this method available for use and handles the details for you.


Try the below code it will retrieve the current session id connected .

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace Sesid
{
class ServiceID
{

    #region Constants
    public const int WTS_CURRENT_SESSION = -1;
    #endregion

    #region Dll Imports
    [DllImport("wtsapi32.dll")]
    static extern int WTSEnumerateSessions(
        IntPtr pServer,
        [MarshalAs(UnmanagedType.U4)] int iReserved,
        [MarshalAs(UnmanagedType.U4)] int iVersion,
        ref IntPtr pSessionInfo,
        [MarshalAs(UnmanagedType.U4)] ref int iCount);

    [DllImport("Wtsapi32.dll")]
    public static extern bool WTSQuerySessionInformation(
        System.IntPtr pServer,
        int iSessionID,
        WTS_INFO_CLASS oInfoClass,
        out System.IntPtr pBuffer,
        out uint iBytesReturned);

    [DllImport("wtsapi32.dll")]
    static extern void WTSFreeMemory(
        IntPtr pMemory);
    #endregion

    #region Structures
    //Structure for Terminal Service Client IP Address
    [StructLayout(LayoutKind.Sequential)]
    private struct WTS_CLIENT_ADDRESS
    {
        public int iAddressFamily;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
        public byte[] bAddress;
    }

    //Structure for Terminal Service Session Info
    [StructLayout(LayoutKind.Sequential)]
    private struct WTS_SESSION_INFO
    {
        public int iSessionID;
        [MarshalAs(UnmanagedType.LPStr)]
        public string sWinsWorkstationName;
        public WTS_CONNECTSTATE_CLASS oState;
    }

    //Structure for Terminal Service Session Client Display
    [StructLayout(LayoutKind.Sequential)]
    private struct WTS_CLIENT_DISPLAY
    {
        public int iHorizontalResolution;
        public int iVerticalResolution;
        //1 = The display uses 4 bits per pixel for a maximum of 16 colors.
        //2 = The display uses 8 bits per pixel for a maximum of 256 colors.
        //4 = The display uses 16 bits per pixel for a maximum of 2^16 colors.
        //8 = The display uses 3-byte RGB values for a maximum of 2^24 colors.
        //16 = The display uses 15 bits per pixel for a maximum of 2^15 colors.
        public int iColorDepth;
    }
    #endregion

    #region Enumurations
    public enum WTS_CONNECTSTATE_CLASS
    {
        WTSActive,
        WTSConnected,
        WTSConnectQuery,
        WTSShadow,
        WTSDisconnected,
        WTSIdle,
        WTSListen,
        WTSReset,
        WTSDown,
        WTSInit
    }

    public enum WTS_INFO_CLASS
    {
        WTSInitialProgram,
        WTSApplicationName,
        WTSWorkingDirectory,
        WTSOEMId,
        WTSSessionId,
        WTSUserName,
        WTSWinStationName,
        WTSDomainName,
        WTSConnectState,
        WTSClientBuildNumber,
        WTSClientName,
        WTSClientDirectory,
        WTSClientProductId,
        WTSClientHardwareId,
        WTSClientAddress,
        WTSClientDisplay,
        WTSClientProtocolType,
        WTSIdleTime,
        WTSLogonTime,
        WTSIncomingBytes,
        WTSOutgoingBytes,
        WTSIncomingFrames,
        WTSOutgoingFrames,
        WTSClientInfo,
        WTSSessionInfo,
        WTSConfigInfo,
        WTSValidationInfo,
        WTSSessionAddressV4,
        WTSIsRemoteSession
    }
    #endregion

    public static int sessid()
    {              
        System.IntPtr buffer = IntPtr.Zero;
        uint bytesReturned;
        int sessionID;
        bool sessionInfo = WTSQuerySessionInformation(System.IntPtr.Zero, WTS_CURRENT_SESSION, WTS_INFO_CLASS.WTSSessionId, out buffer, out bytesReturned);
        sessionID = Marshal.ReadInt32(buffer);
        return sessionID;
    }

}
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜