Posted in: Windows server

Ruční řízení synchronizace Azure AD Connect

Dnes Vám ukáži primitivní skript, kterým je možné zjisti stav synchronizace a případně ručně spustit synchronizaci AD s Azure AD.

<#
    Skript vypíše stav synchronizace Azure ADconnect,
    provede pravidelnou nebo celou synchronizaci.
    Skript musí běžet na PC, kde je instalován Azure ADconnect.
#>
$volba = 0
Write-Host "volba 1: Zjištěnís tavu synchronizace"
Write-Host "volba 2: Spustí synchrnizaci"
Write-Host "volba 3: Spustí úplnou (iniciální) synchronizaci"
switch($volba)

$volba = Read-Host -Promt "Zadej volbu"
{
    1{Get-ADSyncScheduler}
    2{Start-ADSyncSyncCycle -PolicyType Delta}
    3{Start-ADSyncSyncCycle -PolicyType Initial}
}
Posted in: Windows server

Jak přenést či zálohovat role a funkce Windows Serveru?

Dnes si představíme malý PowerShell skript, který Vám pomůže přenést všechny role a funkce z jednoho serveru na druhý. Na takto připraveném serveru je možné následně využít nástrojů pro migraci serveru, které dokáže exportovat a importovat jednotlivé konfigrace různých rolí a funcí serveru. Základem ovšem zůstává mít instalované stejné role a funkce na starém i novém stroji a to jak vše provést na 2 spuštění sktriptu a přeneseníé jednoho TXT souboru si ukážeme.

Nejprve je potřeba si uložit následující skript:

Function MigraceRoliFunkci
{
    Param(
        [Parameter(Mandatory=$true)]
        [String]$soubor = "C:\Users\Public\features.txt",
        [Parameter(Mandatory=$false)]
        [Switch]$Import
    )
    if($Import)
    {
        $file = Get-Content $soubor;
        $radek = ($file.Count) - 3;
        $role = Get-Content $soubor -Tail $radek
        foreach ($f in $role)
        {
            Install-WindowsFeature -Name $f -IncludeManagementTools
        }
        Write-Host "Restartujte server co nejdříve!"
    }
    else
    {
        Get-WindowsFeature | Where-Object {$_. installstate -eq "installed"} | select name | Out-File -FilePath $soubor
        Write-Host "Vyzvednete si vygenerovany soubor pro import."
    }
}

Nyní jej můžeme spustit na starém serveru a následně zavolat funkci například takto:
MigraceRoliFunkci -soubor E:\funkce.txt
Nyní skriprt spustí export seznamu rolí a funkcí za našeho starého serveru na náš disk E do souboru funkce.txt.
Disk E přeneseme na nový server, kde pro zjednodušení bude mít také písmeno E, spustíme náš skript a opět budeme volat funkci:
MigraceRoliFunkci -soubor E:\funkce.txt -Import
Nyní naše funkce provede instalaci všech rolí a funkcí, které nalezne v souboru funkce.csv. Po dokončení instalace máme server připraven k importu nastavení, ale o tom až někdy jindy.

Posted in: Vývoj počítačů, Windows server

Auditování členství v Domain Admin

Skupina doménových administrátorů je skupinou velmi privilegovaných a citlivých účtů, tito uživatelé jsou prakticky pány celé sítě. Z toho důvodu se případní útočníci po tom, co se dostanou do sítě snaží přidat do této skupiny, což jim otevře prakticky neomezenou moc legitimní cestou. V tomto článku ukáži jednu možnost, která dokáže legitimním správcům dát informaci o tom, že se někdo přidal do této skupiny. PowerShellový skript pošle email a jediné co je potřeba, aby tento skript byl spuštěn spolu s operačním systémem doménového řadiče.

