diff --git a/agents/meshcore.js b/agents/meshcore.js index ca0f2d46..ffdf2b72 100644 --- a/agents/meshcore.js +++ b/agents/meshcore.js @@ -1304,6 +1304,41 @@ function handleServerCommand(data) { } break; } + case 'service': { + // return information about the service + try { + var service = require('service-manager').manager.getService(data.serviceName); + if (service != null) { + var reply = { + name: (service.name ? service.name : ''), + status: (service.status ? service.status : ''), + startType: (service.startType ? service.startType : ''), + failureActions: (service.failureActions ? service.failureActions : ''), + installedDate: (service.installedDate ? service.installedDate : ''), + installedBy: (service.installedBy ? service.installedBy : '') , + user: (service.user ? service.user : '') + }; + if(reply.installedBy.indexOf('S-1-5') != -1) { + var cmd = "(Get-WmiObject -Class win32_userAccount -Filter \"SID='"+service.installedBy+"'\").Caption"; + var replydata = ""; + var pws = require('child_process').execFile(process.env['windir'] + '\\System32\\WindowsPowerShell\\v1.0\\powershell.exe', ['powershell', '-noprofile', '-nologo', '-command', '-'], {}); + pws.descriptorMetadata = 'UserSIDPowerShell'; + pws.stdout.on('data', function (c) { replydata += c.toString(); }); + pws.stderr.on('data', function (c) { replydata += c.toString(); }); + pws.stdin.write(cmd + '\r\nexit\r\n'); + pws.on('exit', function () { + if (replydata != "") reply.installedBy = replydata; + mesh.SendCommand({ action: 'msg', type: 'service', value: JSON.stringify(reply), sessionid: data.sessionid }); + delete pws; + }); + } else { + mesh.SendCommand({ action: 'msg', type: 'service', value: JSON.stringify(reply), sessionid: data.sessionid }); + } + } + } catch (ex) { + mesh.SendCommand({ action: 'msg', type: 'service', error: ex, sessionid: data.sessionid }) + } + } case 'services': { // Return the list of installed services var services = null; diff --git a/views/default.handlebars b/views/default.handlebars index c0db5b7c..fa1be68c 100644 --- a/views/default.handlebars +++ b/views/default.handlebars @@ -2616,6 +2616,8 @@ showDeskToolsProcesses(message); } else if (message.type === 'services') { showDeskToolsServices(message); + } else if (message.type === 'service') { + showServiceDetailsDialog(message); } else if ((message.type === 'getclip') && (currentNode != null) && (currentNode._id == message.nodeid)) { if ((message.tag == 1) && (xxdialogTag === 'clipboard')) { Q('d2clipText').value = message.data; // Put remote clipboard data into dialog box @@ -10154,7 +10156,7 @@ } function showProcessDetails(pid) { if (xxdialogMode) return; - setDialogMode(2, format("Process Details, #{0}", pid), 1, null, "Requesting details...", 'ps|' + currentNode._id + '|' + pid); + setDialogMode(2, format("Process Details, #{0}", pid), 1, null, "Requesting Process Details...", 'ps|' + currentNode._id + '|' + pid); meshserver.send({ action: 'msg', type: 'psinfo', nodeid: currentNode._id, pid: pid }); } function showDeskToolsServices(message) { @@ -10182,7 +10184,7 @@ var c = s[i].d, ss = s[i].p; if (ss == 'Stopped') { ss = "Stopped"; } // TODO: Add all other states for translation else if (ss == 'Running') { ss = "Running"; } - x += '
'; + x += '
'; x += '
' + EscapeHtml(ss) + '
'; x += '
' + EscapeHtml(c) + '
'; x += '
'; @@ -10192,30 +10194,58 @@ } } - function showServiceDetailsDialog(index) { - if (xxdialogMode) return; + function showServiceDetailsDialog(data) { + if (xxdialogMode && (xxdialogTag.indexOf('service_') != -1)) { + var index = xxdialogTag.replace('service_','') + // var org_service = deskTools.services[index]; + var service = data.value ? JSON.parse(data.value) : deskTools.services[index]; + if(data.value) service.displayName = deskTools.services[index].displayName; + if (service != null) { + var x = ''; + if (service.name) { x += addHtmlValue("Name", service.name); } + if (service.displayName) { x += addHtmlValue("Display name", service.displayName); } + if (service.status) { + var ss = capitalizeFirstLetter(service.status.state.toLowerCase()); + if (ss == 'Stopped') { ss = "Stopped"; } // TODO: Add all other states for translation + else if (ss == 'Running') { ss = "Running"; } + if (service.status.state) { x += addHtmlValue("State", ss); } + if (service.status.pid) { x += addHtmlValue("PID", service.status.pid); } + var serviceTypes = []; + if (service.status.isFileSystemDriver === true) { serviceTypes.push("FileSystemDriver"); } + if (service.status.isInteractive === true) { serviceTypes.push("Interactive"); } + if (service.status.isKernelDriver === true) { serviceTypes.push("KernelDriver"); } + if (service.status.isOwnProcess === true) { serviceTypes.push("OwnProcess"); } + if (service.status.isSharedProcess === true) { serviceTypes.push("SharedProcess"); } + if (serviceTypes.length > 0) { x += addHtmlValue("Type", serviceTypes.join(', ')); } + } + if (service.startType) { x += addHtmlValue("Start Type", service.startType); } + if (service.user) { x += addHtmlValue("User", service.user); } + if (service.installedBy) { x += addHtmlValue("Installed By", service.installedBy); } + if (service.installedDate) { x += addHtmlValue("Installed Date", printDateTime(new Date(service.installedDate))); } + if (service.failureActions) { + if (service.failureActions.resetPeriod) { + var abc = ((service.failureActions.resetPeriod < 86400 ? 0 : service.failureActions.resetPeriod) / (24 * 60 * 60)); + x += addHtmlValue("Restart Fail Count After ", abc + ' Day' + (abc != 1 ? 's': '')); } + if (service.failureActions.actions) { + if (service.failureActions.actions[0]) { x += addHtmlValue("First Failure",service.failureActions.actions[0].type); } + if (service.failureActions.actions[1]) { x += addHtmlValue("Second Failure",service.failureActions.actions[1].type); } + if (service.failureActions.actions[2]) { x += addHtmlValue("Subsequent Failures",service.failureActions.actions[2].type); } + } + } + x += '
'; + setDialogMode(2, "Service Details", 8, null, x, "service_"+index); + } + } + } + + function showServiceWaitDialog(index) { + if (xxdialogMode) return false; var service = deskTools.services[index]; if (service != null) { - var x = ''; - if (service.name) { x += addHtmlValue("Name", service.name); } - if (service.displayName) { x += addHtmlValue("Display name", service.displayName); } - if (service.status) { - var ss = capitalizeFirstLetter(service.status.state.toLowerCase()); - if (ss == 'Stopped') { ss = "Stopped"; } // TODO: Add all other states for translation - else if (ss == 'Running') { ss = "Running"; } - if (service.status.state) { x += addHtmlValue("State", ss); } - if (service.status.pid) { x += addHtmlValue("PID", service.status.pid); } - var serviceTypes = []; - if (service.status.isFileSystemDriver === true) { serviceTypes.push("FileSystemDriver"); } - if (service.status.isInteractive === true) { serviceTypes.push("Interactive"); } - if (service.status.isKernelDriver === true) { serviceTypes.push("KernelDriver"); } - if (service.status.isOwnProcess === true) { serviceTypes.push("OwnProcess"); } - if (service.status.isSharedProcess === true) { serviceTypes.push("SharedProcess"); } - if (serviceTypes.length > 0) { x += addHtmlValue("Type", serviceTypes.join(', ')); } - } - x += '
'; - setDialogMode(2, "Service Details", 8, null, x, name); + meshserver.send({ action: 'msg', type: 'service', nodeid: currentNode._id, serviceName: service.name }); + setDialogMode(2, "Service Details", 1, null, "Requesting Service Details...", "service_" + index); } + return false; } function showServiceDetailsDialogEx(action, index) {