Posted in: Windows 10, Windows 11, Windows 8 a 8.1, Windows server

Zařazení všech počítačů do skupiny v Active Directory

Dnešní příspěvek je opět trocha PowerShellu a jednoduché řešní na zdánlivě triviální problém. Jde o to, jak dostat všechny počítače do určité skupiny (vlastně by se mohlo jedna po drobné úpravě i o uživatele) bez ohledu na to, ve které OU jsou. To může být potřeba například ve chvíli, kdy synchronizujeme jen určitou skupinu mezi AD a AAD pomocí Azure AD Conect.

$skupina = Read-Host -promt "Zadej distinguished name skupiny"
ADD-ADGroupMember -identity "$skupina" -members (Get-ADComputer -Filter * | select SAMAccountName)
Posted in: Vývoj počítačů, Windows 10, Windows 11

Diktování textu v MS Office

Uživatlé sady MS Office v ČR byli dlouho odkázáni na ruční zápis, nebo využití externího SW pro převod mluveného slova na text, který mohli dále upravoat v sadě Office. Nyní je konečně v rámci funkce dikotování dostupná i češti, zatím ovšem jako Preview. Diktování podporují i Office online a také OneNote na webu nebo pro Windows 10, resp. 11. Konkrétněji diktování podporují:

  • Word
  • PowerPoint
  • Outlook

Následující video ukazuje, jak ve Wordu nastavit diktování v češtině a diktovat text.

Možnost diktování souvisí s novinkou v MS Teams, které nově podporují živé titulky schůzek v češtině a také přepis schlzky v češtině.

Posted in: Windows 10, Windows 11, Windows 8 a 8.1

Komprese Windows

Systém Windows obshauje málo známou, ale dobře dokumentovanou funkci compact, která dokáže komprimovat operační systém, vybrané soubory či adresáře. Nejde o tutéž kompresy, který je dosutpná ve vlastnotech diskové jednotky (Komprimovat jednotku a ušetřit místo na disku), která využívá vestavěné komprese NTFS.

Komprese OS ušetří zhruba 3,7 GB místa z 15 GB, které OS zabírá. Výkonové dopady jsou přítomné, ale na slušných SSD a procesorech střední třídy jsou zanedbatelné. Význam má tento nástroj především u zařízení, která mají malé interní uložiště (128 GB a méně), ale může se hodit u mnohem větších disků.

V případě funkce copmact jsou data na disku uloženy v komprimované podobě a při jejich načítání do paměti (myslím operační paměť, lidově RAM) dochází k jejich dekompresy. Pokud byla data změněna, dochází opět k jejich kompresy při zápisu na disk. Chování je obdobné jako v případě komprese datových stránek databází u MS SQL serveru.

Komprese operačního systému

Dotaz na stav komprese:

compact /CompactOS:query

Aktivace komprese:

compact /CompactOS:always

Deaktivace komprese:

compact /CompactOS:never

Komprese SW a dalších adresářů

Příkaz copmpact je možné uplatnit na libovolný adresář či soubor, jen na adresář systému Windows má specifické parametry, viz výše. Rovněž bych dle následujícího nekomprimoval složku profilu uživatele, zde bych kompresy využil pouze na jednotlivé knihovny (Dokumenty, Obrázky, Hudba, Videa). Využití následujících parametrů může vést k pádu OS v případě aplikování na adresář operačního systému.

Pro kompresy obsahu aktuálního adresáře a všech podadresářů se využije příkaz:

compact /c /s

Pokud chceme komprimovact celý disk (ne systémový) využijeme příkaz:

compact /c /i /s:\

Parametr /i zabraňuje chybám přerušit proces komprese. Pokud chceme komprimovat jen vybraný typ souborů (např. bmp), využijte následující příklad:

compact /c /s:\tmp *.bmp

Všechny příkazy uvedené výše, vyjímaje komprese systémového adresáře, lze obohatit o parametr EXE, který tanový použitý algoritmus komprese, címž určí její účinnost, ale také výkonový dopad při přistoupení k danému souburu. Následující kód je příkladem komprese jedné dll ze sady Office pomocí všech podporovaných lgoritmů. Kód je psaný v syntaxi PowerShellu (opravdu lze nástroj compact takto z PowerShellu verze 5.1 a novější volat).

#původní velikost: 39,448,384 bytes
#parametr c značí, že komprese se týká pouze jednoho souboru

#výchozí algoritmus komprese - nejnižší výkonové dopady
compact /exe:xpress4K /c /f "C:\Program Files\Microsoft Office\Office16\Uc.dll"
#výsledná velikost: 18 288 640 bytes
#kompresní poměr: 2,2:1