$ref=(Get-ADGroupMember -Identity "Domain Admins").Name
Start-Sleep -Seconds 86398
$diff=(Get-ADGroupMember -Identity "Domain Admins").Name
$date=Get-Date -Format F
$result=(Compare-Object -ReferenceObject $ref -DifferenceObject $diff | Where-Object {$_.SideIndicator -eq "=>"} | Select-Object -ExpandProperty InputObject) -join ", "
#nastaveni prihlaseni k smtp serveru
$login = #dopln
$password = #dopln
$server = “smtp.office365.com” #smtp pro exchange online
$Port = 587
If ($result)
{
    $Predmet = "Admin Membership Changes | $result was added to the Group"
    $telo = "This alert was generated at $date"
    $From = #dopln
    $To = #dopln
    $SMTPMessage = New-Object System.Net.Mail.MailMessage($From,$To,$Predmet,$telo)
    $SMTPmessage.IsBodyHTML = $false
    $SMTPClient = New-Object Net.Mail.SmtpClient($server, $Port)
    $SMTPClient.Credentials = New-Object System.Net.NetworkCredential($login, $password)
    $SMTPClient.EnableSsl = $true
    $SMTPClient.Send($SMTPMessage)
} 
Posted in: Windows 10, Windows 11, Windows 8 a 8.1, Windows server

Doba trvání relace vzdálené plochy

Jako správce můžu mít několik důvodů k tomu, abych potřeboval znát délku otevřených RDP spojení vůči některému ze serverů či počítačů. Nejde jen o dobu aktivně otevřených spojení, ale především o spojení, která jsou odpojená. Odpojená spojení nadále čerpají prostředky zařízení, ale pro uživatele jsou pohodlná, protože se kdykoliv mohou připojit k své již rozdělané práci. Tato spojení může ukončit uživatel, odhlášením se, administrátor např. pomocí správce úloh, nebo je ukončí restart systému, vůči kterému jsou otevřena. Příkladem může být snímek ze správce úloh, který poskytuje web WOSHUB.

Informace o otevřených spojeních, včetně délky jejich trvání je možní získat příkazem:

quser

Podrobnější informace, včetně přepočtené délky trvání relací, je pak možné získat pomocí PowerShellu:

