úterý 16. října 2012

Změna DNS serveru


Hromadná změna DNS serveru pomocí powershellu:
Parametry pro sítový adaptér jsou v drtivé většině případů získávány automaticky.Jenže není tomu tak vždy.Což je i můj případ,je tu spousta serverů a dalších podpůrných PC(stanic) které mají  jak IP tak DNS servery nastaveny natvrdo.A protože přecházíme na nový DNS server...

Máme tu další důvod ke psaní powershell skriptu.Na druhou stranu proč psát další skript když jich na internetu koluje více než dost.Ale vždy je tu nějaké ALE.Například u mne byl problém s notebooky,kdy jejich integrovaný modem znamená další síťový adaptér.Dále pak OpenVPN jenž si vytváří svůj virtuální adaptér.Nemůžu měnit DNS i na těchto adaptérech.Musím vybrat jen ty kterých se to týká.
Ať už adaptér dostane IP od DHCP nebo jí má natvrdo vždy jsou ve stejném rozsahu,jasně jsou i výjimky ale vycházíme z toho že hledáme ve stejném rozsahu IP(typicky   doména) a to je podstata mého filtru který pro změnu DNS serveru vybírá jen ty adaptéry které odpovídají danému rozsahu.
Skript je myšlen pro hromadnou změnu tedy klidně stovky stanic,takže data (názvy stanic) si načítá z obyčejného txt souboru který umístíme na disk C.Txt soubor má tuto podobu:co řádek to název jedné stanice bez prázdných řádků a znaků.Soubor se musi jmenovat seznampc.txt
Výsledek se zapisuje do log souboru který je vytvořen na disku C.Zde si můžeme ověřit zda vše dopadlo tak jak mělo. 
Sekundarní DNS server co tu uvádím(8.8.8.8) patří Google a dle jejich vyjádření bude fungovat vždy až na věčné časy....a nikdy jinak.

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


#budeme menit DNS na vice stanicich takze promenna ktera bude obsahovat jmena PC musi byt
#..typu pole,takzetakto si zinicializujeme promennou typu pole
$pc = @()
#do promenne si nacteme seznam stanic z textoveho souboru ktery mame ulozen na c:
$pc = cat "c:\seznampc.txt"
#do promenne si nacteme dve hodnoty(primarni a sekundarni DNS)
$newdns = "192.168.100.249" , "8.8.8.8"
#zalozime si textovy soubor do ktereho budeme zapisovat podrobny log udalosti.Jako prvni
#...zapiseme aktualni datum a cas kdy byl log vytvoren znamenko > rika ze zakladame novy
#...soubor.Pokud uz existoval bude prepsan timto novym takze vzdy budeme mit aktualni log
Get-Date > "C:\dnsLog.txt"
#postupne si vyzvedneme vzdy jednu stanici a te priradime promenou $stroj tu pak prozeneme
#...skriptem v zavorkach(cyklus foreach)
foreach($stroj in $pc)
#zacatek hlavniho skriptu vse co je mezi touto zavorkou a zavorkou dole probehne tolikrat
#...kolik jsme zaslali PC do kolecka (vzdy jedno kolo pro jeden stroj)
{
#do promenne $connect si ulozime test spojeni na testovane pc(muze byt true nebo false)
#..true=spojeni uspesne false..spojeni neuspesne
$conect = Test-Path \\$stroj\c$
#otestujeme zda je PC nebo server dostupny
if ($conect -eq "True")
#pokud je spojeni uspesne zapiseme tuto skutecnost do logu
{"$stroj je dostupny" >> "C:\dnsLog.txt"
#promenne $dns priradime udaje o sitovem adapteru konkretniho pc
#...(tedy pc ktere momentalne proudi v roure)
$dns = Get-WmiObject win32_networkadapterconfiguration -computername $stroj
#...vybereme jen ty adaptery ktere maji konkretni IP tedy jsou v domenovem rozsahu
$dnslive = $dns | where-object {$_.ipaddress -like "192.168.100.*" }
#provedeme zmenu DNS serveru na server definovany na zacatku skriptu
$dnslive.setDNSServerSearchOrder($newdns)
#do promenne si nacteme aktualni info o parametrech sitoveho pripojeni a
#...to jen pripojeni ktere ma konkretni IP tedy rozsah domeny
$dnspote = Get-WmiObject win32_networkadapterconfiguration -computername $stroj |
where-object {$_.ipaddress -like "192.168.100.*" }
#promenne $jakedns priradime momentalni hodnotu DNS
$jakedns = $dnspote.DNSServerSearchOrder
#pokud se DNS shoduje se vzorem prvni hodnota je 192.168.100.249 a zaroven
#...druha hodnota je 8.8.8.8 pak je splnena podminka a provede se vse v zavorkach
if (($jakedns -match "192.168.100.249") -and ($jakedns -match "8.8.8.8"))
#podminka vyse byla splnena...zmena probehla v poradku..zapis uspech do logu
{ "Zmena dns na $stroj probehla v poradku ......" >> "C:\dnsLog.txt"}
#zapis se nezdaril..zapis neuspech do logu
else {"POZOR   ...  zmena dns na $stroj selhala ......" >> "C:\dnsLog.txt"}
#prazdne radky do logu(ciste jen graficka uprava vystupu)
" " >> "C:\dnsLog.txt"
" " >> "C:\dnsLog.txt"
#uzaviraci zavorka podminky(zda je dostupny server nebo PC)
}
#podminka dostupnosti PC nebo serveru nebyla splnena provede se ELSE
#..pokud spojeni selhalo zapiseme informaci do logu
else {"nepodarilo se pripojit k $stroj" >> "C:\dnsLog.txt"}
#uzavirajici zavorka bloku foreach
}

