Nastavení práv pro čtení EventLogu pomocí WMI
Nedávno jsem potřeboval načíst konkrétní záznamy ze systémového EventLogu. Šlo o tisky provedené na jednom serveru, které jsou ukládal do databáze. Výsledkem byl seznam toho, kdo/co/kdy/kolik tiskne. Integration Services nabízí komponentu, která uloží výsledek WMI dotazu do souboru (WMI Data Reader Task). Komponenta není bohužel napsána jako data flow source, ale i s nutným mezikrokem (uložení do souboru a následné načtení) je relativně snadno použitelná. Kromě cílového serveru se nastaví namespace pro WMI objekt, v případě EventLogu je to \root\cimv2.
WMI dotazovací jazyk (WMI Query Language - WQL) je podmnožina ANSI SQL. Dotaz na všechny tiskové události bude vypadat asi takto: Select * from Win32_NTLogEvent Where Logfile = 'System' And SourceName='Print' And TimeGenerate > '20100101141835.00000420'
Určitým problémem může být práce s časovým formátem WQL, zde ale pomůže třída System.Management.ManagementDateTimeConverter.
Služba WMI původně vznikla, aby umožnila prováděni administrativních úkolů na vzdálených počítačích. Základním (a ve většině WMI příkladů nejspíš implicitně očekávaným) nastavením jsou administrátorská práva. Při detailnějším nastavení přístupových práv je ale situace o něco složitější. Co je tedy nutno udělat?
DCOM nastavení. WMI používá DCOM pro běh kódu na cílovém počítači. První věcí je tedy umožnit vzdálený přístup k počítači.
- Spustit DCOM Config (DCOMCnfg.exe nebo přes administrative tools)
- Component Services -> Computers -> My Computer, zobrazit Properties na My Computer
- Zobrazit záložku COM Security
- Kliknout na Edit limits... pro Launch and Activation Permissions
- Přidat nový účet/skupinu s právy Remote Launch a Remote Activation
- Kliknout na Edit limits... pro Access Permissions
- Vybrat Anonymous Logon a přidat volbu Remote Access
Securing a Remote WMI Connection
WMI Namespace Security - přístup k jednotlivým namespace, pro tento příklad "postačí" defautní \root\cimv2
- Otevřít MMC add-in pro WMI Control (třeba Administrative Tools -> Computer Management -> Services and Applications -> WMI Control)
- Zobrazit Properties pro WMI Control
- Vybrat záložku Security
- Zvolit cílový namespace
- Kliknout na Security a zvolenému účtu nastavit volbu Remote Enable
Setting Namespace Security with the WMI Control
Nastavení práv pro čtení EventLogu.
- Spustit RegEdit pro editaci registry
- Vybrat větev (pro System EventLog) HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Eventlog\System
- Zvolit CustomSD
- Přidat nový SD (security descriptor) záznam pro zvolený účet
- SD záznam bude vypadat nějak následovně: O:BAG:SYD:(A;;0x07;;;WD)S:(ML;;0x1;;;LW)
- Přidaný řetězec bude ve tvaru: (A;;0x1;;;SID) A-Allow, 0x1 - Read a SID bude SID vybraného účtu
- SID lokálního účtu (tak jsem ho vyčetl já) jde zjistit opět přes registry, větev
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion \ProfileList
How to set event log security locally or by using Group Policy in Windows Server 2003
http://www.jameskovacs.com/blog/WritingToTheEventLogFromASPNETFailsWhenRunningOnWindowsServer2003SP1.aspx