Get-RDUserSession -ConnectionBroker $env:COMPUTERNAME |select-object -Property CollectionName, HostServer, DomainName, UserName, ServerIPAddress, CreateTime, DisconnectTime,  SessionState, IdleTime , SessionID , `
@{Name='SessionAge ([days.]hours:minutes)';Expression={ ((get-date ) - $_.CreateTime) } }

Nastavení limitu relace vzdálené plochy

Je více možností, jak nastavit parametry relací vzdálené plochy. Pokud je nasazena a licencována služba Server Vzdálené plochy, je nejlepší konfigurovat daná nastavení zde.

Běžněji dostupné možnosti jsou buď hromadně pomocí GPO, kdy se využije:

Konfigurace počítače – > zásady – > šablony pro správu – > součásti systému Windows – > služba Vzdálená plocha – > hostitel relací vzdálené plochy – > časové limity relací

Zde jsou k dispozici konfigurace:

  • Nastavte časový limit pro odpojenou relaci;
  • Nastavit časový limit pro aktivní, ale nečinné relace služby Vzdálená plocha — politika umožňuje ukončit nečinné relace RDP, které nemají žádný vstup uživatele (jako je pohyb myši nebo psaní něčeho na klávesnici);
  • Nastavte časový limit pro aktivní relace služby Vzdálená plocha — je to maximální doba jakékoli relace RDP (i aktivní), po které se přepne do odpojeného stavu;
  • Ukončit relaci při dosažení časových limitů — nastavuje čas, po kterém bude RDP session ukončena (odhlášena) namísto jejího odpojení;
  • Nastavte časový limit pro odhlášení relací aplikací RemoteApp.

Výše popsaným konfiguracím GPO odpovídají hodnoty obsažení v registru: HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services

Další možností je omezit délky relací konkrétním uživatelům, což se nastavuje na kartě Relace v rámci vlastností uživatele v Users and Computers ADDS. Nastavení je možné vyvolat rovněž pomocí centra pro správu AD.

Pokud nám omezení doby relací nefunguje a v prohlížeči událostí se objevuje událost ID 26:

je potřeba provést následující příkaz PowerShellu:

Set-WmiInstance -Path "\\localhost\root\CIMV2\TerminalServices:Win32_TSSessionSetting.TerminalName='RDP-Tcp'" -Argument @{EnableTimeoutWarning=0
Posted in: Windows server

Vylepšená kontrola hesel uživatelů v Active Directory

Již před delším časem jsem publikoval sktript, který pracuje s modulem DSinternals Michaela Grafnettera a kontroloval hesla uživatelů proti databázi uniklých hesel. Dnes publikuji jeho vyleošenou verzi, která je pohodlnější na zadávání informací potřebných ke kontrole.
Prerekvizitou je nainstalovaný modul DSinternals, což lze provést příkazem:

Install-Module DSInternals -Force$rezim = Read-Host -Prompt "Plně textový režim?(A/N) (pokud ne, cestyk souborům jsou zadány výběrovým dialogem)"
if(($rezim -eq "A") -or ($rezim -eq "a") -or ($rezim -eq "y") -or ($rezim -eq "Y"))
{
$ntdsPath = Read-Host -Prompt "Zadej cestu k ntds.dit"
$systempath = Read-Host -Prompt "Zadej cestu k souboru registru SYSTEM z DC"
$slovnik = Read-Host -Prompt "Zadej cestu k souboru slovníku"
$vystup = Read-Host -Prompt "Zadej cestu k výstupnímu souboru"
}
else
{
Add-Type -AssemblyName System.Windows.Forms
$shell = New-Object -ComObject Shell.Application
[void] [System.Windows.MessageBox]::Show( "Vyber soubor ntds.dit ", "Script completed", "OK", "Information" )
$OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog
$OpenFileDialog.Multiselect = $false
$response = $OpenFileDialog.ShowDialog( )
if ( $response -eq 'OK' ) { $ntdsPath = $OpenFileDialog.FileName }
[void] [System.Windows.MessageBox]::Show( "Vyber soubor SYSTEM z DC", "Script completed", "OK", "Information" )
$response = $OpenFileDialog.ShowDialog( )
if ( $response -eq 'OK' ) { $systempath = $OpenFileDialog.FileName }
[void] [System.Windows.MessageBox]::Show( "Vyber soubor slovníku hesel", "Script completed", "OK", "Information" )
$response = $OpenFileDialog.ShowDialog( )
if ( $response -eq 'OK' ) { $slovnik = $OpenFileDialog.FileName }
[void] [System.Windows.MessageBox]::Show( "Vyber umístění výstupního souboru", "Script completed", "OK", "Information" )
$selectedfolder = $shell.BrowseForFolder( 0, 'Select a folder to proceed', 16, $shell.NameSpace( 17 ).Self.Path ).Self.Path
$vystup = $selectedfolder + "\" +(Read-Host -Prompt "Zadeh název výstupního souboru") + ".txt"
}
Import-Module -Name DSInternals
$key = Get-BootKey -SystemHivePath $systempath
$hash = Read-Host -Prompt "Je slovník NTLM hash? (Y/N)"
if(($hash -eq "Y") -or ($hash -eq "y"))
{
Get-ADDBAccount -All -DBPath $ntdsPath -BootKey $key | Test-PasswordQuality -WeakPasswordHashesFile $slovnik | Out-File $vystup -Encoding utf8
}
else
{
Get-ADDBAccount -All -DBPath $ntdsPath -BootKey $key | Test-PasswordQuality -WeakPasswordsFile $slovnik | Out-File $vystup -Encoding utf8
}
Posted in: Windows 10, Windows 11, Windows 8 a 8.1, Windows server, Základy PowerShellu

Odesílání emailu pomocí PowerShellu

S moderní autentizací na straně emailových serverů dokážeme i nadále PowerShellem odesílat emaily. Následující kód využívá SMTP Office 365 pro Evropu k odeslání emailu. Kód je určen k uložení ve formátu ps1 a volání s patřičnými parametry. Odesílání emailů tak může zajíst např. zasílání výpisu z logů, nebo odbavovat požadavky v rámci naší serverové aplikace. Po úpravě SMTP serveru zvládne spolupracovat i s jinými emailovými službami.
Zdrojový kód skriptu:


param(
[Parameter(Mandatory=$true, ValueFromPipeline=$true)][string] $userName,
[Parameter(Mandatory=$true, ValueFromPipeline=$true)][string] $password,
[Parameter(Mandatory=$true, ValueFromPipeline=$true)][string[]] $komu,
[Parameter(Mandatory=$true, ValueFromPipeline=$true)][string] $predmet,
[Parameter(Mandatory=$true, ValueFromPipeline=$true)][string] $telo,
[Parameter(Mandatory=$true, ValueFromPipeline=$true)][switch] $teloHTML,
[Parameter(Mandatory=$true, ValueFromPipeline=$true)][switch] $priloha,
[Parameter(Mandatory=$false, ValueFromPipeline=$true)][string] $cestaKpriloze

)
[SecureString]$securepassword = $password | ConvertTo-SecureString -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential -ArgumentList $username, $securepassword
$server = „smtp.office365.com“
$port = 587
if($teloHTML -and $priloha)
{
Send-MailMessage -SmtpServer $server -Port $port -UseSsl -From $userName -To $komu -Subject $predmet -Body $telo -BodyAsHtml -Attachments $cestaKpriloze -Credential $credential
}
elseif($teloHTML)
{
Send-MailMessage -SmtpServer $server -Port $port -UseSsl -From $userName -To $komu -Subject $predmet -Body $telo -BodyAsHtml -Credential $credential
}
elseif($priloha)
{
Send-MailMessage -SmtpServer $server -Port $port -UseSsl -From $userName -To $komu -Subject $predmet -Body $telo -Attachments $cestaKpriloze -Credential $credential
}
else
{
Send-MailMessage -SmtpServer smtp.office365.com -Port 587 -UseSsl -From $userName -To $komu -Subject $predmet -Body $telo -Credential $credential
}

Posted in: Windows server

Script pro zálohu AD

Jednou z možností, jak zálohovat AD nezávisle na zálohování serveru, nebo jak připravit kopii AD k analýze či tvorbě RODC, je nástroj ndsutil. Kroky k vytvoření média pro tvorbu nového řadiče (tedy i možnost obnovit AD do čisté instalace Windows serveru) lze automatizovat, aby se mohly vykonávat pravidelně.

Dávkový soubor pro příkazovou řádku (tedy .cmd) může vypadat např.:

md F:\Zaloha\IFM
ntdsutil "activate instance ntds" IFM "create full F:\Zaloha\IFM" q q
ntdsutil "activate instance ntds" IFM "create sysvol full F:\Zaloha\IFM\Sysvol" q q
Xcopy F:\Zaloha\IFM "E:\Shares\Scripts\IFM" /E /H /C /I /Y
rmdir /s /q "F:\Zaloha\IFM"

Pokus bychom chtěli, aby se nám zálohvalo AD pravidelně na nějaké místo v síti, či do adresáře, který bude synchronizován do cloudu, můžeme použít PowerShell a tvořit následovně:

$adresar = "F:\Zaloha\IFM"
New-Item -Path $adresar -Name (Get-Date).ToString("ddMMyyyy") -ItemType "directory"
$cesta = "$adresar\"+(Get-Date).ToString("ddMMyyyy")
ntdsutil "activate instance ntds" IFM "create full $cesta" q q
ntdsutil "activate instance ntds" IFM "create sysvol full $cesta\Sysvol" q q
Back to Top