čtvrtek 5. dubna 2012

Programy po spuštění


Dejte uživatelům práva instalovat a můžete si být jistí že PC se přestane hýbat.Na vině jsou programy po spuštění které prodlužují start a navíc ubírají systémové prostředky.Takže jak tento balast dostat z PC. Můžeme obcházet jednotlivé uživatele přihlásit se jako admin a pomocí MSCONFIGu udělat čistku.
Jinak řečeno zdlouhavé a neefektivní.Pak můžeme použít VNC nebo třeba vzdálenou plochu což opět znamená přehlášení a
vyrušení uživatelů od práce.
Pokud chceme smazat nějaký program po spuštění aniž bychom museli vyrušovat uživatele smažeme prostě klíč.
Ano program po spuštění není nic víc než hodnota v registru tak proč nevyužit vzdálené registry.Uživatel nic nepozná a po restartu PC
 je vše hotovo.Ale co když máme 100 pc ze kterých potřebujeme dostat jeden klíč?..... Napíšeme skript.
Tento skript ve svém základu ukáže programy po spuštění na PC které si zvolíte(zapíšete do síťové cesty).Jednoduše zadáte PC a powershell vám vypíše jaké programy startují spolu s windows.
Provede to tak že si vzdáleně sáhne do registru a načte hodnoty.Daleko jednoduší je použít toto:
Get-WmiObject Win32_StartupCommand -computername kontrolovanePC
Jenže tento příkaz vám sice vrátí to co potřebujeme,ale pro další práci se nehodí(nebo možná ano ale mě se spousta věcí nedařila)
Dole v skriptu jsou řádky které již registr modifikují.Jsou zakomentované takže skript můžete klidně spustit nedělá nic jiného než že čte.Pokud se rozhodnete mazat hodnoty nebo je přidávat musíte řádky odkomentovat.Momentálně je cesta nastavena na programy po spuštění takže se vše odehrává tam.
Pokud by skript měl měnit či mazat registr na více PC stačí celý kod zabalit do funkce kdy jména strojů načteme z textového souboru a budeme je zasílat funkci ke zpracování viz skript nelegální obsah MP3.Samozřejmě nesmíme zapomenout změnit  (kontrolovanéPC)  na proměnnou která bude reprezentovat název právě kontrolovaného stroje.


PS:Tento powershell skript je universální a dovoluje vzdáleně modifikovat nebo ovládat vše v registru stačí jen změnit cesty.Prakticky je toto nástroj jak pomocí powershellu vzdáleně ovládat registry.




################################  Vytvoril:Petr Skrivan ####################################

<#
Zde uvadim adresare a jejich ciselne ekvivalenty
HKEY_CLASSES_ROOT 2147483648
HKEY_CURRENT_USER 2147483649
HKEY_LOCAL_MACHINE 2147483650
HKEY_USERS 2147483651
HKEY_CURRENT_CONFIG 2147483653
HKEY_DYN_DATA 2147483654
#>
#kazdy adresar v registru je nazván jménem ale má i svou číselnou hodnotu
#...zde pracujeme s číselnou hodnotou kterou přidělíme proměnné napr.
$hkcu= 2147483649
$hklm= 2147483650
#vytvarime nove spojeni(objekt) na konkretni stanici za urcitym ucelem
$wmi = [WMIClass]"\\kontrolovanéPC\root\default:stdRegProv"
#do promenne ulozime kompletni cestu ke klici
$klic="software\microsoft\windows\currentversion\run"
#doslova:vypis hodnoty klice v zadane ceste takze vypise programy po spusteni(jen jmena)
$wmi.enumvalues($hklm,$klic) | select -ExpandProperty snames
        
             
#############  tyto radky odkomentujte pokud chcete vytvorit novou hodnotu ############
      
         #pokud vytvarime novou hodnotu tak toto bude jeji jmeno
    #$novahodnotajmeno="Neco po spusteni"
      
         #pokud vytvarime novou hodnotu s obsahem tak toto je obsah
    #$novahodnotaobsah="c:\atd"
           
            #vytvor novou hodnotu v zadane ceste se zadanym jmenem a udanymi hodnotami
    #$wmi.SetStringValue($hklm, $klic, $novahodnotajmeno, $novahodnotaobsah)



      
###########  tyto radky odkomentujte pokud chcete mazat nějakou hodnotu ################
        
         #zde priradime konktretni vec kterou budeme mazat
    #$cosmazat="zde zapiste jmeno programu po spusteni"
        
         #smaz hodnotu v zadane ceste dle udaneho jmena
    #$wmi.deletevalue($hklm,$klic,$cosmazat)






pondělí 2. dubna 2012

Synchronizace casu


V síti mám několik stanic které jsou ve společné síti,ale nejsou v doméně.Patří dokonce i jiné,externí firmě. Mají zakázán internet a spoustu dalších restrikcí které společně dohromady prakticky znemožňuji synchronizovat čas.Ovšem čas je tu velice důležitý protože zapisují do společné databáze která s velké části s časem pracuje.Jasně v cmd máme notoricky známí příkaz w32tm /resync …..   ale za prvé je tento blog o powershellu a za druhé řešení založené na cmd se nechovalo korektně.
Skript spouštím z PC které je v doméně a tudíž synchronizované s hlavním řadičem domény a má admin práva pro doménu.
Samozřejmě by nebyl problém sáhnout si přímo na hlavní server nebo kamkoli jinam,stačí jen přepsat cestu.






################################  Vytvoril:Petr Skrivan ####################################


#do promenne si uloz aktualni cas na vzdalenem pc
$zmencas=(Get-WmiObject Win32_OperatingSystem -ComputerName vasevzdalenepc)
#ziskam aktualni cas z pc kde se spousti skript a ulozim ho do promenne $cas
$cas = (Get-WmiObject Win32_OperatingSystem).LocalDateTime
#doslova:cas na stanici vasevzdalenepc nastav na $cas 
#...coz je aktualni cas nastanici odkud byl script spusten 
$zmencas.SetDateTime($cas)