compact /exe:xpress8K /c /f "C:\Program Files\Microsoft Office\Office16\Uc.dll"
#výsledná velikost: 16 617 472 bytes
#kompresní poměr: 2,4:1

compact /exe:xpress16K /c /f "C:\Program Files\Microsoft Office\Office16\Uc.dll"
#výsledná velikost: 15 704 064 bytes
#kompresní poměr: 2,5:1

compact /exe:lzx /c /f "C:\Program Files\Microsoft Office\Office16\Uc.dll"
#výsledná velikost: 12 001 280 bytes
#kompresní poměr: 3,3:1

Pro zrušení komprese souboru, sožky, nebo jednotky se využívá paramter u.

Virtualizace

Na rozdíl od NTFS komprese na uložišti s virtuálními disky nemám přímou osobní zkušenost, ale i tak bych doporučil kompresy provádět uvnitř virtuálního počítače a případně nástroje virtualzačního SW. Nativní NTFS komprese není podporována pro soubory virtuálních pevných disků, virtuální stroje pak není možné v Hyper-V spoštět.

Neoficiální GUI

Microsoft tento nástroj integroval do Windows jako commandline tools, ale stejně jako k mnohým dalším komunita, nebo někdy i sám Microsoft, dodělá neoficiální GUI. Na Githubu můžete najít GUI právě k nástroji compact.

Posted in: Windows 10, Windows 11, Windows 8 a 8.1, Windows server

Úklid po aktualizacích

Asi obecně známý je nástroj cleanmgr.exe, který slouží k úklidu po aktualizacích, úklidu dočasných souborů, cache apod. Trochu hlubší úklid je možné provést pomocí nástroje DISM (automaticky jej spouští aktualizační proces u servisních aktualizací, ale i zde je lepší uživatelské zpuštění). Úklid pomocí DISM je vhodný rovněž po větších aktualizacích komponent doručených pomocí MS Store. Úklid nástrojem DISM má 2 fáze (stejně jako u cleanmgr.exe), analýzu a následný úklid.

Analýza se spouští příkazem:

DISM.exe /Online /Cleanup-Image /AnalyzeComponentStore

Vlastní úklid pak příkazem:

DISM.exe /Online /Cleanup-Image /StartComponentCleanup

Nezmínil jsem jednu důležitou věc, nástroj DISM vyžaduje na všechny operace (včetně úklidu) práva administrátora, ale to již zkušený uživatel ví a ten nezkušený se to dozví z chybového hlášení 😉

Posted in: Windows 10, Windows 11, Windows 8 a 8.1, Windows server

Plánovaná kontrola disku

Dnešní PowerShell skript vyžaduje práva administrátora a spouští kontrolu zvoleného svazku nástrojem chkdsk.exe.

d1 = get-date -format G
$vstup = Read-Host "Zadej datum a čas spuštění ve formatu: ddMMyyyyHHmm"
$disk = Read-Host "Zadej písmeno svazku ke kontrole (napr. C:)"
If(($disk.Substring($text.Length)) -ne  ":"){
$disk = $disk + ":"
}
$d2 = [datetime]::ParseExact($vstup,'ddMMyyyyHHmm',$null)
[int] $cas = (New-TimeSpan -Start $d1 -End $d2).TotalSeconds
sleep $cas
Invoke-Command -ScriptBlock {
echo y | chkdsk $disk  /F
}
#pro případ skenu systémové jednotky
Restart-Computer -Force 
Posted in: Windows 10, Windows 11

Free VPN pro Windows

Stejně jako nějakou dobu umožňuje Opera využít v rámci webového prohlížeče VPN, dočká se této funkce v brzské budoucnosti nejspíše také Microsoft Edge, který ovšem bude mít datový limit 1 GB na měsíc a uživatele, z čehož plyne, že služba bude vyžadovat přihlášení do prohlížeče pomocí Microsoft účtu. Funkce je zatím ve stádiu pokusu, tudíž ji Microsoft nemusí do některého z příštích produkčních vydání vůbec zařadit.

Služba využívá na pozadí DNS 1.1.1.1 a službu VPN Warp od společnosti CloudFlare. Přímo společnost CloudFlare však umožňuje instalovat VPN klienta do Windows, Linuxu, MacOS, Androidu a iOS. v odkazu níže najde oficiální stránku CloudFlare, která umožní instalovat VPN klienta pro službu Warp, který je free bez datového omezení.

VPN Warp

Posted in: Windows 10, Windows 11

Instalace aplikací z MS Store pro všechny uživatele automaticky

