Zobrazují se příspěvky se štítkemšelík. Zobrazit všechny příspěvky
Zobrazují se příspěvky se štítkemšelík. Zobrazit všechny příspěvky

pátek 9. dubna 2010

Hej, mistře Šelíku!

Mist Šelík dohání to, co v minulých měsících zameškal a má před sebou nový Skriptíkův problém.

image

Máme několik možností.

Použít WScript.Network

PS C:\> (New-Object -Com WScript.Network).RemovePrinterConnection('\\server\Printer007')

Rychlé a účinné. Vytvoříme si nový objekt a okamžitě voláme jeho metodu RemovePrinterConnection. Potřebujeme vědět jenom jméno tiskárny. Předchzí řádku můžeme také rozepsat do (pro někoho možná srozumitelnější) formy jako:

PS C:\> $printerName = '\\server\Printer007'
PS C:\> $obj = New-Object -ComObject WScript.Network
PS C:\> $obj.RemovePrinterConnection($printerName)

Použití akcelerátoru [wmi]

Poněkud složitější konstrukce:

PS C:\> [wmi](gwmi Win32_Printer -Filter 'Name LIKE "%Printer007%"').Delete()

kterou můžeme opět rozepsat jako:

PS C:\> $prn = Get-WmiObject Win32_Printer -Filter 'Name LIKE "%Printer007%"'
PS C:\> [wmi]$prn.Delete()

V tomto případě si nejdříve do proměnné uložíme hledanou tiskárnu. Používáme parametr Filter, protože dotaz je rychlejší než při použití cmdletu Where-Object (Get-WmiObject Win32_Printer |Where-Object {$_.Name -like '*Printer007*'}). Pozor na jednu věc: ve filtru musíme použít znak ‘%’ jelikož se jedná vlastně o WQL dotaz prováděný na úrovni WMI.

Ve druhém řádku již voláme metodu Delete() a pomocí [wmi] vlastně provádíme “přetypování” na objekt System.Management.ManagementObject, který metodu Delete() obsahuje.

Ačkoli VBS moc rád nemám, v tomto případě bych asi osobně zvolil první možnost, která mi přijde jednodušší a pochopitelnější.

Banner mistra Skriptíka je stažen ze stránek TechNet Flash zpravodaje. Děkuji týmu TechNetu za možnost jeho použití pro potřeby tohoto článku.

středa 7. dubna 2010

Hej, mistře Šelíku!

Po delší odmlce se opět vrátil mistr Šelík, aby pomohl Skriptíkovi s následujícím problémem.

image

Jelikož si Šelík už samozřejmě nainstaloval PowerShell v2, stačí tento jednoduchý příkaz:

PS C:\> Invoke-Command –ComputerName remoteComp –ScriptBlock {mkdir c:\Temp\NewFolder}

Tradáá. Pro fungování předchozího příkazu potřebujete dvě věci: Nastavený remoting a správná práva pro přístup ke vzdálenému počítači. Chcete-li se o vzdáleném přístupu dozvědět více, zkuste se podívat na jednu z následujících příruček:

  1. Administrator's Guide to Windows PowerShell Remoting (nutná registrace)
  2. Layman’s guide to PowerShell 2.0 remoting

Banner mistra Skriptíka je stažen ze stránek TechNet Flash zpravodaje. Děkuji týmu TechNetu za možnost jeho použití pro potřeby tohoto článku.

sobota 9. ledna 2010

Hej, mistře Šelíku!

Mistr Skriptík se doslechl, že PowerShell je nyní ve verzi 2 a zajímalo ho, jestli by mistr Šelík neměl nějaký tip na vypnutí vzdáleného počítače bez použití WMI.



Brutalita a přímočarost Šelíkova řešení je odporná:

PS C:\Stop-Computer netbook

Vzdálený počítač se vypne a do logu se zapíše následující informace:

