删除客户端的bug

This commit is contained in:
snltty
2023-11-14 17:30:12 +08:00
parent fd191cc50f
commit 3e1d9aa9d4
26 changed files with 171 additions and 233 deletions

View File

@@ -157,7 +157,7 @@ namespace cmonitor.install.win
CheckRunning(); CheckRunning();
} }
string resultStr = CommandHelper.Windows(string.Empty, new string[] { string resultStr = CommandHelper.Windows(string.Empty, new string[] {
"schtasks /delete /TN \"cmonitorService\" /f", "schtasks /delete /TN \"cmonitorService\" /f",
"net stop cmonitor.sas.service", "net stop cmonitor.sas.service",
"sc delete cmonitor.sas.service", "sc delete cmonitor.sas.service",
}); });

View File

@@ -45,7 +45,7 @@ export default {
const showSelectUsername = computed(() => !!!globalData.value.username && globalData.value.connected); const showSelectUsername = computed(() => !!!globalData.value.username && globalData.value.connected);
const showPort = computed(() => globalData.value.connected == false && state.showPort); const showPort = computed(() => globalData.value.connected == false && state.showPort);
watch(() => globalData.value.updateFlag, () => { watch(() => globalData.value.updateRuleFlag, () => {
_getRules(); _getRules();
}); });
@@ -65,9 +65,7 @@ export default {
}, 100); }, 100);
subWebsocketState((state) => { subWebsocketState((state) => {
if (state) { if (state) globalData.value.updateRuleFlag = Date.now();
_getRules();
}
}); });
}); });
@@ -83,9 +81,9 @@ export default {
} }
const handleChange = (value) => { const handleChange = (value) => {
addName(value).then(() => { addName(value).then(() => {
globalData.value.updateFlag = Date.now(); globalData.value.updateRuleFlag = Date.now();
}).catch(() => { }).catch(() => {
globalData.value.updateFlag = Date.now(); globalData.value.updateRuleFlag = Date.now();
}) })
} }

View File