Dnes to bude o tom, jak si stáhnout balíčky aplikací z MS Store a instalovat je, buď pro sebe s tím, že zůstane v definované cestě uložený instalační balíček, nebo po drobné úpravě pro každého, kdo se na PC přihlásí s výhodou, že aplikace se nainstaluje vždy, když ji uživatel nemá z libovolného důvodu. Zde uvedený postup platí pro Windows 10 a 11.
Pro další informace a celý postup je nyní potřeba otevřít článek, dnes není vše na titulce, jak často bývá. Prvním krokem je nalezení balíčku pomocí odkazu z webové verze MS Store, nebo PackageFamilyName na stránce: https://store.rg-adguard.net/, kde můžeme balíček rovnou stáhnout prohlížečem, nebo si na něj zkopírovat přímý odkaz. Tento online nástroj vyhledává přímé odkazy na jednotlivé balíčky v serverech Microsoftu a dokáže vypsat i balíčky závislostí. Prerekvizitní balíčky jako je MS .NET si v tomto režimu musíme hlídat sami, normálně to za nás dělá v procesu instalace MS Store. Nás bude zajímat hlavně nalezený link na balíček.

Generování přímých odkazů na MS Store balíčky

Nyní nastal čas se rozhodnout, zda chci balíček pro sebe instalovat, pokud mi chybí, nebo zda budu chtít nainstalovat balíček všem. Pokud budu chtít balíček pouze pro sebe, pak stačí vyžít následující PowerShell skript:

$install = Read-Host -Prompt „Pouze stáhnout? (A/N)“
if(($install -eq „N“) -or ($install -eq „n“))
{
$link = Read-Host -Prompt „Zadej odkaz z store.rg-adguard.net „
$n = Read-Host -Prompt „Zadej název aplikace, např: RootPro „
$nazev = „*“ + $n + „*“
$soubor = Read-Host -Prompt „Zadej název souboru na disku (např. CAD) „
$typ = Read-Host -Prompt „Zadej typ souboru (appx, appxbundle, nebo msix)“
Write-Host „Vyber složku pro uložení souboru“
$shell = New-Object -ComObject Shell.Application
$cesta = $shell.BrowseForFolder( 0, ‚Select a folder to proceed‘, 16, $shell.NameSpace( 17 ).Self.Path ).Self.Path
if ($typ -eq „appx“) {
$umisteni = $cesta + „\“ + $soubor + „.appx“
}elseif ($typ -eq „appxbundle“) {
$umisteni = $cesta + „\“ + $soubor + „.appxbundle“
}elseif ($typ -eq „msix“) {
$umisteni = $cesta + „\“ + $soubor + „.Msix“
}else
{
Write-Error -Message „Spust skript uznovu a zadej validní typ aplikace“
exit
}
if(Get-AppxPackage | where name -like $nazev)
{
exit
}
else
{
if(Test-Path -Path $umisteni -PathType Leaf)
{
if ($typ -eq „appxbundle“) {
Add-AppxProvisionedPackage -Online -PackagePath $umisteni
}
else
{
Add-AppxPackage -Path $umisteni
}
}
else
{
Invoke-WebRequest -Uri $link -OutFile $umisteni
Add-AppxPackage -Path $umisteni
}
}
}elseif(($install -eq „A“) -or ($install -eq „a“))
{
$link = Read-Host -Prompt „Zadej odkaz z store.rg-adguard.net „
$soubor = Read-Host -Prompt „Zadej název souboru na disku (např. CAD) „
$typ = Read-Host -Prompt „Zadej typ souboru (appx, appxbundle, nebo msix)“
Write-Host „Vyber složku pro uložení souboru“
$shell = New-Object -ComObject Shell.Application
$cesta = $shell.BrowseForFolder( 0, ‚Select a folder to proceed‘, 16, $shell.NameSpace( 17 ).Self.Path ).Self.Path
if ($typ -eq „appx“) {
$umisteni = $cesta + „\“ + $soubor + „.appx“
}elseif ($typ -eq „appxbundle“) {
$umisteni = $cesta + „\“ + $soubor + „.appxbundle“
}elseif ($typ -eq „msix“) {
$umisteni = $cesta + „\“ + $soubor + „.Msix“
}else
{
Write-Error -Message „Spust skript uznovu a zadej validní typ aplikace“
exit
}
Invoke-WebRequest -Uri $link -OutFile $umisteni
}
else {
Write-Error „Chybně zvolen režim, zkus to znovu“
exit
}
#konec skriptu

Dále je postup, jak zajistit instalaci aplikace ze Store pro všechny uživatele na PC

