mirror of
				https://github.com/Ylianst/MeshCentral.git
				synced 2025-03-09 15:40:18 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			236 lines
		
	
	
		
			No EOL
		
	
	
		
			8.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			236 lines
		
	
	
		
			No EOL
		
	
	
		
			8.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/*
 | 
						|
Copyright 2019-2020 Intel Corporation
 | 
						|
 | 
						|
Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
you may not use this file except in compliance with the License.
 | 
						|
You may obtain a copy of the License at
 | 
						|
 | 
						|
    http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
 | 
						|
Unless required by applicable law or agreed to in writing, software
 | 
						|
distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
See the License for the specific language governing permissions and
 | 
						|
limitations under the License.
 | 
						|
*/
 | 
						|
 | 
						|
var promise = require('promise');
 | 
						|
 | 
						|
function qfe()
 | 
						|
{
 | 
						|
    var child = require('child_process').execFile(process.env['windir'] + '\\System32\\wbem\\wmic.exe', ['wmic', 'qfe', 'list', 'full', '/FORMAT:CSV']);
 | 
						|
    child.stdout.str = ''; child.stdout.on('data', function (c) { this.str += c.toString(); });
 | 
						|
    child.stderr.str = ''; child.stderr.on('data', function (c) { this.str += c.toString(); });
 | 
						|
    child.waitExit();
 | 
						|
 | 
						|
    var lines = child.stdout.str.trim().split('\r\n');
 | 
						|
    var keys = lines[0].split(',');
 | 
						|
    var i, key;
 | 
						|
    var tokens;
 | 
						|
    var result = [];
 | 
						|
 | 
						|
    for (i = 1; i < lines.length; ++i)
 | 
						|
    {
 | 
						|
        var obj = {};
 | 
						|
        tokens = lines[i].split(',');
 | 
						|
        for (key = 0; key < keys.length; ++key)
 | 
						|
        {
 | 
						|
            if (tokens[key]) { obj[keys[key]] = tokens[key]; }
 | 
						|
        }
 | 
						|
        result.push(obj);
 | 
						|
    }
 | 
						|
    return (result);
 | 
						|
}
 | 
						|
function av()
 | 
						|
{
 | 
						|
    var child = require('child_process').execFile(process.env['windir'] + '\\System32\\WindowsPowerShell\\v1.0\\powershell.exe', ['powershell', '-noprofile', '-nologo', '-command', '-'], {});
 | 
						|
    if (child == null) { return ([]); }
 | 
						|
 | 
						|
    child.descriptorMetadata = 'process-manager';
 | 
						|
    child.stdout.str = ''; child.stdout.on('data', function (c) { this.str += c.toString(); });
 | 
						|
    child.stderr.str = ''; child.stderr.on('data', function (c) { this.str += c.toString(); });
 | 
						|
 | 
						|
    child.stdin.write('[reflection.Assembly]::LoadWithPartialName("system.core")\r\n');
 | 
						|
    child.stdin.write('Get-WmiObject -Namespace "root/SecurityCenter2" -Class AntiVirusProduct | ');
 | 
						|
    child.stdin.write('ForEach-Object -Process { ');
 | 
						|
    child.stdin.write('$Bytes = [System.Text.Encoding]::UTF8.GetBytes($_.displayName); ');
 | 
						|
    child.stdin.write('$EncodedText =[Convert]::ToBase64String($Bytes); ');
 | 
						|
    child.stdin.write('Write-Host ("{0},{1}" -f $_.productState,$EncodedText); }\r\n');
 | 
						|
    child.stdin.write('exit\r\n');
 | 
						|
    child.waitExit();
 | 
						|
 | 
						|
    if (child.stdout.str == '') { return ([]); }
 | 
						|
 | 
						|
    var lines = child.stdout.str.trim().split('\r\n');
 | 
						|
    var result = [];
 | 
						|
    for (i = 0; i < lines.length; ++i)
 | 
						|
    {
 | 
						|
        var keys = lines[i].split(',');
 | 
						|
        if(keys.length == 2)
 | 
						|
        {
 | 
						|
            var status = {};
 | 
						|
            status.product = Buffer.from(keys[1], 'base64').toString();
 | 
						|
            status.updated = (parseInt(keys[0]) & 0x10) == 0;
 | 
						|
            status.enabled = (parseInt(keys[0]) & 0x1000) == 0x1000;
 | 
						|
            result.push(status);
 | 
						|
        }
 | 
						|
    }
 | 
						|
    return (result);
 | 
						|
}
 | 
						|