PS C:\Get-EventLog -LogName System -ComputerName netbook -Source user32 -Newest 1

EntryType : Information
Source : USER32
Message : The process winlogon.exe has initiated the restart of NETBOOK for the following reason: No title for this reason could be found
Minor Reason: 0xff
Shutdown Type: shutdown
Comment:

V PowerShellu v2 byly přidání cmdlety pro práci se vzdáleným počítačem, protože vypnutí (ale hlavně restart) vzdáleného počítače je jeden ze základních administrátorských úkonů. Jsou dostupné následující cmdlety:
  • Add-Computer a Remove-Computer pro přidávání/odebírání počítače z/do domény nebo pracovní skupiny.
  • Checkpoint-Computer a Restore-Computer pro práci se System restore.
  • Restart-Computer a Stop-Computer pro vzdálený restart nebo vypnutí počítače.

Banner mistra Skriptíka je stažen ze stránek TechNet Flash zpravodaje. Děkuji týmu TechNetu za možnost jeho použití pro potřeby tohoto článku.

čtvrtek 6. srpna 2009

Hej, mistře Šelíku!

V posledním vydání TechNet Flash zpravodaje zaujaly mistra Šelíka dvě věci.
  1. Strip jeho kamaráda mistra Skriptíka.
  2. První díl ze série článků o PowerShellu - snad se nám blýská na lepší časy.
Mistr Skriptík tentokrát řešil práci se službami, pojďme se podívat.

Vzhledem k tomu, že služby jsou jednou ze základních komponent, se kterou se administrátor Windows může potkat, má v sobě PowerShell zabudováno hned několik cmdletů pro práci s nimi.

PS C:\> Get-Help *-service | Select name
Name
----
Get-Service
Stop-Service
Start-Service
Suspend-Service
Resume-Service
Restart-Service
Set-Service
New-Service

My se podíváme na Get-Service, Stop-Service a Start-Service. Pro zjištění stavu všech služeb použijeme Get-Service - dostaneme výpis všech služeb včetně jejich aktuálního stavu (výpis jsem notně zkrátil).
PS C:\> Get-Service
Status Name
------ ----
Stopped ADAM_Test
Stopped Alerter
Running ALG
Stopped AppMgmt
Stopped aspnet_state
Running AudioSrv
Running BITS
Running Browser
Running CryptSvc
Running DcomLaunch
Running Dhcp
Running Eventlog
Running EventSystem
Running Spooler

Pro zastavení služby použijeme Stop-Service (spsv) a pro spuštění Start-Service (sasv). V závorkách jsou uvedeny aliasy pro dané cmdlety (pro Get-Service je to gsv).
PS C:\> gsv spooler

Status Name DisplayName
------ ---- -----------
Running Spooler Print Spooler
PS C:\> spsv spooler
PS C:\> gsv spooler

Status Name DisplayName
------ ---- -----------
Stopped Spooler Print Spooler
PS C:\> sasv spooler
PS C:\> gsv spooler

Status Name DisplayName
------ ---- -----------
Running Spooler Print Spooler

Je vidět, že pomocí PowerShellu je práce se službami přímočará a velice jednoduchá.
Pokud je někdo zvídavý a přecijen by chtěl pracovat se službami přes WMI, lze pro zastavení spooleru použít následující příkaz:
PS C:\> (gwmi Win32_Service -filter "name='spooler'").StopService()

__GENUS : 2
__CLASS : __PARAMETERS
__SUPERCLASS :
__DYNASTY : __PARAMETERS
__RELPATH :
__PROPERTY_COUNT : 1
__DERIVATION : {}
__SERVER :
__NAMESPACE :
__PATH :
ReturnValue : 0

Vidíme, že ReturnValue je nula, čili služba byla zastavena úspěšně. Pokud by ReturnValue byla jiná, lze její význam najít na MSDN.
To by bylo pro dnešek vše. Jdu stejně jako mistr Skriptík vyhlížet Windows 7.
Banner mistra Skriptíka je stažen ze stránek TechNet Flash zpravodaje. Děkuji týmu TechNetu za možnost jeho použití pro potřeby tohoto článku.

