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

Výpis přihlašovacích údajů a pověření z trezoru Windows

Následující PowerShell příkaz vypíše obsah trezoru systému Windows:

[void][Windows.Security.Credentials.PasswordVault,Windows.Security.Credentials,ContentType=WindowsRuntime];$vault = New-Object Windows.Security.Credentials.PasswordVault;$vault.RetrieveAll() | % { $_.RetrievePassword();$_} | Select UserName, Resource, Password | Format-Table

V trezoru Windows jsou především síťová pověření, ale i přístupy k webovým službám pomocí IE, či jiného podporovaného programu.

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 10, Windows 11, Windows 8 a 8.1, Windows server, Základy PowerShellu

Generování hesel v PowerShellu

Každý správce, který se stará o nějaký identitní systém, potřebuje vymýšlet bezpečná jednorázová hesla. K tomu mu může sloužit například následující kousek PowerShell kódu:

$delka = 10
$specZnaku = 2
Add-Type -AssemblyName System.Web
[System.Web.Security.Membership]::GeneratePassword($delka,$specZnaku)

Verze, která nevyužívá volání .NET:

function Generate-Password
{
param
(
[int] $delka = 12,
[switch] $specZnak
)
$length = $delka
if($specZnak)
{
$charSet = ‚abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789{]+-[*=@:)}$^%;(_!&#?>/|.‘.ToCharArray()
}
else
{
$charSet = ‚abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789‘.ToCharArray()
}
$rng = New-Object System.Security.Cryptography.RNGCryptoServiceProvider
$bytes = New-Object byte
$rng.GetBytes($bytes)
$result = New-Object char
for ($i = 0 ; $i -lt $length ; $i++) {
$result[$i] = $charSet[$bytes[$i]%$charSet.Length]
}
return (-join $result)
}

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
Posted in: Windows 10, Windows 11, Windows 8 a 8.1, Windows server

Vypsání originálního produktového klíče Windows

V systému Windows není možné na pár kliknutí zobrazit původní produktorý klíč. V nastavení Windows je zobrazen v položce aktivace koncovka (posledních několik znaků) produktového klíče, pod kterým je daný systém aktivovaný.
Úplný produktový klíč jde zobrazit pomocí CIM rozhraní s využitím příkazové řádky.

1) Spustit příkazovou řádku jako správce
2) zadat příkaz: wmic path softwarelicensingservice get OA3xOriginalProductKey

Další variantou jsou aplikace pro zobrazování produktových klíčů, které jej dokáži vypsat z registru. Dané aplikace využívají VBS, který ve zjednodušené podobě může vypadat následovně:

Set WshShell = CreateObject(„WScript.Shell“)
MsgBox ConvertToKey(WshShell.RegRead(„HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\DigitalProductId“))
Function ConvertToKey(Key)
Const KeyOffset = 52
i = 28
Chars = „BCDFGHJKMPQRTVWXY2346789“
Do
Cur = 0
x = 14
Do
Cur = Cur * 256
Cur = Key(x + KeyOffset) + Cur
Key(x + KeyOffset) = (Cur \ 24) And 255
Cur = Cur Mod 24
x = x -1
Loop While x >= 0
i = i -1
KeyOutput = Mid(Chars, Cur + 1, 1) & KeyOutput
If (((29 – i) Mod 6) = 0) And (i <> -1) Then
i = i -1
KeyOutput = „-“ & KeyOutput
End If
Loop While i >= 0
ConvertToKey = KeyOutput
End Function

Posted in: Windows server

Synchronizace 2 složek

Microsoft SyncTool

SyncTool je jedním ze starších drobných nástrojů Microsoftu, který umožňuje provádět synchronizace 2 složek (jedna může být mapovaný síťový disk). Bohužel není možné, aby jednou stranou synchronizace byl cloud, na druhou stranu umí v grafické podobě provést synchronizaci obsahu složek, kterou si jinak mi správci skriptujem na nastavujeme pomocí plánovaných úloh.

Back to Top