úterý 2. října 2012

EventLog:chyba



Máme PC nebo server u kterého je důležité aby fungoval bez problémů 24 hodin denně.Většina závad se sama ohlásí daleko předem a to zápisem do eventlogu.Může se jednat o výstrahu,upozornění a v nejhorším případě i chybová hláška.
Kontrolovat každý den několik stanic je nereálné.Takže pokud máme vše dobře nastaveno a máme moderní OS který dokáže varování odeslat emailem... je vše ok.
Jenže co když nemáme ten správný OS nebo chceme kontrolu centralizovat..no jasně máme powershell.
Tento skript si vzdáleně sáhne pro výpis z logu na jakémkoliv stroji a zpracuje ho.Zde konkrétně řešíme výpis ze systémového logu.Zajímají nás jen chyby a to jen z dnešního dne.Z tohoto důvodu je vhodné naplánovat spuštění skriptu na pozdní večerní hodiny.
Pokud se najdou nějaká chybová hlášení jsou zapsána do logu(textový soubor).Ten je následně odeslán na danou emailovou adresu jako příloha zprávy.
Skript pro odeslání emailu s přílohou není můj.Popsal ho Patrik Malina ve své knize jak vyzrát na powershell  2.0 ,ti co to myslí s powershellem vážně už jí mají a ti ostatní si ji nakonec stejně koupí.


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

#pojmenovani funkce:tato se stara o odeslání emailu s přílohou pochazi z knihy...
#..Jak vyzrát na powershell 2.0 (vrele doporucuji)od Patrika Maliny
function sendemail
{
#zde je casova pauza ktera pocka 5 sekund aby predesly skript mel dostatek casu na..
#..ulozeni text-logu
Start-Sleep -Seconds 5
$smtpKlient = new-object system.net.mail.smtpClient
$zprava = New-Object system.net.mail.mailmessage
$prihlaseni = New-Object system.net.NetworkCredential
#zde uvedete vase prihlasovaci udaje na postovnim serveru
$prihlaseni.username = "skrtek@neco.cz"
$prihlaseni.Password = "heslo"
#adresa postovniho serveru
$smtpKlient.Host = "192.168.100.100"
#prihlasovaci procedura
$smtpKlient.Credentials = $prihlaseni
#od koho byla zprava odeslana
$zprava.From = "error@neco.cz"
#komu odesilame zpravu
$zprava.To.Add("skritek@neco.cz")
#predmet zpravy
$zprava.Subject = "VAROVANI-SYSTEMOVY LOG"
#text zpravy
$zprava.Body = "Byla zaznamenana chyba v systemovem logu"
#zde si do promenne ulozime cestu k vytvorenemu logu
$cesta = "c:\errorlog.txt"
#novy objekt priradime promenne $priloha
$priloha = New-Object system.net.mail.attachment($cesta)
#zde prilohu pridame do zpravy
$zprava.Attachments.Add($priloha)
#odesleme zpravu
$smtpKlient.Send($zprava)
#uvolni prilohu(treba pro dalsi zpracovani)
$priloha.Dispose()
}


