#Requires -Version 5.1 <# IT Admin Tool - GUI nastroj pro spravu Windows stanic - Hromadna instalace aplikaci (winget) - Odinstalace bloatware (Appx) - Uzitecna systemova nastaveni - Diagnosticke prikazy (chkdsk, sfc, dism...) Firemni barvy: #0062ae (modra), #ffc627 (zluta) #> # --------------------------------------------------------------------------- # 0) Elevace - skript musi bezet jako Administrator # --------------------------------------------------------------------------- $currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent()) if (-not $currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) { Start-Process powershell.exe -Verb RunAs -ArgumentList "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`"" exit } Add-Type -AssemblyName PresentationFramework, PresentationCore, WindowsBase, System.Windows.Forms, System.Drawing # Vlastni AppUserModelID - bez tohoto Windows casto na panelu uloh vezme ikonu # primo z powershell.exe (identitu okna odvozuje od spustitelneho souboru procesu), # bez ohledu na to, co nastavime pres Window.Icon / WM_SETICON. Add-Type -Name Win32Aumid -Namespace ITAdminTool -MemberDefinition @' [DllImport("shell32.dll", SetLastError = true)] public static extern int SetCurrentProcessExplicitAppUserModelID([MarshalAs(UnmanagedType.LPWStr)] string AppID); '@ [ITAdminTool.Win32Aumid]::SetCurrentProcessExplicitAppUserModelID("KETNET.ITAdminTool") | Out-Null # Skryti konzoloveho okna powershell.exe (to je puvod PS ikony na panelu ulom) - # WPF okno si pak na panelu jede jako samostatna, vlastni polozka. Add-Type -Name Win32Console -Namespace ITAdminTool -MemberDefinition @' [DllImport("kernel32.dll")] public static extern IntPtr GetConsoleWindow(); [DllImport("user32.dll")] public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); '@ $consoleHwnd = [ITAdminTool.Win32Console]::GetConsoleWindow() if ($consoleHwnd -ne [IntPtr]::Zero) { [ITAdminTool.Win32Console]::ShowWindow($consoleHwnd, 0) | Out-Null # SW_HIDE } # --------------------------------------------------------------------------- # 1) Logovani # --------------------------------------------------------------------------- $Global:LogPath = Join-Path $env:TEMP "ITAdminTool_$(Get-Date -Format 'yyyyMMdd_HHmmss').log" $Global:OdtDir = "C:\ITAdminTool\ODT" $Global:IconPath = Join-Path $env:LOCALAPPDATA "ITAdminTool\icon.ico" function Write-Log { param([string]$Message, [string]$Level = "INFO") $line = "[{0}] [{1}] {2}" -f (Get-Date -Format 'HH:mm:ss'), $Level, $Message Add-Content -Path $Global:LogPath -Value $line -Encoding UTF8 if ($Global:LogBox) { $Global:LogBox.Dispatcher.Invoke([action]{ $Global:LogBox.AppendText("$line`r`n") $Global:LogBox.ScrollToEnd() }) } } # --------------------------------------------------------------------------- # 2) XAML - definice okna (barvy firmy: modra #0062ae, zluta #ffc627) # --------------------------------------------------------------------------- [xml]$xaml = @'