sobota 1. srpna 2009

Hej, mistře Šelíku!

Po odmlce způsobené pracovní zátěží a poté zaslouženou dovolenou jsme se s mistrem Šelíkem vrátili zpět do práce.

Pro základní práci s procesy lze v PowerShellu použít cmdlet Get-Process (nebo můžete použít alias gps). Při prostém zadání bez parametrů vypíše seznam běžících procesů. Pokud vás zajímá konkrétní proces, stačí uvést jeho jméno.

PS C:\> Get-Process powershell
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
656 14 55592 63296 270 4,29 264 powershell

V případě, že chcete vypsat všechny informace, použijte Format-List
PS C:\> Get-Process powershell | Format-List *
V tomto případě bych se ovšem přikláněl k použítí aliasů

PS C:\> gps powershell | fl *
PS C:\> gps pow* | fl *

přičemž druhý zápis by mohl způsobit "problémy" pokud na vašem počítači poběží proces s názvem např. powercfg.

Jistě jste si všimli, že ve výpisu není nikde vidět vlastník procesu. Je tedy nutné - na radu mistra Skriptíka - použít přístup přes WMI. V PowerShellu je přístup do WMI geniálně jednoduchou záležitostí. Je několik možností, jak cmdlet Get-WmiObject použít. Nyní je nebudu porovnávat, ale beru to jako námět na další článek. Nebudu ani vypisovat výsledek, protože to vždy bude jméno uživatele, který proces spustil. Při práci z příkazové řádky vždy používám pro Get-WmiObject jeho alias gwmi - ušetřím tím přesně $("get-wmiobject".length - "gwmi".length) znaků :)

PS C:\> gwmi win32_process |? {$_.name -eq 'powershell.exe'} | % {$_.GetOwner().User}
PS C:\> (gwmi win32_process |? {$_.name -eq 'powershell.exe'}).GetOwner().User
PS C:\> (gwmi win32_process -filter "name='powershell.exe'").GetOwner().user
PS C:\> (gwmi -query "select * from Win32_Process where name='powershell.exe'").GetOwner().User

Banner mistra Skriptíka je stažen ze stránek TechNet Flash zpravodaje. Děkuji týmu TechNetu za možnost jeho použití pro potřeby tohoto článku.

čtvrtek 14. května 2009

Hej, mistře Šelíku!

Vítejte zpátky u mistra Šelíka. V posledním TechNet Flash zpravodaji řešil následující problém.

No, dejme tomu - DateDiff je dobrá funkce, ale kdo si má pamatovat, kdy si naposledy měnil heslo. DateDiff (resp. odčítání dvou dat) bych použil v případě, že bych chtěl například zjistit, kolik dní zbývá do Vánoc.

PS C:\> $vanoce = '2009/12/24'
PS C:\> ($vanoce - (get-date)).Days
223

V případě zjištění délky používání hesla je lepší sáhnout přes ADSI na vlastnost PasswordAge.

PS C:\> [ADSI]$user="WinNT://czvm01/administrator,user"
PS C:\> $user.PasswordAge
97399082
PS C:\> ($user.PasswordAge).value/86400
1127,30418981481

První výsledek nám vrátil stáří hesla v sekundách, takže jsme jej přepočítali na dny. Vidíme, že administrátorské heslo na tomto počítači nebylo změněno hodně dlouho :) V případě, že by vás zajímalo stáří hesla pro účet v Active Directory, stačí změnit první řádek na následující variantu:

PS C:\> [ADSI]$user="WinNT://domain.name/administrator,user"

a v proměnné $user budeme mít uložen účet doménového administrátora.

Pokud víte, že informaci o stáří hesla budete využívat častěji, můžete si předchozí kód uložit do skriptu.