#zalozime textovy dokument a to na PC jenz spousti tento skript,textovy soubor..
#.. bude se jmenovat errorlog a bude umístěn na disku c:
#..první radek txt souboru bude obsahovat text z uvozovek.znamenko > znamená..
#..zaloz novy soubor pokud soubor existuje pak jej přepíše
#..to nám zajistí že log bude vzdy aktualni
"Log ze serveru srvr" > c:\errorlog.txt
#do promenne uloz aktualni datum
$datum = Get-Date
#eventlog ze stanice srvr posli do roury a pak filtruj jen objekty kde je entrytype..
#..error vyber jen prvnich deset a to vse uloz do promenne
#..jedna se o vypis z logu system
$errorpet = Get-EventLog system -ComputerName srvr |
Where-Object { $_.entrytype -like "error"} | select -First 10
#inicializuj promennou a typu pole
$zprava = @()
#do roury zasleme prvnich 10 zaznamu typu error vse co je v zavorkach se tedy 10x zopakuje..
#..pro kazdy zaznam jedno kolo
$errorpet | foreach{
#promenna $casy nabude hodnotu timewriten tedy cas zapsani zaznamu do logu
$casy = $_.timewritten
#filtr ktery porovna aktualni datum s datumem vytvoreni..
#..takze se nam vrati jen zaznamy z dnesniho dne
if($datum.Year -le $casy.Year -and $datum.Month -le $casy.Month -and $datum.Day -le $casy.Day)
{
#pokud plati podminka vyse,tedy pokud je zaznam z dnesniho dne pak se zaznam prida do $zprava
$zprava+= $_
}
#vse v zavorkach se zopakuje 10x tedy pro kazdy zaznam jedno kolecko kdy se zjisti zda..
#..je zaznam z dnesniho dne,pokud ano prida se k zaznamum ktere tuto podminku splnuji ..
#... vsechny zaznamy jsou zapsany v promenne $zprava vse co je provadeno pod..
#...zavorkou dole seprovede az po skonceni cyklu foreach
}
#zde muzou nastat dve situace,promena $zprava obsahuje zaznamy.jinak receno..
#..byla nalezena shoda(existuje error hlaska z dnesniho dne) nebo..
#...promenna $zprava je prazdna takze neexistuje zaznam z dnesniho data
#...zde je osetren pripad prvni tedy promenna $zprava ma nejakou hodnotu
if ($zprava)
{
#pokud je splnena podminka vyse pripise se zprava do errorlogu znamenko >> znamena pripsat..
#..text(v tomto pripade pripise error zaznamy)
$zprava >> c:\errorlog.txt
#a protoze byl nejaky error zaznam nalezen zavolame funkci email ktera odesle zpravu a..
#..jako prilohu txt soubor z logem
sendemail
}
#zde je osetren pripad kdy promenna $zprava je prazdna v tomto pripade vypise.. 
#..do konzole text...."nic nenalezeno" a tim beh skriptu konci
if (!$zprava) {echo "nic nenalezeno"}








úterý 1. května 2012

Powershell a excel


Vzdálená inventura PC s výstupem do excelu
Inventarizace majetku.PC deník nebo jen info co mám vlastně v doméně.Ve zkratce potřebujeme informace o PC,typu jaká RAM,
kolik HDD co je nainstalováno atd.Vcelku jednoduchý úkol pokud použijeme powershell.Pro všechny informace si sáhneme vzdáleně a ani nemusíme vstát ze židle.Vše si nasměrujeme do nějakého jednoduchého výstupu(typicky txt)a jsme za vodou.
ALE pokud tyto informace předáváme dál(a hlavně výše),budeme mít velký problém.Nadřízení xmrti milují když mají data nějaký grafický kabát.Většinou excel-tabulka hezky vybarvená všelijak orámovaná různými druhy písma osazená a grafy............
 ……  HODNĚ  grafů.
Rozhodně nebudeme získaná data otrocky datlovat do excelovské tabulky ručně.Chce to skript který si vzdáleně sáhne na kontrolovaný počítač,nasbírá data a ty rovnou vepíše do tabulky kterou ještě navrch nějak graficky upraví.
Klidně by se tento příspěvek mohl  jmenovat powershellovské hrátky s excelem protože záměrně využívám několik způsobů jak modifikovat tabulku.Nešlo tu o to abych vyrobil tu nejkrásnější tabulku.Chtěl jsem jen demonstrovat co vše powershell umí s excelem.
No on toho umí samozřejmě ještě více ale toto jsou jakési základy.
Ve skriptu je kus kódu který pomocí powershellu zjistí cd-key do windows.Tento skript není můj,našel jsem ho na internetu a protože se mi nepodařilo zjistit autora nemohu uvést zdroj.