function defrag(options)
 | 
						|
{
 | 
						|
    var ret = new promise(function (res, rej) { this._res = res; this._rej = rej; });
 | 
						|
    var path = '';
 | 
						|
 | 
						|
    switch(require('os').arch())
 | 
						|
    {
 | 
						|
        case 'x64':
 | 
						|
            if (require('_GenericMarshal').PointerSize == 4)
 | 
						|
            {
 | 
						|
                // 32 Bit App on 64 Bit Windows
 | 
						|
                ret._rej('Cannot defrag volume on 64 bit Windows from 32 bit application');
 | 
						|
                return (ret);
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                // 64 Bit App
 | 
						|
                path = process.env['windir'] + '\\System32\\defrag.exe';
 | 
						|
            }
 | 
						|
            break;
 | 
						|
        case 'ia32':
 | 
						|
            // 32 Bit App on 32 Bit Windows
 | 
						|
            path = process.env['windir'] + '\\System32\\defrag.exe';
 | 
						|
            break;
 | 
						|
        default:
 | 
						|
            ret._rej(require('os').arch() + ' not supported');
 | 
						|
            return (ret);
 | 
						|
            break;
 | 
						|
    }
 | 
						|
 | 
						|
    ret.child = require('child_process').execFile(process.env['windir'] + '\\System32\\defrag.exe', ['defrag', options.volume + ' /A']);
 | 
						|
    ret.child.promise = ret;
 | 
						|
    ret.child.promise.options = options;
 | 
						|
    ret.child.stdout.str = ''; ret.child.stdout.on('data', function (c) { this.str += c.toString(); });
 | 
						|
    ret.child.stderr.str = ''; ret.child.stderr.on('data', function (c) { this.str += c.toString(); });
 | 
						|
    ret.child.on('exit', function (code)
 | 
						|
    {
 | 
						|
        var lines = this.stdout.str.trim().split('\r\n');
 | 
						|
        var obj = { volume: this.promise.options.volume };
 | 
						|
        for (var i in lines)
 | 
						|
        {
 | 
						|
            var token = lines[i].split('=');
 | 
						|
            if(token.length == 2)
 | 
						|
            {
 | 
						|
                switch(token[0].trim().toLowerCase())
 | 
						|
                {
 | 
						|
                    case 'volume size':
 | 
						|
                        obj['size'] = token[1];
 | 
						|
                        break;
 | 
						|
                    case 'free space':
 | 
						|
                        obj['free'] = token[1];
 | 
						|
                        break;
 | 
						|
                    case 'total fragmented space':
 | 
						|
                        obj['fragmented'] = token[1];
 | 
						|
                        break;
 | 
						|
                    case 'largest free space size':
 | 
						|
                        obj['largestFragment'] = token[1];
 | 
						|
                        break;
 | 
						|
                }               
 | 
						|
            }
 | 
						|
        }
 | 
						|
        this.promise._res(obj);
 | 
						|
    });
 | 
						|
    return (ret);
 | 
						|
}
 | 
						|
function regQuery(H, Path, Key)
 | 
						|
{
 | 
						|
    try
 | 
						|
    {
 | 
						|
        return(require('win-registry').QueryKey(H, Path, Key));
 | 
						|
    }
 | 
						|
    catch(e)
 | 
						|
    {
 | 
						|
        return (null);
 | 
						|
    }
 | 
						|
}
 | 
						|
