From fd56c2e93ce9c6054e8f65ee083f917b21d354a3 Mon Sep 17 00:00:00 2001 From: lsecqt Date: Thu, 1 Jan 2026 15:43:34 +0200 Subject: [PATCH] init --- Readme.md | 139 +++++++++ .../17.14.1091.29919/CodeChunks.db | Bin 0 -> 81920 bytes .../17.14.1091.29919/SemanticSymbols.db | Bin 0 -> 57344 bytes ...84b9d9d5-4ab5-4c04-ab39-dc3e06c908ef.vsidx | Bin 0 -> 21162 bytes SessionView/.vs/SessionView/v17/.suo | Bin 0 -> 49152 bytes .../v17/DocumentLayout.backup.json | 41 +++ .../.vs/SessionView/v17/DocumentLayout.json | 41 +++ SessionView/SessionView.sln | 25 ++ SessionView/SessionView/App.config | 6 + SessionView/SessionView/Program.cs | 270 ++++++++++++++++++ .../SessionView/Properties/AssemblyInfo.cs | 33 +++ SessionView/SessionView/SessionView.csproj | 53 ++++ ...ework,Version=v4.7.2.AssemblyAttributes.cs | 4 + ...gnTimeResolveAssemblyReferencesInput.cache | Bin 0 -> 1818 bytes ...SessionView.csproj.AssemblyReference.cache | Bin 0 -> 4079 bytes 15 files changed, 612 insertions(+) create mode 100644 Readme.md create mode 100644 SessionView/.vs/SessionView/CopilotIndices/17.14.1091.29919/CodeChunks.db create mode 100644 SessionView/.vs/SessionView/CopilotIndices/17.14.1091.29919/SemanticSymbols.db create mode 100644 SessionView/.vs/SessionView/FileContentIndex/84b9d9d5-4ab5-4c04-ab39-dc3e06c908ef.vsidx create mode 100644 SessionView/.vs/SessionView/v17/.suo create mode 100644 SessionView/.vs/SessionView/v17/DocumentLayout.backup.json create mode 100644 SessionView/.vs/SessionView/v17/DocumentLayout.json create mode 100644 SessionView/SessionView.sln create mode 100644 SessionView/SessionView/App.config create mode 100644 SessionView/SessionView/Program.cs create mode 100644 SessionView/SessionView/Properties/AssemblyInfo.cs create mode 100644 SessionView/SessionView/SessionView.csproj create mode 100644 SessionView/SessionView/obj/Debug/.NETFramework,Version=v4.7.2.AssemblyAttributes.cs create mode 100644 SessionView/SessionView/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache create mode 100644 SessionView/SessionView/obj/Debug/SessionView.csproj.AssemblyReference.cache diff --git a/Readme.md b/Readme.md new file mode 100644 index 0000000..7d876a3 --- /dev/null +++ b/Readme.md @@ -0,0 +1,139 @@ +# SessionView + +A lightweight C# console application for enumerating and displaying all user sessions on Windows Server, including session GUIDs. + +## Features + +- **Complete Session Enumeration**: Lists all active sessions on the Windows server +- **Detailed Session Information**: Displays Session ID, Station Name, Connection State, Username, and Domain +- **Session GUID Retrieval**: Extracts the unique GUID identifier for each session from the Windows registry +- **Connection State Detection**: Shows whether sessions are Active, Disconnected, Idle, etc. +- **Clean Console Output**: Easy-to-read formatted output for quick session analysis + +## Requirements + +- Windows Server (2012 R2 or later) or Windows Client (Windows 10/11) +- .NET Framework 4.7.2+ +- Administrator privileges (required for accessing session information and registry) + +## Installation + +### Option 1: Build from Source + +1. Clone or download the repository +2. Open the solution in Visual Studio 2019 or later +3. Build the solution (Ctrl+Shift+B) +4. The executable will be located in `bin\Debug` or `bin\Release` + +### Option 2: Command Line Build + +# Using MSBuild (Developer Command Prompt for Visual Studio) +msbuild SessionView.csproj /p:Configuration=Release + +# Or using CSC directly +csc /out:SessionView.exe /platform:anycpu Program.cs + +## Usage + +1. **Run as Administrator**: This toold needs elevated token +2. The application will automatically enumerate all sessions and display the information + +### Example Output + +``` +=== Windows Server Session Enumerator === + +Found 3 session(s) + +Session 1: + Session ID: 0 + Station Name: Services + State: WTSDisconnected + Username: (No user logged in) + Session GUID: (Not available) + +Session 2: + Session ID: 1 + Station Name: Console + State: WTSActive + Username: Administrator + Domain: MYSERVER + Session GUID: {A1B2C3D4-E5F6-7890-ABCD-EF1234567890} + +Session 3: + Session ID: 2 + Station Name: RDP-Tcp#1 + State: WTSDisconnected + Username: JohnDoe + Domain: COMPANY + Session GUID: {B2C3D4E5-F6A7-8901-BCDE-F12345678901} + +Press any key to exit... +``` + +## Session States + +The application can display the following connection states: + +- **WTSActive**: User is actively using the session +- **WTSConnected**: Session is connected +- **WTSDisconnected**: Session is disconnected but still running +- **WTSIdle**: Session is idle +- **WTSListen**: Session is listening for connections +- **WTSReset**: Session is being reset +- **WTSDown**: Session is down +- **WTSInit**: Session is initializing + +## Technical Details + +### APIs Used + +- **WTS API (wtsapi32.dll)**: For enumerating sessions and querying session information +- **Windows Registry API (advapi32.dll)**: For retrieving session GUIDs from the registry + +### Registry Location + +Session GUIDs are stored at: +``` +HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Remote\Terminal Services\Session\{SessionId}\SessionGuid +``` + +### Known Limitations + +- Session 0 (Services session) typically does not have a GUID +- Requires administrator privileges to access session information +- Some sessions may not have all information available depending on their state + +## Troubleshooting + +### "Access Denied" Error +- Ensure you're running the application as Administrator +- Check that you have proper permissions on the server + +### Missing Session GUIDs +- This is normal for certain system sessions (like Session 0) +- Some disconnected sessions may not retain their GUID in the registry + +### No Sessions Found +- Verify you're running on a Windows Server with Terminal Services enabled +- Check that the Remote Desktop Services role is installed + +## Use Cases + +- **System Administration**: Monitor active and disconnected user sessions +- **Remote Desktop Management**: Track RDP connections and their states +- **Security Auditing**: Identify user sessions and their unique identifiers +- **Session Management Scripts**: Integrate with automation tools for session cleanup +- **Troubleshooting**: Diagnose session-related issues on Terminal Servers + +## License + +This project is provided as-is for educational and administrative purposes. + +## Contributing + +Feel free to submit issues, fork the repository, and create pull requests for any improvements. + +## Author + +Created for Windows Server administration and session management tasks. \ No newline at end of file diff --git a/SessionView/.vs/SessionView/CopilotIndices/17.14.1091.29919/CodeChunks.db b/SessionView/.vs/SessionView/CopilotIndices/17.14.1091.29919/CodeChunks.db new file mode 100644 index 0000000000000000000000000000000000000000..57997c79fa188c82e9dee627fb15500e30d9f879 GIT binary patch literal 81920 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 JcTig>{ugAv;VS?D literal 0 HcmV?d00001 diff --git a/SessionView/.vs/SessionView/CopilotIndices/17.14.1091.29919/SemanticSymbols.db b/SessionView/.vs/SessionView/CopilotIndices/17.14.1091.29919/SemanticSymbols.db new file mode 100644 index 0000000000000000000000000000000000000000..797f446cfb319b474fcb6a5b101bd35968ff83b5 GIT binary patch literal 57344 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 literal 0 HcmV?d00001 diff --git a/SessionView/.vs/SessionView/v17/.suo b/SessionView/.vs/SessionView/v17/.suo new file mode 100644 index 0000000000000000000000000000000000000000..105a5c789ce1dce3d1d2e030a01987d872f83964 GIT binary patch literal 49152 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 K&&kf%|NeglWnz2) literal 0 HcmV?d00001 diff --git a/SessionView/.vs/SessionView/v17/DocumentLayout.backup.json b/SessionView/.vs/SessionView/v17/DocumentLayout.backup.json new file mode 100644 index 0000000..09310a2 --- /dev/null +++ b/SessionView/.vs/SessionView/v17/DocumentLayout.backup.json @@ -0,0 +1,41 @@ +{ + "Version": 1, + "WorkspaceRootPath": "C:\\Users\\lsec\\source\\SessionView\\SessionView\\", + "Documents": [ + { + "AbsoluteMoniker": "D:0:0:{E865CBCC-40D2-48F3-BE98-31EBC6094E98}|SessionView\\SessionView.csproj|c:\\users\\lsec\\source\\sessionview\\sessionview\\sessionview\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{E865CBCC-40D2-48F3-BE98-31EBC6094E98}|SessionView\\SessionView.csproj|solutionrelative:sessionview\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + } + ], + "DocumentGroupContainers": [ + { + "Orientation": 0, + "VerticalTabListWidth": 256, + "DocumentGroups": [ + { + "DockedWidth": 200, + "SelectedChildIndex": 0, + "Children": [ + { + "$type": "Document", + "DocumentIndex": 0, + "Title": "Program.cs", + "DocumentMoniker": "C:\\Users\\lsec\\source\\SessionView\\SessionView\\SessionView\\Program.cs", + "RelativeDocumentMoniker": "SessionView\\Program.cs", + "ToolTip": "C:\\Users\\lsec\\source\\SessionView\\SessionView\\SessionView\\Program.cs", + "RelativeToolTip": "SessionView\\Program.cs", + "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2026-01-01T13:37:10.009Z", + "EditorCaption": "" + }, + { + "$type": "Bookmark", + "Name": "ST:0:0:{cce594b6-0c39-4442-ba28-10c64ac7e89f}" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/SessionView/.vs/SessionView/v17/DocumentLayout.json b/SessionView/.vs/SessionView/v17/DocumentLayout.json new file mode 100644 index 0000000..a2576df --- /dev/null +++ b/SessionView/.vs/SessionView/v17/DocumentLayout.json @@ -0,0 +1,41 @@ +{ + "Version": 1, + "WorkspaceRootPath": "C:\\Users\\lsec\\source\\SessionView\\SessionView\\", + "Documents": [ + { + "AbsoluteMoniker": "D:0:0:{E865CBCC-40D2-48F3-BE98-31EBC6094E98}|SessionView\\SessionView.csproj|c:\\users\\lsec\\source\\sessionview\\sessionview\\sessionview\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{E865CBCC-40D2-48F3-BE98-31EBC6094E98}|SessionView\\SessionView.csproj|solutionrelative:sessionview\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + } + ], + "DocumentGroupContainers": [ + { + "Orientation": 0, + "VerticalTabListWidth": 256, + "DocumentGroups": [ + { + "DockedWidth": 200, + "SelectedChildIndex": 0, + "Children": [ + { + "$type": "Document", + "DocumentIndex": 0, + "Title": "Program.cs", + "DocumentMoniker": "C:\\Users\\lsec\\source\\SessionView\\SessionView\\SessionView\\Program.cs", + "RelativeDocumentMoniker": "SessionView\\Program.cs", + "ToolTip": "C:\\Users\\lsec\\source\\SessionView\\SessionView\\SessionView\\Program.cs", + "RelativeToolTip": "SessionView\\Program.cs", + "ViewState": "AgIAAPMAAAAAAAAAAAAmwA0BAAABAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2026-01-01T13:37:10.009Z", + "EditorCaption": "" + }, + { + "$type": "Bookmark", + "Name": "ST:0:0:{cce594b6-0c39-4442-ba28-10c64ac7e89f}" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/SessionView/SessionView.sln b/SessionView/SessionView.sln new file mode 100644 index 0000000..4801459 --- /dev/null +++ b/SessionView/SessionView.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.14.36414.22 d17.14 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SessionView", "SessionView\SessionView.csproj", "{E865CBCC-40D2-48F3-BE98-31EBC6094E98}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E865CBCC-40D2-48F3-BE98-31EBC6094E98}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E865CBCC-40D2-48F3-BE98-31EBC6094E98}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E865CBCC-40D2-48F3-BE98-31EBC6094E98}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E865CBCC-40D2-48F3-BE98-31EBC6094E98}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {174D77B3-218B-4604-B102-FF9B3F187140} + EndGlobalSection +EndGlobal diff --git a/SessionView/SessionView/App.config b/SessionView/SessionView/App.config new file mode 100644 index 0000000..56efbc7 --- /dev/null +++ b/SessionView/SessionView/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/SessionView/SessionView/Program.cs b/SessionView/SessionView/Program.cs new file mode 100644 index 0000000..4499741 --- /dev/null +++ b/SessionView/SessionView/Program.cs @@ -0,0 +1,270 @@ +using System; +using System.Runtime.InteropServices; +using System.Text; +using System.ComponentModel; + +namespace SessionView +{ + class Program + { + // Constants + const int WTS_CURRENT_SERVER_HANDLE = 0; + + // Enums + enum WTS_INFO_CLASS + { + WTSSessionId = 4, + WTSUserName = 5, + WTSDomainName = 7, + WTSConnectState = 8, + WTSSessionInfo = 24 + } + + enum WTS_CONNECTSTATE_CLASS + { + WTSActive, + WTSConnected, + WTSConnectQuery, + WTSShadow, + WTSDisconnected, + WTSIdle, + WTSListen, + WTSReset, + WTSDown, + WTSInit + } + + // Structs + [StructLayout(LayoutKind.Sequential)] + struct WTS_SESSION_INFO + { + public int SessionId; + public IntPtr pWinStationName; + public WTS_CONNECTSTATE_CLASS State; + } + + [StructLayout(LayoutKind.Sequential)] + struct WTSINFO + { + public int SessionId; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 33)] + public string WinStationName; + public WTS_CONNECTSTATE_CLASS State; + // Other fields omitted for brevity + } + + // P/Invoke declarations + [DllImport("wtsapi32.dll", SetLastError = true)] + static extern bool WTSEnumerateSessions( + IntPtr hServer, + int Reserved, + int Version, + ref IntPtr ppSessionInfo, + ref int pCount); + + [DllImport("wtsapi32.dll", SetLastError = true)] + static extern bool WTSQuerySessionInformation( + IntPtr hServer, + int sessionId, + WTS_INFO_CLASS wtsInfoClass, + out IntPtr ppBuffer, + out int pBytesReturned); + + [DllImport("wtsapi32.dll")] + static extern void WTSFreeMemory(IntPtr pMemory); + + [DllImport("kernel32.dll", SetLastError = true)] + static extern int ProcessIdToSessionId(int dwProcessId, out int pSessionId); + + // Registry access for session GUID + [DllImport("advapi32.dll", SetLastError = true)] + static extern int RegOpenKeyEx( + IntPtr hKey, + string lpSubKey, + int ulOptions, + int samDesired, + out IntPtr phkResult); + + [DllImport("advapi32.dll", SetLastError = true)] + static extern int RegQueryValueEx( + IntPtr hKey, + string lpValueName, + IntPtr lpReserved, + out uint lpType, + byte[] lpData, + ref int lpcbData); + + [DllImport("advapi32.dll", SetLastError = true)] + static extern int RegCloseKey(IntPtr hKey); + + static readonly IntPtr HKEY_LOCAL_MACHINE = new IntPtr(unchecked((int)0x80000002)); + const int KEY_READ = 0x20019; + const int ERROR_SUCCESS = 0; + + static void Main(string[] args) + { + Console.WriteLine("=== Windows Server Session Enumerator ===\n"); + + IntPtr serverHandle = IntPtr.Zero; + IntPtr sessionInfoPtr = IntPtr.Zero; + int sessionCount = 0; + + try + { + // Enumerate sessions + bool result = WTSEnumerateSessions( + serverHandle, + 0, + 1, + ref sessionInfoPtr, + ref sessionCount); + + if (!result) + { + throw new Win32Exception(Marshal.GetLastWin32Error()); + } + + Console.WriteLine($"Found {sessionCount} session(s)\n"); + + int structSize = Marshal.SizeOf(typeof(WTS_SESSION_INFO)); + IntPtr currentSession = sessionInfoPtr; + + for (int i = 0; i < sessionCount; i++) + { + WTS_SESSION_INFO sessionInfo = (WTS_SESSION_INFO)Marshal.PtrToStructure( + currentSession, + typeof(WTS_SESSION_INFO)); + + string stationName = Marshal.PtrToStringAnsi(sessionInfo.pWinStationName); + + Console.WriteLine($"Session {i + 1}:"); + Console.WriteLine($" Session ID: {sessionInfo.SessionId}"); + Console.WriteLine($" Station Name: {stationName}"); + Console.WriteLine($" State: {sessionInfo.State}"); + + // Get username + string username = GetSessionInfo(serverHandle, sessionInfo.SessionId, WTS_INFO_CLASS.WTSUserName); + if (!string.IsNullOrEmpty(username)) + { + Console.WriteLine($" Username: {username}"); + + // Get domain + string domain = GetSessionInfo(serverHandle, sessionInfo.SessionId, WTS_INFO_CLASS.WTSDomainName); + if (!string.IsNullOrEmpty(domain)) + { + Console.WriteLine($" Domain: {domain}"); + } + } + else + { + Console.WriteLine($" Username: (No user logged in)"); + } + + // Get session GUID from registry + string guid = GetSessionGuid(sessionInfo.SessionId); + if (!string.IsNullOrEmpty(guid)) + { + Console.WriteLine($" Session GUID: {guid}"); + } + else + { + Console.WriteLine($" Session GUID: (Not available)"); + } + + Console.WriteLine(); + + currentSession = (IntPtr)((long)currentSession + structSize); + } + } + catch (Exception ex) + { + Console.WriteLine($"Error: {ex.Message}"); + } + finally + { + if (sessionInfoPtr != IntPtr.Zero) + { + WTSFreeMemory(sessionInfoPtr); + } + } + + Console.WriteLine("\nPress any key to exit..."); + Console.ReadKey(); + } + + static string GetSessionInfo(IntPtr serverHandle, int sessionId, WTS_INFO_CLASS infoClass) + { + IntPtr buffer = IntPtr.Zero; + int bytesReturned = 0; + + try + { + if (WTSQuerySessionInformation(serverHandle, sessionId, infoClass, out buffer, out bytesReturned)) + { + return Marshal.PtrToStringAnsi(buffer); + } + } + finally + { + if (buffer != IntPtr.Zero) + { + WTSFreeMemory(buffer); + } + } + + return string.Empty; + } + + static string GetSessionGuid(int sessionId) + { + IntPtr keyHandle = IntPtr.Zero; + + try + { + string keyPath = $@"SOFTWARE\Microsoft\Windows\CurrentVersion\Remote\Terminal Services\Session\{sessionId}"; + + int result = RegOpenKeyEx( + HKEY_LOCAL_MACHINE, + keyPath, + 0, + KEY_READ, + out keyHandle); + + if (result != ERROR_SUCCESS || keyHandle == IntPtr.Zero) + { + return null; + } + + uint type; + int dataSize = 256; + byte[] data = new byte[dataSize]; + + result = RegQueryValueEx( + keyHandle, + "SessionGuid", + IntPtr.Zero, + out type, + data, + ref dataSize); + + if (result == ERROR_SUCCESS && dataSize > 0) + { + return Encoding.Unicode.GetString(data, 0, dataSize - 2); // -2 to exclude null terminator + } + } + catch + { + // Session might not have a GUID in registry + } + finally + { + if (keyHandle != IntPtr.Zero) + { + RegCloseKey(keyHandle); + } + } + + return null; + } + } +} \ No newline at end of file diff --git a/SessionView/SessionView/Properties/AssemblyInfo.cs b/SessionView/SessionView/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..af6a5cf --- /dev/null +++ b/SessionView/SessionView/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("SessionView")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("SessionView")] +[assembly: AssemblyCopyright("Copyright © 2026")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("e865cbcc-40d2-48f3-be98-31ebc6094e98")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/SessionView/SessionView/SessionView.csproj b/SessionView/SessionView/SessionView.csproj new file mode 100644 index 0000000..e42c706 --- /dev/null +++ b/SessionView/SessionView/SessionView.csproj @@ -0,0 +1,53 @@ + + + + + Debug + AnyCPU + {E865CBCC-40D2-48F3-BE98-31EBC6094E98} + Exe + SessionView + SessionView + v4.7.2 + 512 + true + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/SessionView/SessionView/obj/Debug/.NETFramework,Version=v4.7.2.AssemblyAttributes.cs b/SessionView/SessionView/obj/Debug/.NETFramework,Version=v4.7.2.AssemblyAttributes.cs new file mode 100644 index 0000000..3871b18 --- /dev/null +++ b/SessionView/SessionView/obj/Debug/.NETFramework,Version=v4.7.2.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] diff --git a/SessionView/SessionView/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/SessionView/SessionView/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache new file mode 100644 index 0000000000000000000000000000000000000000..e149263400d89bc138aedaabe3c55675136d1207 GIT binary patch literal 1818 zcmcJQ-;2~R5XY-7`*7fk2#Wa7M};Mvp7`Uyhojwcf-cAI-r++;(sZ^PO_Mc~-R@HQ zznip2mwWK#FomXR6XrA1nSAHjqbQ2Tq!y|wMx>B(L|_lmiTj!)=kyxEAe9K5qTU(~ zbODG$s~Z9JKj#;l4dGg?L@At&E2B%psyGu8Fn+cF`2IDW!wL*24)FydRJjy@^qb&D zqh48>x&2UU^P7^{ba{N+y(1sU+v7%(EY{3yyx%McsY0%e6uBo9K?sWjTBt~(4S2{d zBqU{)5kD-zPWKj+&m;zqt;4$5euj+A*l0ZIAJ&{u;Z-^Cn@c5CyYvD*}g3BHAa-rBL>Y*>z@g^~D{J_C>Q~ zrUW}kK`IPztIeTJn>myMtvQ@8oOaaAz)>LX>c^zlkI8`3vT*t~-M5dMIjcQ==7guc zzw+fm(G>D+NxL}zi*M2;=6*V?^Ix~#q=2GSOHsibP|Mx$#|I%s!Wmz~L+5vxO860^ zzB0yH;d;l*JB?y;fjN5X}gvwp#?^L!gy<*dtu5LMsZrR4Cnw1FTR}Ar6r$*X!(BO`NUmUAn#W z%$YyJjbG9`zk)M%ND3jjM499e#c?#Ad2eRkWDV9m&jaf3g&$QqRWunMikR!+vy0cS zo`**~;)+Yghi|p!$!RRO4nGK{Qk_O7Jhb2QFR3~U$#``9ceUIhyX0k!RJwtzeK&0U$QL`)4F{$63RpIiK##EtBfJ#*H|D9^e?**Z(!3wd4xw@Vi^xN*P% zSo;HV3xEMObE1wG(ujnUfGa^`aoIct%G3dD+$5FaEnKYTz_QC6IG~0ScMG@~T^KI4 zEd^bZ5w70QGNQoB9ozydoRlb>@l#~tL?^`ENCNSL8CCPHxx%PAB!~g-R+~9bT*p|)O z8N(j{p5*Qoy5dtd6LQ)p|eEjIvrNV+>m$1 z)U`X**$|_MklI}pVb*1fa^qmNL!s(E2DlINWX>j+;5=?Oa^wFDR9Wj(SlrZ7LmTP< Zk3k!ju%PNdVJzTmp@dnrXxA0me*?;F-)8^- literal 0 HcmV?d00001