Pokud chci balíček pro všechny uživatele, potřebuji provést celkem 3 kroky, tedy jednoduchý PowerShell, cmd soubor, který jej bude spouštět a registraci do registrů.
PowerShell bude jednoduchý, mohlo by to vypadat nějak takto:

$link = # Zadej odkaz z store.rg-adguard.net
$n = # Zadej název aplikace, např: RootPro
$nazev = „*“ + $n + „*“
$složka = #Zadej umístění balíčku
$format = #Zadej formát balíčku
$cesta = $složka + „\“ + $n + „.“ + $format
if(Get-AppxPackage | where name -like $nazev)
{
exit
}
else
{
if(Test-Path -Path $cesta -PathType Leaf)
{
Add-AppxPackage -Path $cesta
}
else
{
Invoke-WebRequest -Uri $link -OutFile $cesta
Add-AppxPackage -Path $cesta
}
}
#konc skriptu

Dále pak je potřeba volat PowerShell s parametrem spuštění skriptu, který samozřejmě může obsahovat více balíčků. Volání zajistí soubor formát cmd, který bude vypadat například takto: @powershell.exe -NoProfile -ExecutionPolicy Bypass -File „%~dp0StoreAPP.ps1″StoreAPP.ps1 je v našem případě název skriptu, který je uvedený výše. Oba soubory, jak ps1 tak cmd je potřeba umístit do složky, ze které mohou číst a spouštět všichni uživatelé, tedy mimo náš uživatelský profil.
Nyní stačí pomocí registru nastavit spuštění s každým přihlášením libovolného uživatele pod jeho právy, což provedeme zápisem do větve: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

Zápis pomocí příkazu ukazuje následující příklad:
reg add „HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run“ /v „APP“ /t REG_SZ /d „C:\ProgramData\APPinstall.cmd“ /f

Posted in: Windows 10, Windows 11, Windows 8 a 8.1

Změna adresáře profilů uživatele pro všechny nové uživatele

Občas je zapotřebí změnit disk, kde bude uložena složka Users, která je obvykle v cestě: C:\Users.
Tuto možnost máme pro všechny uživatele, které vytvoříme po provedení této konfigurace. Pro změnu tohoto adresáře slouží registrový klíč ProfilesDirectory, který se nachází v:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList

Všichni uživatelé založení po nastavení cesty a restartu systému budou mít své adresáře v novém umístění. Toto nastavení je možné kombinovat s přesměrováním knihoven na síťový disk v rámci GPO nastavení v doméně.

Posted in: Windows 10, Windows 11, Windows 8 a 8.1, Základy PowerShellu

Vytvoření ISO souboru ze složky pomocí PowerShellu

Následující skript, který v článku uveden je převzat z Githubu: https://raw.githubusercontent.com/wikijm/PowerShell-AdminScripts/master/Miscellaneous/New-IsoFile.ps1
Skript je otestován a je v pořádku, na druhou stranu má jednu nevýhodu, kterou je, že nepracuje, pokud je PowerShell v režimu Constrained Language Mode, protože přímo využívá .NET příkazy.

Zdrojový kód skriptu

