#
.SYNOPSIS
This script is run from the system context to generate a toast notificatio in the logged in users context.
.DESCRIPTION
This script is run from the system context to generate a toast notificatio in the logged in users context. It uses
portions of the PSADT to discover the logged on user and create a scheduled task that will run in the user's context.
The parameters define the content of the toast. However, the images are baked into the script and would have to be
changed in the script.
.PARAMETER HeaderText
The header text is the text next to the logo. This could be similar to a from tag.
.PARAMETER TitleText
This is the heading first line in the toast notification. Sort of like the subject line.
.PARAMETER BodyText1
This is the first paragraph in the body of the toast and is a required fielt.
.PARAMETER BodyText2
This is the second paragraph in the body of the toast and is not required.
.PARAMETER AlertTime
This is like the Sent time in an email, just in case the toast is sitting on the computer for hours.
.PARAMETER Expiration
This is the date/time that the toast will no longer display after and is an optional field. So, if something is very
time sensitive and you don't want it to deliver more than an hour after it has been sent, this can be used to confirm
that will happen.
.PARAMETER Scenario
Possible values are: reminder | short | long
How long displayed:
--Reminder: Until Dismissed
--Short: 5 seconds
--Long: 25 seconds
.PARAMETER DismissButtonText
This is the text that is displayed in the single button at the bottom of the toast message. Dismiss is the default text.
.EXAMPLE
An example
.NOTES
NAME: Invoke-ToastAsUser.ps1
VERSION: 1.0
AUTHOR: Paul Wetter
Based on content from the PowerShell App Deployment Toolkit (https://psappdeploytoolkit.com)
LASTEDIT: December 26, 2020
#>
[CmdletBinding()]
param (
[Parameter(Mandatory = $false)]
[String]
$HeaderText = 'Important message from IT...',
[Parameter(Mandatory = $true)]
[String]
$TitleText,
[Parameter(Mandatory = $true)]
[String]
$BodyText1,
[Parameter(Mandatory = $false)]
[String]
$BodyText2,
#Format 'MM/dd/yyyy @ hh:mm tt'
[Parameter(Mandatory = $false)]
[String]
$AlertTime = (Get-Date -Format 'MM/dd/yyyy @ hh:mm tt'),
#Format 'MM/dd/yyyy @ hh:mm tt'
[Parameter(Mandatory = $false)]
[String]
$Expiration,
#Scenario Possible values are: reminder | short | long --- How long displayed::: Reminder: Until Dismissed, Short: 5 seconds, Long: 25 seconds
[Parameter(Mandatory = $false)]
[String]
$Scenario = 'Reminder',
[Parameter(Mandatory = $false)]
[String]
$DismissButtonText = 'Dismiss'
)
#If the Expiration variable has been defined and is a Date/Time, then check if the current time is beyond the exipiration time.
If (![string]::IsNullOrEmpty($Expiration)){
Try {
$ExpireDate = Get-Date $Expiration -ErrorAction Stop
if ($ExpireDate -lt (Get-Date)){
Exit
}
}
Catch{}
}
Function Invoke-ProcessAsUser {
<#
.SYNOPSIS
Execute a process with a logged in user account, by using a scheduled task, to provide interaction with user in the SYSTEM context.
.DESCRIPTION
Execute a process with a logged in user account, by using a scheduled task, to provide interaction with user in the SYSTEM context.
.PARAMETER UserName
Logged in Username under which to run the process from. Default is: The active console user. If no console user exists but users are logged in, such as on terminal servers, then the first logged-in non-console user.
.PARAMETER Path
Path to the file being executed.
.PARAMETER Parameters
Arguments to be passed to the file being executed.
.PARAMETER SecureParameters
Hides all parameters passed to the executable from the Toolkit log file.
.PARAMETER RunLevel
Specifies the level of user rights that Task Scheduler uses to run the task. The acceptable values for this parameter are:
- HighestAvailable: Tasks run by using the highest available privileges (Admin privileges for Administrators). Default Value.
- LeastPrivilege: Tasks run by using the least-privileged user account (LUA) privileges.
.PARAMETER Wait
Wait for the process, launched by the scheduled task, to complete execution before accepting more input. Default is $false.
.PARAMETER PassThru
Returns the exit code from this function or the process launched by the scheduled task.
.PARAMETER WorkingDirectory
Set working directory for the process.
.PARAMETER ContinueOnError
Continue if an error is encountered. Default is $true.
.EXAMPLE
Execute-ProcessAsUser -UserName 'CONTOSO\User' -Path "$PSHOME\powershell.exe" -Parameters "-Command & { & `"C:\Test\Script.ps1`"; Exit `$LastExitCode }" -Wait
Execute process under a user account by specifying a username under which to execute it.
.EXAMPLE
Execute-ProcessAsUser -Path "$PSHOME\powershell.exe" -Parameters "-Command & { & `"C:\Test\Script.ps1`"; Exit `$LastExitCode }" -Wait
Execute process under a user account by using the default active logged in user that was detected when the toolkit was launched.
.NOTES
.LINK
http://psappdeploytoolkit.com
#>
[CmdletBinding()]
Param (
[Parameter(Mandatory=$false)]
[ValidateNotNullorEmpty()]
[string]$UserName = $RunAsActiveUser.NTAccount,
[Parameter(Mandatory=$true)]
[ValidateNotNullorEmpty()]
[string]$Path,
[Parameter(Mandatory=$false)]
[ValidateNotNullorEmpty()]
[string]$Parameters = '',
[Parameter(Mandatory=$false)]
[switch]$SecureParameters = $false,
[Parameter(Mandatory=$false)]
[ValidateSet('HighestAvailable','LeastPrivilege')]
[string]$RunLevel = 'HighestAvailable',
[Parameter(Mandatory=$false)]
[ValidateNotNullOrEmpty()]
[switch]$Wait = $false,
[Parameter(Mandatory=$false)]
[switch]$PassThru = $false,
[Parameter(Mandatory=$false)]
[ValidateNotNullOrEmpty()]
[string]$WorkingDirectory,
[Parameter(Mandatory=$false)]
[ValidateNotNullOrEmpty()]
[boolean]$ContinueOnError = $true
)
Begin {
## Get the name of this function and write header
[string]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name
[string]$executeAsUserTempPath = Join-Path -Path $dirAppDeployTemp -ChildPath 'ExecuteAsUser'
[string]$exeSchTasks = Join-Path -Path ${ENV:windir} -ChildPath 'System32\schtasks.exe' # Manages Scheduled Tasks
}
Process {
## Initialize exit code variable
[int32]$executeProcessAsUserExitCode = 0
## Confirm that the username field is not empty
If (-not $UserName) {
[int32]$executeProcessAsUserExitCode = 60009
Write-Verbose -Message "The function [${CmdletName}] has a -UserName parameter that has an empty default value because no logged in users were detected when the toolkit was launched."
If (-not $ContinueOnError) {
Throw "The function [${CmdletName}] has a -UserName parameter that has an empty default value because no logged in users were detected when the toolkit was launched."
}
Return
}
## Confirm if the toolkit is running with administrator privileges
If (($RunLevel -eq 'HighestAvailable') -and (-not $IsAdmin)) {
[int32]$executeProcessAsUserExitCode = 60003
Write-Verbose -Message "The function [${CmdletName}] requires the toolkit to be running with Administrator privileges if the [-RunLevel] parameter is set to 'HighestAvailable'."
If (-not $ContinueOnError) {
Throw "The function [${CmdletName}] requires the toolkit to be running with Administrator privileges if the [-RunLevel] parameter is set to 'HighestAvailable'."
}
Return
}
## Check whether the specified Working Directory exists
If ($WorkingDirectory -and (-not (Test-Path -LiteralPath $WorkingDirectory -PathType 'Container'))) {
Write-Verbose -Message "The specified working directory does not exist or is not a directory. The scheduled task might not work as expected."
}
## Build the scheduled task XML name
[string]$schTaskName = "ITAlert-ExecuteAsUser"
## Remove and recreate the temporary folder
If (Test-Path -LiteralPath $executeAsUserTempPath -PathType 'Container') {
Write-Verbose -Message "Previous [$executeAsUserTempPath] found. Attempting removal."
Remove-Item -LiteralPath $executeAsUserTempPath -Force -Recurse -ErrorAction 'SilentlyContinue'
}
Write-Verbose -Message "Creating [$executeAsUserTempPath]."
Try {
$null = New-Item -Path $executeAsUserTempPath -ItemType 'Directory' -ErrorAction 'Stop'
}
Catch {
Write-Verbose -Message "Unable to create [$executeAsUserTempPath]. Possible attempt to gain elevated rights."
}
## If PowerShell.exe is being launched, then create a VBScript to launch PowerShell so that we can suppress the console window that flashes otherwise
If (((Split-Path -Path $Path -Leaf) -like 'PowerShell*') -or ((Split-Path -Path $Path -Leaf) -like 'cmd*')) {
If ($SecureParameters) {
Write-Verbose -Message "Preparing a vbs script that will start [$Path] (Parameters Hidden) as the logged-on user [$userName] silently..."
}
Else {
Write-Verbose -Message "Preparing a vbs script that will start [$Path $Parameters] as the logged-on user [$userName] silently..."
}
# Permit inclusion of double quotes in parameters
$QuotesIndex = $Parameters.Length - 1
If ($QuotesIndex -lt 0) {
$QuotesIndex = 0
}
If ($($Parameters.Substring($QuotesIndex)) -eq '"') {
[string]$executeProcessAsUserParametersVBS = 'chr(34) & ' + "`"$($Path)`"" + ' & chr(34) & ' + '" ' + ($Parameters -replace "`r`n", ';' -replace "`n", ';' -replace '"', "`" & chr(34) & `"" -replace ' & chr\(34\) & "$', '') + ' & chr(34)' }
Else {
[string]$executeProcessAsUserParametersVBS = 'chr(34) & ' + "`"$($Path)`"" + ' & chr(34) & ' + '" ' + ($Parameters -replace "`r`n", ';' -replace "`n", ';' -replace '"', "`" & chr(34) & `"" -replace ' & chr\(34\) & "$','') + '"' }
[string[]]$executeProcessAsUserScript = "strCommand = $executeProcessAsUserParametersVBS"
$executeProcessAsUserScript += 'set oWShell = CreateObject("WScript.Shell")'
$executeProcessAsUserScript += 'intReturn = oWShell.Run(strCommand, 0, true)'
$executeProcessAsUserScript += 'WScript.Quit intReturn'
$executeProcessAsUserScript | Out-File -FilePath "$executeAsUserTempPath\$($schTaskName).vbs" -Force -Encoding 'default' -ErrorAction 'SilentlyContinue'
$Path = "${ENV:WinDir}\System32\wscript.exe"
$Parameters = "`"$executeAsUserTempPath\$($schTaskName).vbs`""
Start-Sleep -Seconds 5
try {
#Set-ItemPermission -Path "$executeAsUserTempPath\$schTaskName.vbs" -User $UserName -Permission 'Read'
}
catch {
Write-Verbose -Message "Failed to set read permissions on path [$executeAsUserTempPath\$schTaskName.vbs]. The function might not be able to work correctly."
}
}
## Prepare working directory insert
[string]$WorkingDirectoryInsert = ""
If ($WorkingDirectory) {
$WorkingDirectoryInsert = "`n $WorkingDirectory"
}
## Specify the scheduled task configuration in XML format
[string]$xmlSchTask = @"
StopExisting
false
false
true
false
false
false
false
true
true
false
false
false
PT72H
7
$Path
$Parameters$WorkingDirectoryInsert
$UserName
InteractiveToken
$RunLevel
"@
## Export the XML to file
Try {
# Specify the filename to export the XML to
[string]$xmlSchTaskFilePath = "$dirAppDeployTemp\$schTaskName.xml"
[string]$xmlSchTask | Out-File -FilePath $xmlSchTaskFilePath -Force -ErrorAction 'Stop'
#Set-ItemPermission -Path $xmlSchTaskFilePath -User $UserName -Permission 'Read'
}
Catch {
[int32]$executeProcessAsUserExitCode = 60007
Write-Verbose -Message "Failed to export the scheduled task XML file [$xmlSchTaskFilePath]."
If (-not $ContinueOnError) {
Throw "Failed to export the scheduled task XML file [$xmlSchTaskFilePath]: $($_.Exception.Message)"
}
Return
}
## Create Scheduled Task to run the process with a logged-on user account
If ($Parameters) {
If ($SecureParameters) {
Write-Verbose -Message "Creating scheduled task to run the process [$Path] (Parameters Hidden) as the logged-on user [$userName]..."
}
Else {
Write-Verbose -Message "Creating scheduled task to run the process [$Path $Parameters] as the logged-on user [$userName]..."
}
}
Else {
Write-Verbose -Message "Creating scheduled task to run the process [$Path] as the logged-on user [$userName]..."
}
$schTaskResult = Start-Process -FilePath $exeSchTasks -ArgumentList "/create /f /tn $schTaskName /xml `"$xmlSchTaskFilePath`"" -WindowStyle Hidden -PassThru
If ($schTaskResult.ExitCode -ne 0) {
Write-Verbose -Message 'Try to see if it exists from a query. may not trigger the right one.'
If ([string]::IsNullOrEmpty((schtasks.exe /query| where {$_ -like "*$schTaskNam*"}))){
[int32]$executeProcessAsUserExitCode = $schTaskResult.ExitCode
Write-Verbose -Message "Failed to create the scheduled task by importing the scheduled task XML file [$xmlSchTaskFilePath]. [$($schTaskResult.ExitCode)]"
If (-not $ContinueOnError) {
Throw "Failed to create the scheduled task by importing the scheduled task XML file [$xmlSchTaskFilePath]."
}
Return
} else {
Write-Verbose -Message 'Try to see if it exists from a query. may not trigger the right one.'
}
}
## Trigger the Scheduled Task
If ($Parameters) {
If ($SecureParameters) {
Write-Verbose -Message "Trigger execution of scheduled task with command [$Path] (Parameters Hidden) as the logged-on user [$userName]..."
}
Else {
Write-Verbose -Message "Trigger execution of scheduled task with command [$Path $Parameters] as the logged-on user [$userName]..."
}
}
Else {
Write-Verbose -Message "Trigger execution of scheduled task with command [$Path] as the logged-on user [$userName]..."
}
Try {
Start-ScheduledTask -TaskName $schTaskName -ErrorAction Stop
}
Catch {
Write-Verbose -Message "Failed to trigger scheduled task [$schTaskName]."
# Delete Scheduled Task
Write-Verbose -Message 'Delete the scheduled task which did not trigger.'
Start-Process -FilePath $exeSchTasks -ArgumentList "/delete /tn $schTaskName /f" -WindowStyle Hidden
If (-not $ContinueOnError) {
Throw "Failed to trigger scheduled task [$schTaskName]."
}
Return
}
## Wait for the process launched by the scheduled task to complete execution
If ($Wait) {
Write-Verbose -Message "Waiting for the process launched by the scheduled task [$schTaskName] to complete execution (this may take some time)..."
Start-Sleep -Seconds 1
Try {
[__comobject]$ScheduleService = New-Object -ComObject 'Schedule.Service' -ErrorAction Stop
$ScheduleService.Connect()
$RootFolder = $ScheduleService.GetFolder('\')
$Task = $RootFolder.GetTask("$schTaskName")
# Task State(Status) 4 = 'Running'
While ($Task.State -eq 4) {
Start-Sleep -Seconds 5
}
# Get the exit code from the process launched by the scheduled task
[int32]$executeProcessAsUserExitCode = $Task.LastTaskResult
}
Catch {
Write-Verbose -Message "Failed to retrieve information from Task Scheduler."
}
Finally {
Try { $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($ScheduleService) } Catch { }
}
Write-Verbose -Message "Exit code from process launched by scheduled task [$executeProcessAsUserExitCode]."
}
Else {
Start-Sleep -Seconds 1
}
## Delete scheduled task
Try {
Write-Verbose -Message "Delete scheduled task [$schTaskName]."
Start-Process -FilePath $exeSchTasks -ArgumentList "/delete /tn $schTaskName /f" -WindowStyle Hidden -ErrorAction 'Stop'
}
Catch {
Write-Verbose -Message "Failed to delete scheduled task [$schTaskName]."
}
## Remove the XML scheduled task file
If (Test-Path -LiteralPath $xmlSchTaskFilePath -PathType 'Leaf') {
Remove-Item -LiteralPath $xmlSchTaskFilePath -Force -Recurse -ErrorAction 'SilentlyContinue'
}
## Remove the temporary folder
If (Test-Path -LiteralPath $executeAsUserTempPath -PathType 'Container') {
Remove-Item -LiteralPath $executeAsUserTempPath -Force -Recurse -ErrorAction 'SilentlyContinue'
}
}
End {
If ($PassThru) { Write-Output -InputObject $executeProcessAsUserExitCode }
}
}
Function Get-LoggedOnUser {
<#
.SYNOPSIS
Get session details for all local and RDP logged on users.
.DESCRIPTION
Get session details for all local and RDP logged on users using Win32 APIs. Get the following session details:
NTAccount, SID, UserName, DomainName, SessionId, SessionName, ConnectState, IsCurrentSession, IsConsoleSession, IsUserSession, IsActiveUserSession
IsRdpSession, IsLocalAdmin, LogonTime, IdleTime, DisconnectTime, ClientName, ClientProtocolType, ClientDirectory, ClientBuildNumber
.EXAMPLE
Get-LoggedOnUser
.NOTES
Description of ConnectState property:
Value Description
----- -----------
Active A user is logged on to the session.
ConnectQuery The session is in the process of connecting to a client.
Connected A client is connected to the session.
Disconnected The session is active, but the client has disconnected from it.
Down The session is down due to an error.
Idle The session is waiting for a client to connect.
Initializing The session is initializing.
Listening The session is listening for connections.
Reset The session is being reset.
Shadowing This session is shadowing another session.
Description of IsActiveUserSession property:
If a console user exists, then that will be the active user session.
If no console user exists but users are logged in, such as on terminal servers, then the first logged-in non-console user that is either 'Active' or 'Connected' is the active user.
Description of IsRdpSession property:
Gets a value indicating whether the user is associated with an RDP client session.
.LINK
http://psappdeploytoolkit.com
#>
[CmdletBinding()]
Param (
)
Try {
Write-Output -InputObject ([PSADT.QueryUser]::GetUserSessionInfo("$env:ComputerName"))
}
Catch {
}
}
function Add-PSADTCustom {
<#
.SYNOPSIS
This function adds the custom C# code from the PSADT needed to get the logged on user.
.DESCRIPTION
In the PSADT, this code is loaded with other classes used by the toolkit. I have trimmed
the C# down to only the code for the QueryUser class.
Only load this once per powershell session or you will get errors returned.
.EXAMPLE
Add-PSADTCustom
#>
[CmdletBinding()]
param ()
$signature = @"
using System;
using System.Text;
using System.Collections;
using System.ComponentModel;
using System.DirectoryServices;
using System.Security.Principal;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text.RegularExpressions;
using FILETIME = System.Runtime.InteropServices.ComTypes.FILETIME;
namespace PSADT
{
public class QueryUser
{
[DllImport("wtsapi32.dll", CharSet = CharSet.Auto, SetLastError = false)]
public static extern IntPtr WTSOpenServer(string pServerName);
[DllImport("wtsapi32.dll", CharSet = CharSet.Auto, SetLastError = false)]
public static extern void WTSCloseServer(IntPtr hServer);
[DllImport("wtsapi32.dll", CharSet = CharSet.Ansi, SetLastError = false)]
public static extern bool WTSQuerySessionInformation(IntPtr hServer, int sessionId, WTS_INFO_CLASS wtsInfoClass, out IntPtr pBuffer, out int pBytesReturned);
[DllImport("wtsapi32.dll", CharSet = CharSet.Ansi, SetLastError = false)]
public static extern int WTSEnumerateSessions(IntPtr hServer, int Reserved, int Version, out IntPtr pSessionInfo, out int pCount);
[DllImport("wtsapi32.dll", CharSet = CharSet.Auto, SetLastError = false)]
public static extern void WTSFreeMemory(IntPtr pMemory);
[DllImport("winsta.dll", CharSet = CharSet.Auto, SetLastError = false)]
public static extern int WinStationQueryInformation(IntPtr hServer, int sessionId, int information, ref WINSTATIONINFORMATIONW pBuffer, int bufferLength, ref int returnedLength);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = false)]
public static extern int GetCurrentProcessId();
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = false)]
public static extern bool ProcessIdToSessionId(int processId, ref int pSessionId);
public class TerminalSessionData
{
public int SessionId;
public string ConnectionState;
public string SessionName;
public bool IsUserSession;
public TerminalSessionData(int sessionId, string connState, string sessionName, bool isUserSession)
{
SessionId = sessionId;
ConnectionState = connState;
SessionName = sessionName;
IsUserSession = isUserSession;
}
}
public class TerminalSessionInfo
{
public string NTAccount;
public string SID;
public string UserName;
public string DomainName;
public int SessionId;
public string SessionName;
public string ConnectState;
public bool IsCurrentSession;
public bool IsConsoleSession;
public bool IsActiveUserSession;
public bool IsUserSession;
public bool IsRdpSession;
public bool IsLocalAdmin;
public DateTime? LogonTime;
public TimeSpan? IdleTime;
public DateTime? DisconnectTime;
public string ClientName;
public string ClientProtocolType;
public string ClientDirectory;
public int ClientBuildNumber;
}
[StructLayout(LayoutKind.Sequential)]
private struct WTS_SESSION_INFO
{
public Int32 SessionId;
[MarshalAs(UnmanagedType.LPStr)]
public string SessionName;
public WTS_CONNECTSTATE_CLASS State;
}
[StructLayout(LayoutKind.Sequential)]
public struct WINSTATIONINFORMATIONW
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 70)]
private byte[] Reserved1;
public int SessionId;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
private byte[] Reserved2;
public FILETIME ConnectTime;
public FILETIME DisconnectTime;
public FILETIME LastInputTime;
public FILETIME LoginTime;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1096)]
private byte[] Reserved3;
public FILETIME CurrentTime;
}
public enum WINSTATIONINFOCLASS
{
WinStationInformation = 8
}
public enum WTS_CONNECTSTATE_CLASS
{
Active,
Connected,
ConnectQuery,
Shadow,
Disconnected,
Idle,
Listen,
Reset,
Down,
Init
}
public enum WTS_INFO_CLASS
{
SessionId=4,
UserName,
SessionName,
DomainName,
ConnectState,
ClientBuildNumber,
ClientName,
ClientDirectory,
ClientProtocolType=16
}
private static IntPtr OpenServer(string Name)
{
IntPtr server = WTSOpenServer(Name);
return server;
}
private static void CloseServer(IntPtr ServerHandle)
{
WTSCloseServer(ServerHandle);
}
private static IList PtrToStructureList(IntPtr ppList, int count) where T : struct
{
List result = new List();
long pointer = ppList.ToInt64();
int sizeOf = Marshal.SizeOf(typeof(T));
for (int index = 0; index < count; index++)
{
T item = (T) Marshal.PtrToStructure(new IntPtr(pointer), typeof(T));
result.Add(item);
pointer += sizeOf;
}
return result;
}
public static DateTime? FileTimeToDateTime(FILETIME ft)
{
if (ft.dwHighDateTime == 0 && ft.dwLowDateTime == 0)
{
return null;
}
long hFT = (((long) ft.dwHighDateTime) << 32) + ft.dwLowDateTime;
return DateTime.FromFileTime(hFT);
}
public static WINSTATIONINFORMATIONW GetWinStationInformation(IntPtr server, int sessionId)
{
int retLen = 0;
WINSTATIONINFORMATIONW wsInfo = new WINSTATIONINFORMATIONW();
WinStationQueryInformation(server, sessionId, (int) WINSTATIONINFOCLASS.WinStationInformation, ref wsInfo, Marshal.SizeOf(typeof(WINSTATIONINFORMATIONW)), ref retLen);
return wsInfo;
}
public static TerminalSessionData[] ListSessions(string ServerName)
{
IntPtr server = IntPtr.Zero;
if (ServerName == "localhost" || ServerName == String.Empty)
{
ServerName = Environment.MachineName;
}
List results = new List();
try
{
server = OpenServer(ServerName);
IntPtr ppSessionInfo = IntPtr.Zero;
int count;
bool _isUserSession = false;
IList sessionsInfo;
if (WTSEnumerateSessions(server, 0, 1, out ppSessionInfo, out count) == 0)
{
throw new Win32Exception();
}
try
{
sessionsInfo = PtrToStructureList(ppSessionInfo, count);
}
finally
{
WTSFreeMemory(ppSessionInfo);
}
foreach (WTS_SESSION_INFO sessionInfo in sessionsInfo)
{
if (sessionInfo.SessionName != "Services" && sessionInfo.SessionName != "RDP-Tcp")
{
_isUserSession = true;
}
results.Add(new TerminalSessionData(sessionInfo.SessionId, sessionInfo.State.ToString(), sessionInfo.SessionName, _isUserSession));
_isUserSession = false;
}
}
finally
{
CloseServer(server);
}
TerminalSessionData[] returnData = results.ToArray();
return returnData;
}
public static TerminalSessionInfo GetSessionInfo(string ServerName, int SessionId)
{
IntPtr server = IntPtr.Zero;
IntPtr buffer = IntPtr.Zero;
int bytesReturned;
TerminalSessionInfo data = new TerminalSessionInfo();
bool _IsCurrentSessionId = false;
bool _IsConsoleSession = false;
bool _IsUserSession = false;
int currentSessionID = 0;
string _NTAccount = String.Empty;
if (ServerName == "localhost" || ServerName == String.Empty)
{
ServerName = Environment.MachineName;
}
if (ProcessIdToSessionId(GetCurrentProcessId(), ref currentSessionID) == false)
{
currentSessionID = -1;
}
// Get all members of the local administrators group
bool _IsLocalAdminCheckSuccess = false;
List localAdminGroupSidsList = new List();
try
{
DirectoryEntry localMachine = new DirectoryEntry("WinNT://" + ServerName + ",Computer");
string localAdminGroupName = new SecurityIdentifier("S-1-5-32-544").Translate(typeof(NTAccount)).Value.Split('\\')[1];
DirectoryEntry admGroup = localMachine.Children.Find(localAdminGroupName, "group");
object members = admGroup.Invoke("members", null);
string validSidPattern = @"^S-\d-\d+-(\d+-){1,14}\d+$";
foreach (object groupMember in (IEnumerable)members)
{
DirectoryEntry member = new DirectoryEntry(groupMember);
if (member.Name != String.Empty)
{
if (Regex.IsMatch(member.Name, validSidPattern))
{
localAdminGroupSidsList.Add(member.Name);
}
else
{
localAdminGroupSidsList.Add((new NTAccount(member.Name)).Translate(typeof(SecurityIdentifier)).Value);
}
}
}
_IsLocalAdminCheckSuccess = true;
}
catch { }
try
{
server = OpenServer(ServerName);
if (WTSQuerySessionInformation(server, SessionId, WTS_INFO_CLASS.ClientBuildNumber, out buffer, out bytesReturned) == false)
{
return data;
}
int lData = Marshal.ReadInt32(buffer);
data.ClientBuildNumber = lData;
if (WTSQuerySessionInformation(server, SessionId, WTS_INFO_CLASS.ClientDirectory, out buffer, out bytesReturned) == false)
{
return data;
}
string strData = Marshal.PtrToStringAnsi(buffer);
data.ClientDirectory = strData;
if (WTSQuerySessionInformation(server, SessionId, WTS_INFO_CLASS.ClientName, out buffer, out bytesReturned) == false)
{
return data;
}
strData = Marshal.PtrToStringAnsi(buffer);
data.ClientName = strData;
if (WTSQuerySessionInformation(server, SessionId, WTS_INFO_CLASS.ClientProtocolType, out buffer, out bytesReturned) == false)
{
return data;
}
Int16 intData = Marshal.ReadInt16(buffer);
if (intData == 2)
{
strData = "RDP";
data.IsRdpSession = true;
}
else
{
strData = "";
data.IsRdpSession = false;
}
data.ClientProtocolType = strData;
if (WTSQuerySessionInformation(server, SessionId, WTS_INFO_CLASS.ConnectState, out buffer, out bytesReturned) == false)
{
return data;
}
lData = Marshal.ReadInt32(buffer);
data.ConnectState = ((WTS_CONNECTSTATE_CLASS) lData).ToString();
if (WTSQuerySessionInformation(server, SessionId, WTS_INFO_CLASS.SessionId, out buffer, out bytesReturned) == false)
{
return data;
}
lData = Marshal.ReadInt32(buffer);
data.SessionId = lData;
if (WTSQuerySessionInformation(server, SessionId, WTS_INFO_CLASS.DomainName, out buffer, out bytesReturned) == false)
{
return data;
}
strData = Marshal.PtrToStringAnsi(buffer).ToUpper();
data.DomainName = strData;
if (strData != String.Empty)
{
_NTAccount = strData;
}
if (WTSQuerySessionInformation(server, SessionId, WTS_INFO_CLASS.UserName, out buffer, out bytesReturned) == false)
{
return data;
}
strData = Marshal.PtrToStringAnsi(buffer);
data.UserName = strData;
if (strData != String.Empty)
{
data.NTAccount = _NTAccount + "\\" + strData;
string _Sid = (new NTAccount(_NTAccount + "\\" + strData)).Translate(typeof(SecurityIdentifier)).Value;
data.SID = _Sid;
if (_IsLocalAdminCheckSuccess == true)
{
foreach (string localAdminGroupSid in localAdminGroupSidsList)
{
if (localAdminGroupSid == _Sid)
{
data.IsLocalAdmin = true;
break;
}
else
{
data.IsLocalAdmin = false;
}
}
}
}
if (WTSQuerySessionInformation(server, SessionId, WTS_INFO_CLASS.SessionName, out buffer, out bytesReturned) == false)
{
return data;
}
strData = Marshal.PtrToStringAnsi(buffer);
data.SessionName = strData;
if (strData != "Services" && strData != "RDP-Tcp" && data.UserName != String.Empty)
{
_IsUserSession = true;
}
data.IsUserSession = _IsUserSession;
if (strData == "Console")
{
_IsConsoleSession = true;
}
data.IsConsoleSession = _IsConsoleSession;
WINSTATIONINFORMATIONW wsInfo = GetWinStationInformation(server, SessionId);
DateTime? _loginTime = FileTimeToDateTime(wsInfo.LoginTime);
DateTime? _lastInputTime = FileTimeToDateTime(wsInfo.LastInputTime);
DateTime? _disconnectTime = FileTimeToDateTime(wsInfo.DisconnectTime);
DateTime? _currentTime = FileTimeToDateTime(wsInfo.CurrentTime);
TimeSpan? _idleTime = (_currentTime != null && _lastInputTime != null) ? _currentTime.Value - _lastInputTime.Value : TimeSpan.Zero;
data.LogonTime = _loginTime;
data.IdleTime = _idleTime;
data.DisconnectTime = _disconnectTime;
if (currentSessionID == SessionId)
{
_IsCurrentSessionId = true;
}
data.IsCurrentSession = _IsCurrentSessionId;
}
finally
{
WTSFreeMemory(buffer);
buffer = IntPtr.Zero;
CloseServer(server);
}
return data;
}
public static TerminalSessionInfo[] GetUserSessionInfo(string ServerName)
{
if (ServerName == "localhost" || ServerName == String.Empty)
{
ServerName = Environment.MachineName;
}
// Find and get detailed information for all user sessions
// Also determine the active user session. If a console user exists, then that will be the active user session.
// If no console user exists but users are logged in, such as on terminal servers, then select the first logged-in non-console user that is either 'Active' or 'Connected' as the active user.
TerminalSessionData[] sessions = ListSessions(ServerName);
TerminalSessionInfo sessionInfo = new TerminalSessionInfo();
List userSessionsInfo = new List();
string firstActiveUserNTAccount = String.Empty;
bool IsActiveUserSessionSet = false;
foreach (TerminalSessionData session in sessions)
{
if (session.IsUserSession == true)
{
sessionInfo = GetSessionInfo(ServerName, session.SessionId);
if (sessionInfo.IsUserSession == true)
{
if ((firstActiveUserNTAccount == String.Empty) && (sessionInfo.ConnectState == "Active" || sessionInfo.ConnectState == "Connected"))
{
firstActiveUserNTAccount = sessionInfo.NTAccount;
}
if (sessionInfo.IsConsoleSession == true)
{
sessionInfo.IsActiveUserSession = true;
IsActiveUserSessionSet = true;
}
else
{
sessionInfo.IsActiveUserSession = false;
}
userSessionsInfo.Add(sessionInfo);
}
}
}
TerminalSessionInfo[] userSessions = userSessionsInfo.ToArray();
if (IsActiveUserSessionSet == false)
{
foreach (TerminalSessionInfo userSession in userSessions)
{
if (userSession.NTAccount == firstActiveUserNTAccount)
{
userSession.IsActiveUserSession = true;
break;
}
}
}
return userSessions;
}
}
}
"@
[string[]]$ReferencedAssemblies = 'System.Drawing', 'System.Windows.Forms', 'System.DirectoryServices'
Add-Type -TypeDefinition $signature -ReferencedAssemblies $ReferencedAssemblies -IgnoreWarnings -ErrorAction 'Stop'
}
#Region ITAlertScript
# This variable contains the contents of the script that will be written to the script that will generate the toast.
$InvokeITAlertToastContents = @'
$AlertConfig = Get-Content -Path "$PSScriptRoot\alertconfig.json" -ErrorAction Ignore | Out-String
If ([string]::IsNullOrEmpty($AlertConfig)){
exit 3
}
$Config = ConvertFrom-Json -InputObject $AlertConfig
$Scenario = $Config.Scenario # 'Reminder' #Possible values are: reminder | short | long --- How long displayed::: Reminder: Until Dismissed, Short: 5 seconds, Long: 25 seconds
$HeaderText = $Config.HeaderText #'Important message from IT...'
$AttributionText = $Config.AttributionText #'Notice Time: ' + (Get-Date -Format 'MM/dd/yyyy @ hh:mm tt')
$TitleText = $Config.TitleText #'IT Mail System Offline'
$BodyText1 = $Config.BodyText1 #"There currently is an outage with Microsoft's cloud services. This is effecting access to email, MyApps, Sharepoint and various other online services."
$BodyText2 = $Config.BodyText2 #"Currently there is no estimated time to repair. We will send an update via toast notice in 2 hours or email when repaired."
$DismissButtonContent = $Config.DismissButtonContent #'Dismiss' #'Acknowledged'
$HeroImage = "${Env:Temp}\ToastHeroImage.jpg"
$B64HeroImage = @"
/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAABQAAD/4QMXaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49
Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29y
ZSA1LjYtYzE0OCA3OS4xNjM4NTgsIDIwMTkvMDMvMDYtMDM6MTg6MzYgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8w
Mi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0v
IiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hh
cC8xLjAvIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjYzN0Y0MTE4Mzc3RDExRUJBOEU1OEEzMEFGMjI1NEM3IiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjYz
N0Y0MTE3Mzc3RDExRUJBOEU1OEEzMEFGMjI1NEM3IiB4bXA6Q3JlYXRvclRvb2w9InBhaW50Lm5ldCA0LjIuMTAiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5z
dGFuY2VJRD0idXVpZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHN0UmVmOmRvY3VtZW50SUQ9IjQxMTM3QUQxQzM2QzJGQzIxRjQzOTk3OUZG
QjY2QkI3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+/+4ADkFkb2JlAGTAAAAAAf/bAIQAAgIC
AgICAgICAgMCAgIDBAMCAgMEBQQEBAQEBQYFBQUFBQUGBgcHCAcHBgkJCgoJCQwMDAwMDAwMDAwMDAwMDAEDAwMFBAUJBgYJDQsJCw0PDg4ODg8PDAwMDAwPDwwMDAwM
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
"@
[byte[]]$Bytes = [convert]::FromBase64String($B64HeroImage)
[System.IO.File]::WriteAllBytes($HeroImage,$Bytes)
$LogoImage = "${Env:Temp}\ToastLogoImage.jpg"
$B64LogoImage = @"
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
"@
[byte[]]$Bytes = [convert]::FromBase64String($B64LogoImage)
[System.IO.File]::WriteAllBytes($LogoImage,$Bytes)
[xml]$Toast = @"
$HeaderText
$AttributionText
$TitleText
$BodyText1
$BodyText2
"@
#$App = "Microsoft.SoftwareCenter.DesktopToasts"
$App = "{1AC14E77-02E7-4E5D-B744-2EB1AE5198B7}\WindowsPowerShell\v1.0\powershell.exe"
[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] > $nul
[Windows.Data.Xml.Dom.XmlDocument, Windows.Data.Xml.Dom.XmlDocument, ContentType = WindowsRuntime] > $nul
# Load the notification into the required format
$ToastXml = New-Object -TypeName Windows.Data.Xml.Dom.XmlDocument
$ToastXml.LoadXml($Toast.OuterXml)
[Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier($App).Show($ToastXml)
'@
#EndRegion ITAlertScript
Add-PSADTCustom
[Security.Principal.WindowsIdentity]$CurrentProcessToken = [Security.Principal.WindowsIdentity]::GetCurrent()
[boolean]$IsAdmin = [boolean]($CurrentProcessToken.Groups -contains [Security.Principal.SecurityIdentifier]'S-1-5-32-544')
[psobject]$RunAsActiveUser = Get-LoggedOnUser | Where-Object { $_.IsActiveUserSession }
$dirAppDeployTemp = 'C:\Temp'
$Configs = [PSCustomObject]@{
Scenario = "$Scenario";
HeaderText = "$HeaderText";
AttributionText = "Notice Time: $AlertTime"
TitleText = "$TitleText";
BodyText1 = "$BodyText1";
BodyText2 = "$BodyText2";
DismissButtonContent = "$DismissButtonText";
Expiration = $Expiration
}
ConvertTo-Json $Configs > "$dirAppDeployTemp\alertconfig.json"
$InvokeITAlertToastContents > $dirAppDeployTemp\Invoke-ITAlertToast.ps1
Invoke-ProcessAsUser -Path 'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe' -Parameters "-ExecutionPolicy Bypass -NoProfile -File $dirAppDeployTemp\Invoke-ITAlertToast.ps1"
Start-Sleep -Seconds 10
Remove-Item -Path "$dirAppDeployTemp\Invoke-ITAlertToast.ps1"
Remove-Item -Path "$dirAppDeployTemp\alertconfig.json"