function Get-PasswordAge {

param (
[string]$scope = "$env:computername",
[string]$user = "administrator"
)

[ADSI]$ADSIobj="WinNT://$scope/$user,user"
"$user : $([Math]::Round(($ADSIobj.PasswordAge).value/86400))"
}

PS C:\> Get-PasswordAge
1127
PS C:\> Get-PasswordAge -user $env:USERNAME -scope $env:USERDOMAIN
86

Jediným doplněním je závěrečné zaokrouhlení dnů na celá čísla pro lepší přehlednost.

Banner mistra Skriptíka je stažen ze stránek TechNet Flash zpravodaje. Děkuji týmu TechNetu za možnost jeho použití pro potřeby tohoto článku.

úterý 12. května 2009

Update: Hej, mistře Šelíku!

Dnes jsem dostal povolení, že mohu přidávat banner mistra Šelíka do článků na tomto webu (viz např. tento příspěvek).

Banner je součástí českého TechNet Flash zpravodaje, který je dostupný (po registraci) na technetflash.cz. Pokud zpravodaj neodebíráte, mohu vám ho jen doporučit.

Těším se na další setkání s vámi a mistry Skriptíkem a Šelíkem :)

středa 29. dubna 2009

Hej, mistře Šelíku!

V jednom ze starších vydání mistra Skriptíka padl následující dotaz: "V přihlašovacím skritpu potřebuji ověřit existenci souboru. Víš, jak na to?" Odpověď byla následující: "Jedna možnost je použít objekt FileSystem a metodu FileExists."

Pokud chcete řešení v PowerShellu, mohu doporučit přímo cmdlet Test-Path. Více o něm v dřívějším článku.
V případě, že chcete použít .NET, existuje třída System.IO.File a obsahuje metodu Exists. Použití je následující:

PS c:\> [System.IO.File]::Exists("c:\config.sys")
True

pátek 17. dubna 2009

Hej, mistře Šelíku!

Při pročítání posledního CZ TechNet zpravodaje mě napadlo zpracovat téma z komiksu Hej, mistře Skriptíku! v PowerShellu. TechNet Flash zpravodaj je dostupný na www.technetflash.cz (včetně starších čísel). Rozhodně jej doporučuji všem IT odborníkům.


Tentokrát budeme potřebovat PowerShell v2 (CTP3). Tato verze již obsahuje cmdlety pro práci s Windows Event Logy:

PS C:\Users\beta> Get-Command -noun EventLog | Select-Object Name
Clear-EventLog
Get-EventLog
Limit-EventLog
New-EventLog
Remove-EventLog
Show-EventLog
Write-EventLog

Mrkneme se na Write-EventLog. Ten má čtyři povinné parametry: LogName, Source, EventID, Message. Zkusme tedy něco zapsat do aplikačního logu:

Write-EventLog -LogName Application -source "Windows Error Reporting" -eventID 007 -Message "James Bond is cool!"

Výborně, stále tomu ale něco chybí. Většinou budete chtít zapisovat data z vašich programů. Pokud zkusite zápis ve tvaru:

Write-EventLog -LogName Application -source "Moje Aplikace" -eventID 007 -Message "James Bond is cool!"

PowerShell vám vrátí chybu jejíž část The source was not found vám oznámí, že toto nelze. Je to způsobené tím, že každý zdroj (Source), který zapisuje do Event Logu musí být předem zaregistrován (viz MSDN). Naštěstí exituje v PowerShellu cmdlet New-EventLog, který tuto službu udělá za vás. Následující seznam příkazů již tedy povede ke zdárnému konci (pro registraci zdroje musíte příkaz pustit s právy administrátora):

PS C:\> New-EventLog -LogName Application -Source "Moje Aplikace"
PS C:\> Write-EventLog -LogName Application -source "Moje Aplikace" -eventID 001 -Message "Ale ja jsem jednicka."