PowerShell: Andres Kahk, Kasutaja-Sessioon.ps1

From ICO wiki
<#
.SYNOPSIS
	Kasutaja-Sessioon.ps1
	Annab kasutaja loetelu, valitud serverites
.DESCRIPTION
	Otsib ette antud serveritest kõik kasutajad või etteantud kasutaja
	ning lubab teostada valitud kasutajaga terminalsessiooni manipulatsiooni
	(eeldusel et kasutaja on administraatori õigustega)
.PARAMETER UserName
	Otsib nime või nimeosa järgi sobiva kasutaja
.PARAMETER AinultOtsi
	Teostan ainult otsingu valitud kasutajaga, sessiooni tegevusi ei tehta
.PARAMETER ServerList
	Serverite nimekiri kust kasutajat või kasutajaid otsida, vaikeväärtusena on skripti jooksutav arvuti.
.NOTES  
	File Name  : Kasutaja-Sessioon.ps1 
	Author     : Andres Kahk - akahk@itcollege.ee  
	Requires   : PowerShell V2
	Version    : 0.4
.EXAMPLE
	Psh> .\Kasutaja-Sessioon.ps1 -Username kasutaja -ServerList server1,server2
	Psh> .\Kasutaja-Sessioon.ps1 -Username kasutaja -ServerList server1,server2 -AinultOtsi
	Psh> .\Kasutaja-Sessioon.ps1 -Username kasutaja -ServerFile C:\serverlist.txt
 
#>
 
# Deklareerime parameetrid
param(
    [string][parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true)]$UserName,
    [switch]$AinultOtsi,
    [string[]][parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true)]$ServerList=$ENV:COMPUTERNAME,
	[string[]][parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true)]$ServerFile
)
 
# Puhastame akna muudetst teadetest
cls

#Kui antakse serverite list failina, siis ei kasuta parameetrit ServerList
if ($ServerFile)
{
	$Servers = Get-Content $ServerFile
}
else
{
	$Servers = $ServerList
}
 
# Algväärtustame mõned muutujad.
$Result = @()
$Errors = ""
$Users = @()
$Session = @()
 
# Loeme ServerListist ette antud parameetreid ning kogume kokku vajaliku kasutaja info edasiseks toimetuseks
foreach ($Server in $Servers)
{
	Write-Host "Loen kasutajaid serverist $server..." -foregroundcolor red -BackgroundColor yellow
    $Sessions = quser /server:$server
	if ($Sessions -eq $null){$Errors += "Serveriga " + $Server + " ei saanud ühendust või seal polnud ühtegi kasutajat!`r`n"}
	else
	{
       	$i = 1
		while ($i -le ($Sessions.count -1))
		{
	    	$TempResult = "" | Select Nr,Username,Computer,SessionId,State,IdleTime,LogonTime
			$TempResult.Nr = $i
            $TempResult.Username = $Sessions[$i].Substring(1,22).Trim()
			$TempResult.Computer = $Server
			$TempResult.SessionId = $Sessions[$i].Substring(42,4).Trim()
			$TempResult.State = $Sessions[$i].Substring(46,12).Trim()
			$TempResult.IdleTime = $Sessions[$i].Substring(58,7).Trim()			
			$TempResult.LogonTime = $Sessions[$i].Substring(65).Trim()
            $Result += $TempResult
			$i++
		}
	}
}
 
cls
 
#Ühenduse puudumise korral näitame viga, edasi küsime kasutaja nime, kui see pole antud, vajadusel filtreerime välja või näitame kõiki serveri kasutaja sessioone.
Write-Host $Errors -foregroundcolor red -BackgroundColor yellow
Write-Host "Sisestage otsitav kasutajanimi (tühjal väljal enterit vajutades kuvatakse kõik)" -foregroundcolor black -BackgroundColor green
if (!$UserName)
{
    $UserName = read-host "Kasutajanimi"
}
elseif(!$UserName)
{
    cls
    $Users = @($Result)
	$Users | where{$_.UserName -ne ""} | Sort-Object UserName | Format-Table -AutoSize
	"Kokku " + $Result.Count + " sessiooni"
}
 
$Users = @($Result | where{$_.UserName -match $UserName})
if ($Users -eq $null)
{
	cls
	Write-Host "Kasutajanime, mis sisaldaks $UserName ei leitud!" -foregroundcolor red -BackgroundColor yellow
	exit
}
else
{
	cls
	$Users | Sort-Object UserName | Format-Table -AutoSize
 
    if ($AinultOtsi)
    {
        exit
    }
 
#Küsime kasutaja infot kellega sessiooni manipulatsioone edasi teha
	Write-Host $Errors -foregroundcolor red -BackgroundColor yellow
	Write-Host "Sisestage kasutaja Nr kellega soovite toiminguid teostada!" -foregroundcolor black -BackgroundColor green	
	$SessionNr = Read-Host "Valik"	
	$Session = $Users[$SessionNr - 1]
    if (!$Session)
    {
        Write-Host "Sellist kasutajat pole, katkestan" -foregroundcolor red -BackgroundColor yellow
        exit
    }
 
   	cls
    $Session | Format-Table
 
	write-host "Teha valitud kasutajale: Logoff (l), Disconnect (d), Sessiooni reset (r) või ära tee midagi (enter)" -foregroundcolor black -BackgroundColor green
 
	$Task = Read-Host "Valik"
	if ($Task -like "l"){$Param = "/server:`"" + $Session.Computer + "`"";logoff $Session.SessionId $Param /v}
    elseif ($Task -like "d"){$Param = "/server:`"" + $Session.Computer + "`"";tsdiscon $Session.SessionId $Param /v}
    elseif ($Task -like "r"){$Param = "/server:`"" + $Session.Computer + "`"";reset session $Session.SessionId $Param /v}
    else {cls;"Tegevuse valik ei sobinud"}
}