function UserSessions() { this._ObjectID = 'UserSessions'; if (process.platform == 'win32') { this._marshal = require('_GenericMarshal'); this._kernel32 = this._marshal.CreateNativeProxy('Kernel32.dll'); this._kernel32.CreateMethod('GetLastError'); this._wts = this._marshal.CreateNativeProxy('Wtsapi32.dll'); this._wts.CreateMethod('WTSEnumerateSessionsA'); this._wts.CreateMethod('WTSQuerySessionInformationA'); this._wts.CreateMethod('WTSFreeMemory'); this.SessionStates = ['Active', 'Connected', 'ConnectQuery', 'Shadow', 'Disconnected', 'Idle', 'Listening', 'Reset', 'Down', 'Init']; this.InfoClass = { 'WTSInitialProgram': 0, 'WTSApplicationName': 1, 'WTSWorkingDirectory': 2, 'WTSOEMId': 3, 'WTSSessionId': 4, 'WTSUserName': 5, 'WTSWinStationName': 6, 'WTSDomainName': 7, 'WTSConnectState': 8, 'WTSClientBuildNumber': 9, 'WTSClientName': 10, 'WTSClientDirectory': 11, 'WTSClientProductId': 12, 'WTSClientHardwareId': 13, 'WTSClientAddress': 14, 'WTSClientDisplay': 15, 'WTSClientProtocolType': 16, 'WTSIdleTime': 17, 'WTSLogonTime': 18, 'WTSIncomingBytes': 19, 'WTSOutgoingBytes': 20, 'WTSIncomingFrames': 21, 'WTSOutgoingFrames': 22, 'WTSClientInfo': 23, 'WTSSessionInfo': 24, 'WTSSessionInfoEx': 25, 'WTSConfigInfo': 26, 'WTSValidationInfo': 27, 'WTSSessionAddressV4': 28, 'WTSIsRemoteSession': 29 }; this.getSessionAttribute = function getSessionAttribute(sessionId, attr) { var buffer = this._marshal.CreatePointer(); var bytesReturned = this._marshal.CreateVariable(4); if (this._wts.WTSQuerySessionInformationA(0, sessionId, attr, buffer, bytesReturned).Val == 0) { throw ('Error calling WTSQuerySessionInformation: ' + this._kernel32.GetLastError.Val); } var retVal = buffer.Deref().String; this._wts.WTSFreeMemory(buffer.Deref()); return (retVal); }; this.Current = function Current() { var retVal = {}; var pinfo = this._marshal.CreatePointer(); var count = this._marshal.CreateVariable(4); if (this._wts.WTSEnumerateSessionsA(0, 0, 1, pinfo, count).Val == 0) { throw ('Error calling WTSEnumerateSessionsA: ' + this._kernel32.GetLastError().Val); } for (var i = 0; i < count.toBuffer().readUInt32LE() ; ++i) { var info = pinfo.Deref().Deref(i * (this._marshal.PointerSize == 4 ? 12 : 24), this._marshal.PointerSize == 4 ? 12 : 24); var j = { SessionId: info.toBuffer().readUInt32LE() }; j.StationName = info.Deref(this._marshal.PointerSize == 4 ? 4 : 8, this._marshal.PointerSize).Deref().String; j.State = this.SessionStates[info.Deref(this._marshal.PointerSize == 4 ? 8 : 16, 4).toBuffer().readUInt32LE()]; if (j.State == 'Active') { j.Username = this.getSessionAttribute(j.SessionId, this.InfoClass.WTSUserName); j.Domain = this.getSessionAttribute(j.SessionId, this.InfoClass.WTSDomainName); } retVal[j.SessionId] = j; } this._wts.WTSFreeMemory(pinfo.Deref()); return (retVal); }; } else { this.Current = function Current() { return ({}); } } } module.exports = new UserSessions();