show UPN on mouseover of Active User #7409

Signed-off-by: si458 <simonsmith5521@gmail.com>

si458 committed Dec 27, 2025 at 18:34 UTC 3c4d0b431afe4bd4305b76a6faa9bb5f6b581045
3 files changed +69 -8
agents/meshcore.js
+52 -3
@@ -681,11 +681,25 @@ function onUserSessionChanged(user, locked) {
681
682 var u = [], a = users.Active;
683 if(meshCoreObj.lusers == null) { meshCoreObj.lusers = []; }
684 + if(meshCoreObj.upnusers == null) { meshCoreObj.upnusers = []; }
685 + var ret = require('win-wmi').query('ROOT\\CIMV2', 'SELECT * FROM Win32_ComputerSystem', ['Domain','PartOfDomain'])[0];
686 for (var i = 0; i < a.length; i++) {
687 var un = a[i].Domain ? (a[i].Domain + '\\' + a[i].Username) : (a[i].Username);
688 if (user && locked && (JSON.stringify(a[i]) === JSON.stringify(user))) { if (meshCoreObj.lusers.indexOf(un) == -1) { meshCoreObj.lusers.push(un); } }
689 else if (user && !locked && (JSON.stringify(a[i]) === JSON.stringify(user))) { meshCoreObj.lusers.splice(meshCoreObj.lusers.indexOf(un), 1); }
690 if (u.indexOf(un) == -1) { u.push(un); } // Only push users in the list once.
691 + if (a[i].Domain != null && a[i].Domain == 'AzureAD'){
692 + // AzureAD to-do
693 + // var userGUID = require('win-registry').QueryKey(require('win-registry').HKEY.LocalMachine, 'SYSTEM\\CurrentControlSet\\Control\\CloudDomainJoin\\JoinInfo');
694 + // if (userGUID != null){
695 + // var user = require('win-registry').QueryKey(require('win-registry').HKEY.LocalMachine, 'SYSTEM\\CurrentControlSet\\Control\\CloudDomainJoin\\JoinInfo\\' + userGUID.subkeys[0], 'UserEmail');
696 + // if (user != null) u[i].UPN = user;
697 + // }
698 + } else if (a[i].Domain != null) {
699 + if (ret != null && ret.PartOfDomain === true) {
700 + meshCoreObj.upnusers.push(a[i].Username + '@' + ret.Domain);
701 + }
702 + }
703 }
704 meshCoreObj.lusers = meshCoreObj.lusers;
705 meshCoreObj.users = u;
@@ -4051,7 +4065,10 @@ function processConsoleCommand(cmd, args, rights, sessionid) {
4065 var response = null;
4066 switch (cmd) {
4067 case 'help': { // Displays available commands
4054 - var fin = '', f = '', availcommands = 'domain,translations,agentupdate,errorlog,msh,timerinfo,coreinfo,coreinfoupdate,coredump,service,fdsnapshot,fdcount,startupoptions,alert,agentsize,versions,help,info,osinfo,args,print,type,dbkeys,dbget,dbset,dbcompact,eval,parseuri,httpget,wslist,plugin,wsconnect,wssend,wsclose,notify,ls,ps,kill,netinfo,location,power,wakeonlan,setdebug,smbios,rawsmbios,toast,lock,users,openurl,getscript,getclip,setclip,log,cpuinfo,sysinfo,apf,scanwifi,wallpaper,agentmsg,task,uninstallagent,display,openfile';
4068 + var fin = '', f = '', availcommands = 'domain,translations,agentupdate,errorlog,msh,timerinfo,coreinfo,coreinfoupdate,coredump,service,fdsnapshot,fdcount,startupoptions,';
4069 + availcommands += 'alert,agentsize,versions,help,info,osinfo,args,print,type,dbkeys,dbget,dbset,dbcompact,eval,parseuri,httpget,wslist,plugin,wsconnect,wssend,wsclose,notify,';
4070 + availcommands += 'ls,ps,kill,netinfo,location,power,wakeonlan,setdebug,smbios,rawsmbios,toast,lock,users,openurl,getscript,getclip,setclip,log,cpuinfo,sysinfo';
4071 + availcommands += 'apf,scanwifi,wallpaper,agentmsg,task,uninstallagent,display,openfile';
4072 if (require('os').dns != null) { availcommands += ',dnsinfo'; }
4073 try { require('linux-dhcp'); availcommands += ',dhcp'; } catch (ex) { }
4074 if (process.platform == 'win32') {
@@ -4757,8 +4774,23 @@ function processConsoleCommand(cmd, args, rights, sessionid) {
4774 p.sessionid = sessionid;
4775 p.then(function (u) {
4776 var v = [];
4777 + var ret = require('win-wmi').query('ROOT\\CIMV2', 'SELECT * FROM Win32_ComputerSystem', ['Domain','PartOfDomain'])[0];
4778 for (var i in u) {
4761 - if (u[i].State == 'Active') { v.push({ tsid: i, type: u[i].StationName, user: u[i].Username, domain: u[i].Domain }); }
4779 + if (u[i].State == 'Active') {
4780 + if (u[i].Domain != null && u[i].Domain == 'AzureAD'){
4781 + // AzureAD to-do
4782 + // var userGUID = require('win-registry').QueryKey(require('win-registry').HKEY.LocalMachine, 'SYSTEM\\CurrentControlSet\\Control\\CloudDomainJoin\\JoinInfo');
4783 + // if (userGUID != null){
4784 + // var user = require('win-registry').QueryKey(require('win-registry').HKEY.LocalMachine, 'SYSTEM\\CurrentControlSet\\Control\\CloudDomainJoin\\JoinInfo\\' + userGUID.subkeys[0], 'UserEmail');
4785 + // if (user != null) u[i].UPN = user;
4786 + // }
4787 + } else if (u[i].Domain != null) {
4788 + if (ret != null && ret.PartOfDomain === true) {
4789 + u[i].UPN = u[i].Username + '@' + ret.Domain;
4790 + }
4791 + }
4792 + v.push({ tsid: i, type: u[i].StationName, user: u[i].Username, domain: u[i].Domain, upn: u[i].UPN });
4793 + }
4794 }
4795 sendConsoleText(JSON.stringify(v, null, 1), this.sessionid);
4796 });
@@ -4969,7 +5001,24 @@ function processConsoleCommand(cmd, args, rights, sessionid) {
5001 }
5002 case 'users': {
5003 if (meshCoreObj.users == null) { response = 'Active users are unknown.'; } else { response = 'Active Users: ' + meshCoreObj.users.join(', ') + '.'; }
4972 - require('user-sessions').enumerateUsers().then(function (u) { for (var i in u) { sendConsoleText(u[i]); } });
5004 + require('user-sessions').enumerateUsers().then(function (u) {
5005 + var ret = require('win-wmi').query('ROOT\\CIMV2', 'SELECT * FROM Win32_ComputerSystem', ['Domain','PartOfDomain'])[0];
5006 + for (var i in u) {
5007 + if (u[i].Domain != null && u[i].Domain == 'AzureAD'){
5008 + // AzureAD to-do
5009 + // var userGUID = require('win-registry').QueryKey(require('win-registry').HKEY.LocalMachine, 'SYSTEM\\CurrentControlSet\\Control\\CloudDomainJoin\\JoinInfo');
5010 + // if (userGUID != null){
5011 + // var user = require('win-registry').QueryKey(require('win-registry').HKEY.LocalMachine, 'SYSTEM\\CurrentControlSet\\Control\\CloudDomainJoin\\JoinInfo\\' + userGUID.subkeys[0], 'UserEmail');
5012 + // if (user != null) u[i].UPN = user;
5013 + // }
5014 + } else if (u[i].Domain != null) {
5015 + if (ret != null && ret.PartOfDomain === true) {
5016 + u[i].UPN = u[i].Username + '@' + ret.Domain;
5017 + }
5018 + }
5019 + sendConsoleText(u[i]);
5020 + }
5021 + });
5022 break;
5023 }
5024 case 'kvmusers':
views/default.handlebars
+8 -2
@@ -3554,6 +3554,7 @@
3554 node.name = message.event.node.name;
3555 node.rname = message.event.node.rname;
3556 node.lusers = message.event.node.lusers;
3557 + node.upnusers = message.event.node.upnusers;
3558 node.users = message.event.node.users;
3559 node.host = message.event.node.host;
3560 node.desc = message.event.node.desc;
@@ -7716,8 +7717,13 @@
7717
7718 // Active Users
7719 if (node.users && node.users.length > 0) {
7719 - var u = node.users.map(function(user) {
7720 - return addKeyLinkConditional(EscapeHtml(user), "Locked", (node.lusers && node.lusers.indexOf(user) >= 0));
7720 + var u = node.users.map(function(user, index) {
7721 + var label = (node.upnusers[index] != null) ? EscapeHtml(node.upnusers[index]) : null;
7722 + var locked = (node.lusers && node.lusers.indexOf(user) >= 0);
7723 + var escapedUser = EscapeHtml(user);
7724 + if (locked) { return addKeyLinkConditional(escapedUser, (label ? (label + ' - ' + "Locked") : "Locked"), true); }
7725 + else if (label) { return '<span style=cursor:default title=\''+ label + '\'>' + escapedUser + '</span>'; }
7726 + else { return escapedUser; }
7727 }).join(', ');
7728 x += addDeviceAttribute((node.users.length > 1 ? "Active Users" : "Active User"), u);
7729 }
views/default3.handlebars
+9 -3
@@ -4234,6 +4234,7 @@
4234 node.name = message.event.node.name;
4235 node.rname = message.event.node.rname;
4236 node.lusers = message.event.node.lusers;
4237 + node.upnusers = message.event.node.upnusers;
4238 node.users = message.event.node.users;
4239 node.host = message.event.node.host;
4240 node.desc = message.event.node.desc;
@@ -8603,8 +8604,13 @@
8604
8605 // Active Users
8606 if (node.users && node.users.length > 0) {
8606 - var u = node.users.map(function(user) {
8607 - return addKeyLinkConditional(EscapeHtml(user), "Locked", (node.lusers && node.lusers.indexOf(user) >= 0));
8607 + var u = node.users.map(function(user, index) {
8608 + var label = (node.upnusers[index] != null) ? EscapeHtml(node.upnusers[index]) : null;
8609 + var locked = (node.lusers && node.lusers.indexOf(user) >= 0);
8610 + var escapedUser = EscapeHtml(user);
8611 + if (locked) { return addKeyLinkConditional(escapedUser, (label ? (label + ' - ' + "Locked") : "Locked"), true); }
8612 + else if (label) { return '<span style=cursor:default title=\''+ label + '\'>' + escapedUser + '</span>'; }
8613 + else { return escapedUser; }
8614 }).join(', ');
8615 x += addDeviceAttribute((node.users.length > 1 ? "Active Users" : "Active User"), u);
8616 }
@@ -21137,7 +21143,7 @@
21143 function printFlexDateTime(d) { if (printDate(new Date()) == printDate(d)) { return printTime(d); } else { return printDateTime(d); } }
21144
21145 function addDetailItem(title, value, state, classNames = []) {
21140 - return `<div class="row mb-1"><div class="${classNames[0] || 'col-md-8'}"> ${nobreak(title)} </div><div class="${classNames[1] || 'col-md-4 text-end'}"> ${value} </div></div>`;
21146 + return `<div class="row mb-1"><div class="${classNames[0] || 'col-md-7'}"> ${nobreak(title)} </div><div class="${classNames[1] || 'col-md-5 text-end'}"> ${value} </div></div>`;
21147 }
21148
21149 function format(format) { var args = Array.prototype.slice.call(arguments, 1); return format.replace(/{(\d+)}/g, function (match, number) { return typeof args[number] != 'undefined' ? args[number] : match; }); };