Zdroje:
Se zarovnáním grafu mi hodně pomohla tato stránka:  
Další info a tabulka barev je zde  :

PS:záměrně jednu a tu samou věc dělám na několik způsobů.Může se zdát že jeden ze způsobů je zdlouhavý nebo nesystémový  ale každý zápis si najde své využití.
A nakonec jedno upozornění.Po spuštění skriptu se zdánlivě nic neděje.To je dáno tím že hned na začátku je procedura jenž zjišťuje nainstalované programy a to chvilku trvá.Odhadem od 2 od 10min.





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


#zde uvedte jmeno kontrolovaneho pc
$comp= "kontrolovanePC"
#zjistime nainstalovane programy na vzdalenem pc
$nainstalovano=get-wmiobject win32_product -computername $comp |foreach {$_.name}
#novy objekt konkretne excel
$excel=new-object -comobject excel.application
$excel.visible=$true
#promenne $sesit priradime novou knihu 
$sesit=$excel.workbooks.add()
# promenne $list priradime novy list v sesitu
$list=$sesit.worksheets.item(1)
#sloupec cislo 3 tedy cecko roztahneme na konkretni hodnotu
$list.Columns.Item(3).columnWidth = 80
#sloupec pismeno e roztahneme na konkretni hodnotu
$list.Columns.Item("e").columnWidth = 15
$list.Columns.Item(6).columnWidth = 15
$list.Columns.Item(4).columnWidth = 1
#radek cislo 7 roztahneme na pozadovanou hodnotu
$list.Rows.item(7).RowHeight = 2
$list.Rows.item(4).RowHeight = 2
#sloupce g a i roztahneme na pozadovanou hodnotu
$list.Range("g:i").columnWidth=11
#do promenne si ulozime urcity rozsah bunek
$nazevpc= $list.Range("c2:i3")
#a pak vybrane bunky spojime
$nazevpc.Mergecells= $true
#spojene bunky obarvime
$nazevpc.Interior.colorindex= 44
#spojene bunky oramujeme
$nazevpc.Borders.LineStyle= 2
#zadame hodnotu nebo retezec ktery budou spojene bunky obsahovat
$nazevpc.FormulaR1C1 = ("Výpis parametrů PC  >> $comp << ")
#ve spojenych bunkach zarovname text na stred jak horizontalne tak vertikalne
$nazevpc.HorizontalAlignment= -4108 ; $nazevpc.VerticalAlignment= -4108
#promenne $programy priradime rozsah bunek
$programy=$list.range("c8:c10")
#zde sloucime vyse vybrane bunky
$programy.MergeCells=$true
#vyse sloucene bunky budou mit zelenou barvu
$programy.Interior.ColorIndex= 19
#obsah bunky c8 (coz je momentalne nekolik sloucenych bunek viz vyse)
$list.Range("c8").FormulaR1C1= "Nainstalovane Programy"
#zarovnani textu v bunce c8 na stred horizontalne
$list.Range("c8").HorizontalAlignment = -4108
#zarovnani textu v bunce c8 na stred vertikalne
$list.Range("c8").verticalAlignment = -4108
#zmena fontu v bunce c8
$list.Range("c8").Font.name = "elephant"
#zmena velikosti fontu bunce c8
$programy.Font.Size= 15
#zmena oramovani ve sloucenych bunkach ted tedy v c8
$programy.Borders.LineStyle= 6
$a=10
#do roury posleme nainstalovane programy ktere si nasledne jeden po druhem vyzvedneme v..
#.....podobe promenne $hodnota
foreach ($hodnota in $nainstalovano){
$a ++
#do bunky c$a napise program aktualne proudici v roure
$list.Range("c$a").FormulaR1C1= $hodnota
#bunku c$a obarvi na zelenou
$list.Range("c$a").Interior.ColorIndex = 19
}
#do promenne ulozi celou tabulku
$celatabulka=$list.range("c11:c$a")
#oramujeme celou tabulku
$celatabulka.Borders.LineStyle= 7
#do promenne $disky si ulozime bunku e11
$disky=$list.range("e11")
#bunku e11 obarvime
$disky.Interior.ColorIndex = 22
#do bunky e11 napiseme text
$list.Range("e11").FormulaR1C1= "HDD celkově"
#text v bunce e11 bude formatovan na stred
$disky.HorizontalAlignment= -4108
#bunku e11 oramujeme
$disky.Borders.LineStyle= 7
$diskyfree=$list.range("f11")
$diskyfree.Interior.ColorIndex = 35
$list.Range("f11").FormulaR1C1= "HDD volno"
$diskyfree.HorizontalAlignment= -4108
$diskyfree.Borders.LineStyle= 7
#do promenne si ulozime info o HDD a filtrujeme jen lokalni disky
$hddvse= Get-WmiObject Win32_LogicalDisk -ComputerName $comp|Where-Object{$_.drivetype -eq 3}
#do promenne ulozime celkovou velikost vsech HDD zaokrouhlenou na GB
$mistocelkem= ($hddvse | Measure-Object size -sum).sum/1gb
#zaokrouhlime celkovou velikost vsech HDD
$mistocelkemzaokrouhleno=([System.Math]::Round($mistocelkem))
#do promenne ulozime celkovou volnou kapacitu vsech HDD zaokrouhlenou na GB
$volnemistocelkem= ($hddvse | Measure-Object freespace -sum).sum/1gb
#zaokrouhlime celkovou volnou kapacitu vsech HDD
$volnemistocelkemzaokrouhleno=([System.Math]::Round($volnemistocelkem))
#vypocitame si obsazene misto
$obsazenemisto=$mistocelkemzaokrouhleno - $volnemistocelkemzaokrouhleno
$b=12
#info o HDD zasleme do roury a postupne vyzvedneme pod promennou $argument
foreach ($argument in $hddvse){
#do promenne si ulozime jmena vsech disku
$nazevhdd=($argument.DeviceID)
#do promenne si ulozime velikost vsech disku
$velikost=($argument.size/ 1GB)
#do promenne si ulozime velikost volneho misto
$volnemisto=($argument.FreeSpace/ 1GB)
#zaokroulime volne misto na cele cislo
$prevedenovolno=([System.Math]::Round($volnemisto))
#zaokrouhlime celkove misto na cele cislo
$prevedenocelk=([System.Math]::Round($velikost))
#do dane bunky zapise nazev hdd a zaokrouhlenou celkovou velikost
$list.Range("e$b").FormulaR1C1=("$nazevhdd $prevedenocelk GB " )
#a bunku obarvi
$list.Range("e$b").Interior.ColorIndex = 22
#do dane bunky zapise nazev hdd a zaokrouhlenou volnou kapacitu
$list.Range("f$b").FormulaR1C1= ("$nazevhdd $prevedenovolno GB " )
#a bunku obarvi
$list.Range("f$b").Interior.ColorIndex = 35
$b++
}
#zde si pripravime pomocne bunky odkud si graf vezme data v konecnem vysledku nebudou
#..tyto bunky viditelne(skryje je graf)
$list.Range("F23").formular1c1=("HDD celkem obsazeno")
$list.Range("E23").formular1c1=("HDD celkem volno")
$list.Range("F24").formular1c1=("$obsazenemisto")
$list.Range("E24").formular1c1=("$volnemistocelkemzaokrouhleno")
#zjisteme nazev procesoru + info o taktu
$procesor= Get-WmiObject Win32_Processor -ComputerName $comp | foreach {$_.name }
$list.Range("c5:i5").mergecells=$true
$list.Range("c5:i5").HorizontalAlignment= -4108
$list.Range("c5").FormulaR1C1= ("CPU: $procesor")
$list.Range("c5").Interior.ColorIndex = 42
#zjistime typ graficke karty -filtrujeme jen iformaci name
$grafika= Get-WmiObject Win32_VideoController -ComputerName $comp |foreach {$_.name}
$list.Range("c6:i6").mergecells=$true
$list.Range("c6:i6").HorizontalAlignment= -4108
$list.Range("c6").FormulaR1C1= ("GPU: $grafika")
$list.Range("c6").Interior.ColorIndex = 42
#zjistime info o pameti
$ram= Get-WmiObject Win32_PhysicalMemory -ComputerName $comp
#protoze muzeme dostat vice hodnot(vice objektu)tak ty nejdrive secteme a
#zaokrouhlime na MB vse ulozime do promenne
$kapacitaram= ($ram | Measure-Object capacity -sum).sum/1mb
#pocet modulu ram zjistime takto
$pocetram= $ram.Length
#pokud vydelime celkovou kapacitu poctem modulu,zjistime kapacitu jednoho modulu
$jednaram=$kapacitaram/$pocetram
#zde ziskane hodnoty rozhazime do bunek
$pameti =$list.range("g11:i11")
$pameti.MergeCells=$true
$pameti.HorizontalAlignment= -4108
$pameti.FormulaR1C1= ("Operační Pamět")
$pameti.Borders.LineStyle= 6
$list.Range("g12").FormulaR1C1= ("Moduly ks")
$list.Range("h12").FormulaR1C1= ("Kapacita")
$list.Range("i12").FormulaR1C1= ("Celkem MB")
$list.Range("g13").FormulaR1C1= ("$pocetram")
$list.Range("h13").FormulaR1C1= ("$jednaram")
$list.Range("i13").FormulaR1C1= ("$kapacitaram")
$list.Range("g11:i13").Interior.ColorIndex= 15
$list.Range("g12:i13").Borders.LineStyle= 7
$list.Range("e8:i8").mergecells=$true
$list.Range("e8:i8").HorizontalAlignment= -4108
$list.Range("e8").FormulaR1C1= ("INFO : Operační sytém")
$list.Range("e8:i8").Borders.LineStyle= 7
$list.Range("e8:e10").Interior.ColorIndex= 17
#zjistime info o OS
$os= Get-WmiObject Win32_OperatingSystem -computername $comp
#do promenne ulozime jen to co nas zajima a to je verze OS
$osname=$os.caption
$list.Range("e9:i9").mergecells=$true
$list.Range("e9").FormulaR1C1= ("Verze OS: $osname ")
<#
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
Tento kus kodu zjisti CD-KEY u windows.Neni muj nasel jsem ho na interneru
uvedl bych autora ale nepodarilo se mi ho zjistit.
#>
$hklm = 2147483650
$regPath = "Software\Microsoft\Windows NT\CurrentVersion"
$regValue = "DigitalProductId"
$productKey = $null
$wmi = [WMIClass]"\\$comp\root\default:stdRegProv"
$data = $wmi.GetBinaryValue($hklm,$regPath,$regValue)
$binArray = ($data.uValue)[52..66]
$charsArray = "B","C","D","F","G","H","J","K","M","P","Q","R","T","V","W","X","Y","2","3","4","6","7","8","9"
For ($i = 24; $i -ge 0; $i--) {
$k = 0
For ($j = 14; $j -ge 0; $j--) {
$k = $k * 256 -bxor $binArray[$j]
$binArray[$j] = [math]::truncate($k / 24)
$k = $k % 24
}
$productKey = $charsArray[$k] + $productKey
If (($i % 5 -eq 0) -and ($i -ne 0)) {
$productKey = "-" + $productKey
}
}
#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