function pendingReboot()
 | 
						|
{
 | 
						|
    var tmp = null;
 | 
						|
    var ret = null;
 | 
						|
    var HKEY = require('win-registry').HKEY;
 | 
						|
    if(regQuery(HKEY.LocalMachine, 'SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Component Based Servicing', 'RebootPending') !=null)
 | 
						|
    {
 | 
						|
        ret = 'Component Based Servicing';
 | 
						|
    }
 | 
						|
    else if(regQuery(HKEY.LocalMachine, 'SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\WindowsUpdate', 'RebootRequired'))
 | 
						|
    {
 | 
						|
        ret = 'Windows Update';
 | 
						|
    }
 | 
						|
    else if ((tmp=regQuery(HKEY.LocalMachine, 'SYSTEM\\CurrentControlSet\\Control\\Session Manager', 'PendingFileRenameOperations'))!=null && tmp != 0 && tmp != '')
 | 
						|
    {
 | 
						|
        ret = 'File Rename';
 | 
						|
    }
 | 
						|
    else if (regQuery(HKEY.LocalMachine, 'SYSTEM\\CurrentControlSet\\Control\\ComputerName\\ActiveComputerName', 'ComputerName') != regQuery(HKEY.LocalMachine, 'SYSTEM\\CurrentControlSet\\Control\\ComputerName\\ComputerName', 'ComputerName'))
 | 
						|
    {
 | 
						|
        ret = 'System Rename';
 | 
						|
    }
 | 
						|
    return (ret);
 | 
						|
}
 | 
						|
 | 
						|
function installedApps()
 | 
						|
{
 | 
						|
    var promise = require('promise');
 | 
						|
    var ret = new promise(function (a, r) { this._resolve = a; this._reject = r; });
 | 
						|
    
 | 
						|
    var code = "\
 | 
						|
    var reg = require('win-registry');\
 | 
						|
    var result = [];\
 | 
						|
    var val, tmp;\
 | 
						|
    var items = reg.QueryKey(reg.HKEY.LocalMachine, 'SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Uninstall');\
 | 
						|
    for (var key in items.subkeys)\
 | 
						|
    {\
 | 
						|
        val = {};\
 | 
						|
        try\
 | 
						|
        {\
 | 
						|
            val.name = reg.QueryKey(reg.HKEY.LocalMachine, 'SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Uninstall\\\\' + items.subkeys[key], 'DisplayName');\
 | 
						|
        }\
 | 
						|
        catch(e)\
 | 
						|
        {\
 | 
						|
            continue;\
 | 
						|
        }\
 | 
						|
        try\
 | 
						|
        {\
 | 
						|
            val.version = reg.QueryKey(reg.HKEY.LocalMachine, 'SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Uninstall\\\\' + items.subkeys[key], 'DisplayVersion');\
 | 
						|
            if (val.version == '') { delete val.version; }\
 | 
						|
        }\
 | 
						|
        catch(e)\
 | 
						|
        {\
 | 
						|
        }\
 | 
						|
        try\
 | 
						|
        {\
 | 
						|
            val.location = reg.QueryKey(reg.HKEY.LocalMachine, 'SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Uninstall\\\\' + items.subkeys[key], 'InstallLocation');\
 | 
						|
            if (val.location == '') { delete val.location; }\
 | 
						|
        }\
 | 
						|
        catch(e)\
 | 
						|
        {\
 | 
						|
        }\
 | 
						|
        result.push(val);\
 | 
						|
    }\
 | 
						|
    console.log(JSON.stringify(result,'', 1));process.exit();";
 | 
						|
 | 
						|
    ret.child = require('child_process').execFile(process.execPath, [process.execPath.split('\\').pop().split('.exe')[0], '-exec "' + code + '"']);
 | 
						|
    ret.child.promise = ret;
 | 
						|
    ret.child.stdout.str = ''; ret.child.stdout.on('data', function (c) { this.str += c.toString(); });
 | 
						|
    ret.child.on('exit', function (c) { this.promise._resolve(JSON.parse(this.stdout.str.trim())); });
 | 
						|
    return (ret);
 | 
						|
}
 | 
						|
 | 
						|
if (process.platform == 'win32')
 | 
						|
{
 | 
						|
    module.exports = { qfe: qfe, av: av, defrag: defrag, pendingReboot: pendingReboot, installedApps: installedApps };
 | 
						|
}
 | 
						|
else
 | 
						|
{
 | 
						|
    var not_supported = function () { throw (process.platform + ' not supported'); };
 | 
						|
    module.exports = { qfe: not_supported, av: not_supported, defrag: not_supported, pendingReboot: not_supported, installedApps: not_supported };
 | 
						|
} |