function New-IsoFile
{
<# .Synopsis Creates a new .iso file .Description The New-IsoFile cmdlet creates a new .iso file containing content from chosen folders .Example New-IsoFile „c:\tools“,“c:Downloads\utils“ This command creates a .iso file in $env:temp folder (default location) that contains c:\tools and c:\downloads\utils folders. The folders themselves are included at the root of the .iso image. .Example New-IsoFile -FromClipboard -Verbose Before running this command, select and copy (Ctrl-C) files/folders in Explorer first. .Example dir c:\WinPE | New-IsoFile -Path c:\temp\WinPE.iso -BootFile „${env:ProgramFiles(x86)}\Windows Kits\10\Assessment and Deployment Kit\Deployment Tools\amd64\Oscdimg\efisys.bin“ -Media DVDPLUSR -Title „WinPE“ This command creates a bootable .iso file containing the content from c:\WinPE folder, but the folder itself isn’t included. Boot file etfsboot.com can be found in Windows ADK. Refer to IMAPI_MEDIA_PHYSICAL_TYPE enumeration for possible media types: http://msdn.microsoft.com/en-us/library/windows/desktop/aa366217(v=vs.85).aspx .Notes NAME: New-IsoFile AUTHOR: Chris Wu LASTEDIT: 03/23/2016 14:46:50 #>

[CmdletBinding(DefaultParameterSetName=’Source‘)]Param(
[parameter(Position=1,Mandatory=$true,ValueFromPipeline=$true, ParameterSetName=’Source‘)]$Source,
[parameter(Position=2)][string]$Path = „$env:temp\$((Get-Date).ToString(‚yyyyMMdd-HHmmss.ffff‘)).iso“,
[ValidateScript({Test-Path -LiteralPath $_ -PathType Leaf})][string]$BootFile = $null,
[ValidateSet(‚CDR‘,’CDRW‘,’DVDRAM‘,’DVDPLUSR‘,’DVDPLUSRW‘,’DVDPLUSR_DUALLAYER‘,’DVDDASHR‘,’DVDDASHRW‘,’DVDDASHR_DUALLAYER‘,’DISK‘,’DVDPLUSRW_DUALLAYER‘,’BDR‘,’BDRE‘)][string] $Media = ‚DVDPLUSRW_DUALLAYER‘,
[string]$Title = (Get-Date).ToString(„yyyyMMdd-HHmmss.ffff“),
[switch]$Force,
[parameter(ParameterSetName=’Clipboard‘)][switch]$FromClipboard
)

Begin {
($cp = new-object System.CodeDom.Compiler.CompilerParameters).CompilerOptions = ‚/unsafe‘
if (!(‚ISOFile‘ -as [type])) {
Add-Type -CompilerParameters $cp -TypeDefinition @‘
public class ISOFile
{
public unsafe static void Create(string Path, object Stream, int BlockSize, int TotalBlocks)
{
int bytes = 0;
byte[] buf = new byte[BlockSize];
var ptr = (System.IntPtr)(&bytes);
var o = System.IO.File.OpenWrite(Path);
var i = Stream as System.Runtime.InteropServices.ComTypes.IStream;

if (o != null) {
while (TotalBlocks– > 0) {
i.Read(buf, BlockSize, ptr); o.Write(buf, 0, bytes);
}
o.Flush(); o.Close();
}
}
}
‚@
}

if ($BootFile) {
if(‚BDR‘,’BDRE‘ -contains $Media) { Write-Warning „Bootable image doesn’t seem to work with media type $Media“ }
($Stream = New-Object -ComObject ADODB.Stream -Property @{Type=1}).Open() # adFileTypeBinary
$Stream.LoadFromFile((Get-Item -LiteralPath $BootFile).Fullname)
($Boot = New-Object -ComObject IMAPI2FS.BootOptions).AssignBootImage($Stream)
}

$MediaType = @(‚UNKNOWN‘,’CDROM‘,’CDR‘,’CDRW‘,’DVDROM‘,’DVDRAM‘,’DVDPLUSR‘,’DVDPLUSRW‘,’DVDPLUSR_DUALLAYER‘,’DVDDASHR‘,’DVDDASHRW‘,’DVDDASHR_DUALLAYER‘,’DISK‘,’DVDPLUSRW_DUALLAYER‘,’HDDVDROM‘,’HDDVDR‘,’HDDVDRAM‘,’BDROM‘,’BDR‘,’BDRE‘)

Write-Verbose -Message „Selected media type is $Media with value $($MediaType.IndexOf($Media))“
($Image = New-Object -com IMAPI2FS.MsftFileSystemImage -Property @{VolumeName=$Title}).ChooseImageDefaultsForMediaType($MediaType.IndexOf($Media))

if (!($Target = New-Item -Path $Path -ItemType File -Force:$Force -ErrorAction SilentlyContinue)) { Write-Error -Message „Cannot create file $Path. Use -Force parameter to overwrite if the target file already exists.“; break }
}

Process {
if($FromClipboard) {
if($PSVersionTable.PSVersion.Major -lt 5) { Write-Error -Message ‚The -FromClipboard parameter is only supported on PowerShell v5 or higher‘; break }
$Source = Get-Clipboard -Format FileDropList
}

foreach($item in $Source) {
if($item -isnot [System.IO.FileInfo] -and $item -isnot [System.IO.DirectoryInfo]) {
$item = Get-Item -LiteralPath $item
}

if($item) {
Write-Verbose -Message „Adding item to the target image: $($item.FullName)“
try { $Image.Root.AddTree($item.FullName, $true) } catch { Write-Error -Message ($_.Exception.Message.Trim() + ‚ Try a different media type.‘) }
}
}
}

End {
if ($Boot) { $Image.BootImageOptions=$Boot }
$Result = $Image.CreateResultImage()
[ISOFile]::Create($Target.FullName,$Result.ImageStream,$Result.BlockSize,$Result.TotalBlocks)
Write-Verbose -Message „Target image ($($Target.FullName)) has been created“
$Target
}
}

Back to Top