@@ -89,10 +89,10 @@ export default {
Desc: state.desc Desc: state.desc
} }
}).then((error) => { }).then((error) => {
globalData.value.updateFlag = Date.now();
if (!error) { if (!error) {
ElMessage.success('操作成功'); ElMessage.success('操作成功');
state.show = false; state.show = false;
globalData.value.updateRuleFlag = Date.now();
} else { } else {
ElMessage.error(`操作失败:${error}`); ElMessage.error(`操作失败:${error}`);
} }

View File

@@ -63,7 +63,6 @@ export default {
}); });
onMounted(() => { onMounted(() => {
globalData.value.updateFlag = Date.now();
if (state.items.length == 1) { if (state.items.length == 1) {
let item = state.items[0]; let item = state.items[0];
state.currentPrivate = state.privateExes.filter(c => item.DisallowRunIds.indexOf(c.ID) >= 0); state.currentPrivate = state.privateExes.filter(c => item.DisallowRunIds.indexOf(c.ID) >= 0);

View File

@@ -82,7 +82,7 @@ export default {
ElMessage.error(error); ElMessage.error(error);
} else { } else {
ElMessage.success('操作成功!'); ElMessage.success('操作成功!');
globalData.value.updateFlag = Date.now(); globalData.value.updateRuleFlag = Date.now();
} }
}).catch((e) => { }).catch((e) => {
state.loading = false; state.loading = false;
@@ -108,7 +108,7 @@ export default {
} else { } else {
ElMessage.success('操作成功!'); ElMessage.success('操作成功!');
state.showEdit = false; state.showEdit = false;
globalData.value.updateFlag = Date.now(); globalData.value.updateRuleFlag = Date.now();
} }
}).catch((e) => { }).catch((e) => {
state.loading = false; state.loading = false;

View File

@@ -38,10 +38,7 @@ export default {
} }
}); });
const globalData = injectGlobalData();; const globalData = injectGlobalData();
onMounted(() => {
globalData.value.updateFlag = Date.now();
});
const handleCancel = () => { const handleCancel = () => {
state.show = false; state.show = false;

View File

@@ -92,7 +92,7 @@ export default {
ElMessage.error(error); ElMessage.error(error);
} else { } else {
ElMessage.success('操作成功!'); ElMessage.success('操作成功!');
globalData.value.updateFlag = Date.now(); globalData.value.updateRuleFlag = Date.now();
} }
}).catch((e) => { }).catch((e) => {
state.loading = false; state.loading = false;
@@ -119,7 +119,7 @@ export default {
} else { } else {
ElMessage.success('操作成功!'); ElMessage.success('操作成功!');
state.showEdit = false; state.showEdit = false;
globalData.value.updateFlag = Date.now(); globalData.value.updateRuleFlag = Date.now();
} }
}).catch((e) => { }).catch((e) => {
state.loading = false; state.loading = false;

View File

@@ -56,13 +56,13 @@ export default {
const handleCancel = () => { const handleCancel = () => {
state.show = false; state.show = false;
globalData.value.updateFlag = Date.now(); globalData.value.updateDeviceFlag = Date.now();
} }
const handleDel = (name) => { const handleDel = (name) => {
state.loading = true; state.loading = true;
delDevice(name).then(() => { delDevice(name).then(() => {
state.loading = false; state.loading = false;
globalData.value.updateFlag = Date.now(); globalData.value.updateDeviceFlag = Date.now();
}).catch(() => { }).catch(() => {
state.loading = false; state.loading = false;
}); });
@@ -78,7 +78,7 @@ export default {
devices: _devices.map(c => c.MachineName) devices: _devices.map(c => c.MachineName)
}).then((error) => { }).then((error) => {
state.loading = false; state.loading = false;
globalData.value.updateFlag = Date.now(); globalData.value.updateDeviceFlag = Date.now();
if (error) { if (error) {
ElMessage.error(error); ElMessage.error(error);
} else { } else {
@@ -92,7 +92,7 @@ export default {
} }
onMounted(() => { onMounted(() => {
globalData.value.updateFlag = Date.now(); globalData.value.updateDeviceFlag = Date.now();
}); });
return { return {

View File

@@ -85,7 +85,7 @@ export default {
ElMessage.error(error); ElMessage.error(error);
} else { } else {
ElMessage.success('操作成功!'); ElMessage.success('操作成功!');
globalData.value.updateFlag = Date.now(); globalData.value.updateRuleFlag = Date.now();
} }
}).catch((e) => { }).catch((e) => {
state.loading = false; state.loading = false;
@@ -111,7 +111,7 @@ export default {
} else { } else {
ElMessage.success('操作成功!'); ElMessage.success('操作成功!');
state.showEdit = false; state.showEdit = false;
globalData.value.updateFlag = Date.now(); globalData.value.updateRuleFlag = Date.now();
} }
}).catch((e) => { }).catch((e) => {
state.loading = false; state.loading = false;

View File

@@ -38,10 +38,7 @@ export default {
} }
}); });
const globalData = injectGlobalData();; const globalData = injectGlobalData();
onMounted(() => {
globalData.value.updateFlag = Date.now();
});
const handleCancel = () => { const handleCancel = () => {
state.show = false; state.show = false;

View File

@@ -126,7 +126,7 @@ export default {
ElMessage.error(error); ElMessage.error(error);
} else { } else {
ElMessage.success('操作成功!'); ElMessage.success('操作成功!');
globalData.value.updateFlag = Date.now(); globalData.value.updateRuleFlag = Date.now();
} }
}).catch((e) => { }).catch((e) => {
state.loading = false; state.loading = false;
@@ -153,7 +153,7 @@ export default {
} else { } else {
ElMessage.success('操作成功!'); ElMessage.success('操作成功!');
state.showEdit = false; state.showEdit = false;
globalData.value.updateFlag = Date.now(); globalData.value.updateRuleFlag = Date.now();
} }
}).catch((e) => { }).catch((e) => {
state.loading = false; state.loading = false;

View File

@@ -85,7 +85,7 @@ export default {
ElMessage.error(error); ElMessage.error(error);
} else { } else {
ElMessage.success('操作成功!'); ElMessage.success('操作成功!');
globalData.value.updateFlag = Date.now(); globalData.value.updateRuleFlag = Date.now();
} }
}).catch((e) => { }).catch((e) => {
state.loading = false; state.loading = false;
@@ -111,7 +111,7 @@ export default {
} else { } else {
ElMessage.success('操作成功!'); ElMessage.success('操作成功!');
state.showEdit = false; state.showEdit = false;
globalData.value.updateFlag = Date.now(); globalData.value.updateRuleFlag = Date.now();
} }
}).catch((e) => { }).catch((e) => {
state.loading = false; state.loading = false;

View File

@@ -100,8 +100,8 @@ export default {
if (error) { if (error) {
ElMessage.error(error); ElMessage.error(error);
} else { } else {
globalData.value.updateFlag = Date.now();
ElMessage.success('操作成功'); ElMessage.success('操作成功');
globalData.value.updateRuleFlag = Date.now();
} }
}).catch(() => { }).catch(() => {
state.loading = false; state.loading = false;

View File

@@ -31,6 +31,9 @@ export default {
}); });
const globalData = injectGlobalData(); const globalData = injectGlobalData();
watch(() => globalData.value.updateDeviceFlag, () => {
getData();
})
const getData = () => { const getData = () => {
getList().then((res) => { getList().then((res) => {

View File

@@ -8,7 +8,8 @@ export const provideGlobalData = () => {
publicUserName: 'snltty', publicUserName: 'snltty',
usernames: {}, usernames: {},
connected: false, connected: false,
updateFlag: 0, updateRuleFlag: 0,
updateDeviceFlag: 0,
allDevices: [], allDevices: [],
devices: computed(() => { devices: computed(() => {
const user = globalData.value.usernames[globalData.value.username]; const user = globalData.value.usernames[globalData.value.username];
@@ -17,7 +18,6 @@ export const provideGlobalData = () => {
} }
return []; return [];
}), }),
latestReportNames: [],
reportNames: [] reportNames: []
}); });
provide(globalDataSymbol, globalData); provide(globalDataSymbol, globalData);

View File

@@ -49,13 +49,13 @@ namespace cmonitor
//读取参数 //读取参数
Dictionary<string, string> dic = ArgumentParser.Parse(args, out string error); Dictionary<string, string> dic = ArgumentParser.Parse(args, out string error);
//#if RELEASE #if RELEASE
//提权 //提权
if (dic.ContainsKey("elevated") == false) if (dic.ContainsKey("elevated") == false)
{ {
Win32Interop.RelaunchElevated(); Win32Interop.RelaunchElevated();
} }
//#endif #endif
//初始化配置文件 //初始化配置文件
Config config = new Config(); Config config = new Config();
InitConfig(config, dic); InitConfig(config, dic);

View File

@@ -28,6 +28,7 @@ namespace cmonitor.server.api.services
for (int i = 0; i < updateinfo.Names.Length; i++) for (int i = 0; i < updateinfo.Names.Length; i++)
{ {
bool connectionRes = (signCaching.Get(updateinfo.Names[i], out SignCacheInfo cache) && cache.Connected); bool connectionRes = (signCaching.Get(updateinfo.Names[i], out SignCacheInfo cache) && cache.Connected);
if (connectionRes == false) continue;
bool reportTimeRes = cache.GetReport(config.ReportDelay) && Interlocked.CompareExchange(ref cache.ReportFlag, 0, 1) == 1; bool reportTimeRes = cache.GetReport(config.ReportDelay) && Interlocked.CompareExchange(ref cache.ReportFlag, 0, 1) == 1;
if (connectionRes && (reportTimeRes || updateinfo.ReportType == ReportType.Full)) if (connectionRes && (reportTimeRes || updateinfo.ReportType == ReportType.Full))

View File

@@ -25,6 +25,7 @@ namespace cmonitor.server.api.services
for (int i = 0; i < report.Names.Length; i++) for (int i = 0; i < report.Names.Length; i++)
{ {
bool connectionRes = signCaching.Get(report.Names[i], out SignCacheInfo cache) && cache.Connected; bool connectionRes = signCaching.Get(report.Names[i], out SignCacheInfo cache) && cache.Connected;
if (connectionRes == false) continue;
bool reportRes = cache.GetScreen(config.ScreenDelay) && Interlocked.CompareExchange(ref cache.ScreenFlag, 0, 1) == 1; bool reportRes = cache.GetScreen(config.ScreenDelay) && Interlocked.CompareExchange(ref cache.ScreenFlag, 0, 1) == 1;
if (connectionRes && reportRes) if (connectionRes && reportRes)

View File

@@ -7,7 +7,6 @@ using System.Runtime.InteropServices;
using System.Runtime.Serialization; using System.Runtime.Serialization;
using System.Security.Principal; using System.Security.Principal;
using System.Text; using System.Text;
using System.Xml.Linq;
using static cmonitor.server.client.reports.screen.winapis.ADVAPI32; using static cmonitor.server.client.reports.screen.winapis.ADVAPI32;
using static cmonitor.server.client.reports.screen.winapiss.User32; using static cmonitor.server.client.reports.screen.winapiss.User32;
@@ -17,58 +16,6 @@ namespace cmonitor.server.client.reports.screen
{ {
private static nint _lastInputDesktop; private static nint _lastInputDesktop;
public static List<WindowsSession> GetActiveSessions()
{
var sessions = new List<WindowsSession>();
var consoleSessionId = Kernel32.WTSGetActiveConsoleSessionId();
sessions.Add(new WindowsSession()
{
Id = consoleSessionId,
Type = WindowsSessionType.Console,
Name = "Console",
Username = GetUsernameFromSessionId(consoleSessionId)
});
nint ppSessionInfo = nint.Zero;
var count = 0;
var enumSessionResult = WTSAPI32.WTSEnumerateSessions(WTSAPI32.WTS_CURRENT_SERVER_HANDLE, 0, 1, ref ppSessionInfo, ref count);
var dataSize = Marshal.SizeOf(typeof(WTSAPI32.WTS_SESSION_INFO));
var current = ppSessionInfo;
if (enumSessionResult != 0)
{
for (int i = 0; i < count; i++)
{
var wtsInfo = Marshal.PtrToStructure(current, typeof(WTSAPI32.WTS_SESSION_INFO));
if (wtsInfo is null)
{
continue;
}
var sessionInfo = (WTSAPI32.WTS_SESSION_INFO)wtsInfo;
current += dataSize;
if (sessionInfo.State == WTSAPI32.WTS_CONNECTSTATE_CLASS.WTSActive && sessionInfo.SessionID != consoleSessionId)
{
sessions.Add(new WindowsSession()
{
Id = sessionInfo.SessionID,
Name = sessionInfo.pWinStationName,
Type = WindowsSessionType.RDP,
Username = GetUsernameFromSessionId(sessionInfo.SessionID)
});
}
}
}
return sessions;
}
public static string GetCommandLine()
{
var commandLinePtr = Kernel32.GetCommandLine();
return Marshal.PtrToStringAuto(commandLinePtr) ?? string.Empty;
}
public static bool GetCurrentDesktop(out string desktopName) public static bool GetCurrentDesktop(out string desktopName)
{ {
var inputDesktop = OpenInputDesktop(); var inputDesktop = OpenInputDesktop();
@@ -89,7 +36,51 @@ namespace cmonitor.server.client.reports.screen
CloseDesktop(inputDesktop); CloseDesktop(inputDesktop);
} }
} }
public static List<WindowsSession> GetActiveSessions()
{
List<WindowsSession> sessions = new List<WindowsSession>();
uint consoleSessionId = Kernel32.WTSGetActiveConsoleSessionId();
sessions.Add(new WindowsSession()
{
Id = consoleSessionId,
Type = WindowsSessionType.Console,
Name = "Console",
Username = GetUsernameFromSessionId(consoleSessionId)
});
nint ppSessionInfo = nint.Zero;
int count = 0;
int enumSessionResult = WTSAPI32.WTSEnumerateSessions(WTSAPI32.WTS_CURRENT_SERVER_HANDLE, 0, 1, ref ppSessionInfo, ref count);
int dataSize = Marshal.SizeOf(typeof(WTSAPI32.WTS_SESSION_INFO));
nint current = ppSessionInfo;
if (enumSessionResult != 0)
{
for (int i = 0; i < count; i++)
{
object wtsInfo = Marshal.PtrToStructure(current, typeof(WTSAPI32.WTS_SESSION_INFO));
if (wtsInfo is null)
{
continue;
}
WTSAPI32.WTS_SESSION_INFO sessionInfo = (WTSAPI32.WTS_SESSION_INFO)wtsInfo;
current += dataSize;
if (sessionInfo.State == WTSAPI32.WTS_CONNECTSTATE_CLASS.WTSActive && sessionInfo.SessionID != consoleSessionId)
{
sessions.Add(new WindowsSession()
{
Id = sessionInfo.SessionID,
Name = sessionInfo.pWinStationName,
Type = WindowsSessionType.RDP,
Username = GetUsernameFromSessionId(sessionInfo.SessionID)
});
}
}
}
return sessions;
}
public static string GetUsernameFromSessionId(uint sessionId) public static string GetUsernameFromSessionId(uint sessionId)
{ {
var username = string.Empty; var username = string.Empty;
@@ -107,123 +98,6 @@ namespace cmonitor.server.client.reports.screen
{ {
return User32.OpenInputDesktop(0, true, ACCESS_MASK.GENERIC_ALL); return User32.OpenInputDesktop(0, true, ACCESS_MASK.GENERIC_ALL);
} }
public static bool CreateInteractiveSystemProcess(
string commandLine,
int targetSessionId,
bool forceConsoleSession,
string desktopName,
bool hiddenWindow,
out PROCESS_INFORMATION procInfo)
{
uint winlogonPid = 0;
var hUserTokenDup = nint.Zero;
var hPToken = nint.Zero;
var hProcess = nint.Zero;
procInfo = new PROCESS_INFORMATION();
// If not force console, find target session. If not present,
// use last active session.
var dwSessionId = Kernel32.WTSGetActiveConsoleSessionId();
if (!forceConsoleSession)
{
var activeSessions = GetActiveSessions();
if (activeSessions.Any(x => x.Id == targetSessionId))
{
dwSessionId = (uint)targetSessionId;
}
else
{
dwSessionId = activeSessions.Last().Id;
}
}
// Obtain the process ID of the winlogon process that is running within the currently active session.
var processes = Process.GetProcessesByName("winlogon");
foreach (Process p in processes)
{
if ((uint)p.SessionId == dwSessionId)
{
winlogonPid = (uint)p.Id;
}
}
// Obtain a handle to the winlogon process.
hProcess = Kernel32.OpenProcess(MAXIMUM_ALLOWED, false, winlogonPid);
// Obtain a handle to the access token of the winlogon process.
if (!OpenProcessToken(hProcess, TOKEN_DUPLICATE, ref hPToken))
{
Kernel32.CloseHandle(hProcess);
return false;
}
// Security attibute structure used in DuplicateTokenEx and CreateProcessAsUser.
var sa = new SECURITY_ATTRIBUTES();
sa.Length = Marshal.SizeOf(sa);
// Copy the access token of the winlogon process; the newly created token will be a primary token.
if (!DuplicateTokenEx(hPToken, MAXIMUM_ALLOWED, ref sa, SECURITY_IMPERSONATION_LEVEL.SecurityIdentification, TOKEN_TYPE.TokenPrimary, out hUserTokenDup))
{
Kernel32.CloseHandle(hProcess);
Kernel32.CloseHandle(hPToken);
return false;
}
// By default, CreateProcessAsUser creates a process on a non-interactive window station, meaning
// the window station has a desktop that is invisible and the process is incapable of receiving
// user input. To remedy this we set the lpDesktop parameter to indicate we want to enable user
// interaction with the new process.
var si = new STARTUPINFO();
si.cb = Marshal.SizeOf(si);
si.lpDesktop = @"winsta0\" + desktopName;
// Flags that specify the priority and creation method of the process.
uint dwCreationFlags;
if (hiddenWindow)
{
dwCreationFlags = NORMAL_PRIORITY_CLASS | CREATE_UNICODE_ENVIRONMENT | CREATE_NO_WINDOW;
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = 0;
}
else
{
dwCreationFlags = NORMAL_PRIORITY_CLASS | CREATE_UNICODE_ENVIRONMENT | CREATE_NEW_CONSOLE;
}
// Create a new process in the current user's logon session.
var result = CreateProcessAsUser(
hUserTokenDup,
null,
commandLine,
ref sa,
ref sa,
false,
dwCreationFlags,
nint.Zero,
null,
ref si,
out procInfo);
uint code = Kernel32.GetLastError();
// Invalidate the handles.
Kernel32.CloseHandle(hProcess);
Kernel32.CloseHandle(hPToken);
Kernel32.CloseHandle(hUserTokenDup);
return result;
}
public static void SetMonitorState(MonitorState state)
{
SendMessage(0xFFFF, 0x112, 0xF170, (int)state);
}
public static MessageBoxResult ShowMessageBox(nint owner, string message, string caption, MessageBoxType messageBoxType)
{
return (MessageBoxResult)MessageBox(owner, message, caption, (long)messageBoxType);
}
public static bool SwitchToInputDesktop() public static bool SwitchToInputDesktop()
{ {
try try
@@ -264,23 +138,93 @@ namespace cmonitor.server.client.reports.screen
} }
} }
public static void SetConsoleWindowVisibility(bool isVisible)
{
var handle = Kernel32.GetConsoleWindow();
if (isVisible) private static uint GetWinLogonPid(uint dwSessionId)
{
uint winlogonPid = 0;
Process[] processes = Process.GetProcessesByName("winlogon");
foreach (Process p in processes)
{ {
ShowWindow(handle, (int)SW.SW_SHOW); if ((uint)p.SessionId == dwSessionId)
{
winlogonPid = (uint)p.Id;
}
}
return winlogonPid;
}
private static uint GetDwSessionId(int targetSessionId, bool forceConsoleSession)
{
uint dwSessionId = Kernel32.WTSGetActiveConsoleSessionId();
if (forceConsoleSession == false)
{
List<WindowsSession> activeSessions = GetActiveSessions();
if (activeSessions.Any(x => x.Id == targetSessionId))
{
dwSessionId = (uint)targetSessionId;
}
else
{
dwSessionId = activeSessions.Last().Id;
}
}
return dwSessionId;
}
private static STARTUPINFO GetStartUpInfo(bool hiddenWindow, string desktopName, out uint dwCreationFlags)
{
STARTUPINFO si = new STARTUPINFO();
si.cb = Marshal.SizeOf(si);
si.lpDesktop = @"winsta0\" + desktopName;
if (hiddenWindow)
{
dwCreationFlags = NORMAL_PRIORITY_CLASS | CREATE_UNICODE_ENVIRONMENT | CREATE_NO_WINDOW;
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = 0;
} }
else else
{ {
ShowWindow(handle, (int)SW.SW_HIDE); dwCreationFlags = NORMAL_PRIORITY_CLASS | CREATE_UNICODE_ENVIRONMENT | CREATE_NEW_CONSOLE;
}
return si;
}
public static bool CreateInteractiveSystemProcess(string commandLine, int targetSessionId, bool forceConsoleSession, string desktopName, bool hiddenWindow, out PROCESS_INFORMATION procInfo)
{
nint hPToken = nint.Zero;
procInfo = new PROCESS_INFORMATION();
uint dwSessionId = GetDwSessionId(targetSessionId, forceConsoleSession);
uint winlogonPid = GetWinLogonPid(dwSessionId);
nint hProcess = Kernel32.OpenProcess(MAXIMUM_ALLOWED, false, winlogonPid);
if (OpenProcessToken(hProcess, TOKEN_DUPLICATE, ref hPToken) == false)
{
Kernel32.CloseHandle(hProcess);
return false;
} }
Kernel32.CloseHandle(handle); SECURITY_ATTRIBUTES sa = new SECURITY_ATTRIBUTES();
sa.Length = Marshal.SizeOf(sa);
if (DuplicateTokenEx(hPToken, MAXIMUM_ALLOWED, ref sa, SECURITY_IMPERSONATION_LEVEL.SecurityIdentification, TOKEN_TYPE.TokenPrimary, out nint hUserTokenDup) == false)
{
Kernel32.CloseHandle(hProcess);
Kernel32.CloseHandle(hPToken);
return false;
}
STARTUPINFO si = GetStartUpInfo(hiddenWindow, desktopName, out uint dwCreationFlags);
bool result = CreateProcessAsUser(hUserTokenDup, null, commandLine, ref sa, ref sa, false, dwCreationFlags, nint.Zero, null, ref si, out procInfo);
Kernel32.CloseHandle(hProcess);
Kernel32.CloseHandle(hPToken);
Kernel32.CloseHandle(hUserTokenDup);
return result;
} }
public static string GetCommandLine()
{
nint commandLinePtr = Kernel32.GetCommandLine();
return Marshal.PtrToStringAuto(commandLinePtr) ?? string.Empty;
}
public static void RelaunchElevated() public static void RelaunchElevated()
{ {
if (OperatingSystem.IsWindows() == false) return; if (OperatingSystem.IsWindows() == false) return;
@@ -294,8 +238,8 @@ namespace cmonitor.server.client.reports.screen
} }
try try
{ {
string commandLine = Win32Interop.GetCommandLine(); string commandLine = GetCommandLine();
bool result = Win32Interop.CreateInteractiveSystemProcess($"{commandLine} --elevated", -1, false, "default", true, out PROCESS_INFORMATION procInfo); bool result = CreateInteractiveSystemProcess($"{commandLine} --elevated", -1, false, "default", true, out PROCESS_INFORMATION procInfo);
uint code = Kernel32.GetLastError(); uint code = Kernel32.GetLastError();
if (result) if (result)
{ {
@@ -306,7 +250,6 @@ namespace cmonitor.server.client.reports.screen
{ {
} }
} }
public static void AddTokenPrivilege() public static void AddTokenPrivilege()
{ {
if (OperatingSystem.IsWindows()) if (OperatingSystem.IsWindows())
@@ -316,12 +259,11 @@ namespace cmonitor.server.client.reports.screen
$"ntrights +r SeAssignPrimaryTokenPrivilege -u {windowsIdentity.Name}" $"ntrights +r SeAssignPrimaryTokenPrivilege -u {windowsIdentity.Name}"
}); });
} }
} }
private static string currentUsername = string.Empty; private static string currentUsername = string.Empty;
public static string GetCurrentUserSid() public static string GetCurrentUserSid()
{ {
if (OperatingSystem.IsWindows() == false) if (OperatingSystem.IsWindows() == false)
{ {
@@ -347,13 +289,13 @@ namespace cmonitor.server.client.reports.screen
int returnLength; int returnLength;
if (GetTokenInformation(hToken, TOKEN_INFORMATION_CLASS.TokenUser, IntPtr.Zero, 0, out returnLength) || returnLength == 0) if (GetTokenInformation(hToken, TOKEN_INFORMATION_CLASS.TokenUser, IntPtr.Zero, 0, out returnLength) || returnLength == 0)
{ {
throw new Win32Exception(Marshal.GetLastWin32Error()); return string.Empty;
} }
tokenInformation = Marshal.AllocHGlobal(returnLength); tokenInformation = Marshal.AllocHGlobal(returnLength);
try try
{ {
if (!GetTokenInformation(hToken, TOKEN_INFORMATION_CLASS.TokenUser, tokenInformation, returnLength, out returnLength)) if (GetTokenInformation(hToken, TOKEN_INFORMATION_CLASS.TokenUser, tokenInformation, returnLength, out returnLength) == false)
{ {
return string.Empty; return string.Empty;
} }

View File

@@ -69,14 +69,14 @@ public static class WTSAPI32
[DllImport("wtsapi32.dll", SetLastError = true)] [DllImport("wtsapi32.dll", SetLastError = true)]
static extern nint WTSOpenServer(string pServerName); static extern nint WTSOpenServer(string pServerName);
[StructLayout(LayoutKind.Sequential)] [StructLayout(LayoutKind.Sequential)]
public struct WTS_SESSION_INFO public struct WTS_SESSION_INFO
{ {
public uint SessionID; public uint SessionID;
[MarshalAs(UnmanagedType.LPStr)] [MarshalAs(UnmanagedType.LPStr)]
public string pWinStationName; public string pWinStationName;
public WTS_CONNECTSTATE_CLASS State; public WTS_CONNECTSTATE_CLASS State;
} }
[DllImport("Wtsapi32.dll")] [DllImport("Wtsapi32.dll")]
public static extern bool WTSQueryUserToken(int sessionId, out IntPtr token); public static extern bool WTSQueryUserToken(int sessionId, out IntPtr token);

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
<!doctype html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,minimum-scale=1,user-scalable=0"><link rel="icon" href="/favicon.ico"><title>cmonitor.web</title><script defer="defer" src="/js/chunk-vendors.93db0d1d.js"></script><script defer="defer" src="/js/app.6eec6bd6.js"></script><link href="/css/chunk-vendors.faad7142.css" rel="stylesheet"><link href="/css/app.9c6b579f.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but cmonitor.web doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html> <!doctype html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,minimum-scale=1,user-scalable=0"><link rel="icon" href="/favicon.ico"><title>cmonitor.web</title><script defer="defer" src="/js/chunk-vendors.93db0d1d.js"></script><script defer="defer" src="/js/app.3d096398.js"></script><link href="/css/chunk-vendors.faad7142.css" rel="stylesheet"><link href="/css/app.9c6b579f.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but cmonitor.web doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long