$list.Range("e10:i10").mergecells=$true
$list.Range("e10").FormulaR1C1= ("CD-KEY: $productKey")
#urcime kde si graf veme data
$range = $list.range("E23:F24")
#pridej tvar(tabulku)do stavajiciho listu
$tabulka = $list.shapes.addChart().chart
#typ tabulky(grafu) vsechny typy grafu neleznete v odkazu nize
# http://msdn.microsoft.com/en-us/library/bb241008(v=office.12).aspx
$tabulka.chartType = 5
#kde bude graf brat data je dano predem definovanou promennou
$tabulka.setSourceData($range)
#do promenne urcime kde tabulka bude
$zarovnej = $list.Range("E20:i32")
#do promenne graf ulozime soucasnou tabulku(graf je taky tabulka)
$graf = $tabulka.Parent
#horni cara grafu bude na radku 20
$graf.Top = $zarovnej.Top
#levy okraj bude ve sloupci E
$graf.Left = $zarovnej.Left
#vyska grafu bude odpovidat radkum 20 - 32
$graf.Height = $zarovnej.Height
#sirka grafu bude E - I
$graf.Width = $zarovnej.Width
#nadpis tabulky bude vyditelny
$tabulka.HasTitle = $true
#text nadpisu
$tabulka.ChartTitle.caption = "Vsechny pevne disky volno/obsazeno"
#popisek grafu pokud tento radek vynechate bude to zakladni graf
$tabulka.ApplyDataLabels(5)

#pokud chcete jine barevne pozadi tabulky (staci odkomentovat radek nize)
#$tabulka.ChartArea.Interior.colorindex = 24

#uloz celou tabulku jako xlsx pojmenuj ji dle jmena kontrolovaneho pc a to vse dle zadane cesty
$sesit.SaveAs("C:\$comp.xlsx")

#ukonci excell..pokud si chcete tabulku ihned prohlednout tak tento radek zakomentujte
$Excel.Quit()



Výsledek našeho snažení