Zoals wel vaker zijn mijn threads half PRG en half WOS. De kennis zit evenwel in PRG dus ik post beter hier.
Ik portte een VBS script van Microsoft naar PowerShell omdat de VBS om een of andere reden niet werkte. Mijn port is geslaagd: de PoSh versie werkt al evenmin
Gelukkig heb ik wel de reden gevonden waarom het (in beide talen) niet werkt. Eerst de relevante code:
Powershell-met-C#-lexer
Wat dit script die WMI query doet is kijken of er tussen een [DateTime]$x en een [DateTime]$y, waarbij $y = $x + 1 seconde, events in de Security log zijn geweest. Dat zou het script in ieder geval moeten doen, maar ik krijg 0 objecten terug.
Aanvankelijk had ik een aha-erlebnis en zag ik het volgende probleem. Het systeem stuurt de actuele DateTime in het volgende formaat: 20130425112424.000000+120. De event logs zijn in hetzelfde formaat maar met een andere offset voor de regio: 20130425112424.000000-000.
De vergelijking kan niet werken als dit verschillend is (zie MSDN:CIM_DATETIME)
Even de methode SetVarDate (zie MSDN: SWbemDateTime.SetVarDate method) opgezocht en kijk: er is een tweede parameter die kan dienen.
De +120 is inderdaad weg nu
...maar ik heb +000 in de plaats
...en het werkt enkel met -000
Is er iemand thuis in deze materie? Ik heb momenteel veel zin om dat laatste emoticon écht uit te voeren.
Om gek te worden. Ik doe een WMI query voor wat random data. Men neme deze snippet met het volgende commando
Resultaat:
Nu zetten we die TimeGenerated in dezelfde query:
Resultaat:
Hoe kan dat nou?
Ik portte een VBS script van Microsoft naar PowerShell omdat de VBS om een of andere reden niet werkte. Mijn port is geslaagd: de PoSh versie werkt al evenmin
Gelukkig heb ik wel de reden gevonden waarom het (in beide talen) niet werkt. Eerst de relevante code:
Powershell-met-C#-lexer
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| $currentTime = Get-Date #knip irrelevante delen $dateTimeCriteria = New-Object -ComObject WBEMScripting.sWBEMDateTime $dateTimeCriteria.SetVarDate($currentTime, $false) $strCurrent = "`'$($dateTimeCriteria.Value)`'" # Ipv. bovenstaande drie lijnen gaat dit ook: # $strCurrent = "`'$([System.Management.ManagementDateTimeconverter]::ToDmtfDateTime((Get-Date))`'" # Idem voor hieronder $nextSec = New-Object -ComObject WBEMScripting.sWBEMDateTime $nextSec.SetVarDate($($currentTime.AddSeconds(1)), $false) $strNext = "`'$($nextSec.Value)`'" $colLoggedEvents = @(Get-WMIObject -ComputerName $computerName -Query "SELECT * FROM Win32_NTLogEvent WHERE Logfile = 'Security' AND TimeGenerated >= $strCurrent AND TimeGenerated < $strNext" -Impersonation Impersonate) |
Wat dit script die WMI query doet is kijken of er tussen een [DateTime]$x en een [DateTime]$y, waarbij $y = $x + 1 seconde, events in de Security log zijn geweest. Dat zou het script in ieder geval moeten doen, maar ik krijg 0 objecten terug.
Aanvankelijk had ik een aha-erlebnis en zag ik het volgende probleem. Het systeem stuurt de actuele DateTime in het volgende formaat: 20130425112424.000000+120. De event logs zijn in hetzelfde formaat maar met een andere offset voor de regio: 20130425112424.000000-000.
code:
1
2
| -000 = GMT +120 = GMT + 120 minuten |
De vergelijking kan niet werken als dit verschillend is (zie MSDN:CIM_DATETIME)
Even de methode SetVarDate (zie MSDN: SWbemDateTime.SetVarDate method) opgezocht en kijk: er is een tweede parameter die kan dienen.
Ik heb die 2e parameter dus gebruikt en false meegegeven zoals je kan zien in bovenstaand script.Parameters
vdate [in]
The variant date value to set the object. This parameter must be in the VT_DATE format.
bIsLocal [in, optional]
If TRUE, vdate is interpreted as a local time, and the Coordinated Universal Time (UTC) property contains the local time that is converted to the correct UTC offset. When bIsLocal is FALSE, then vdate is converted directly into a UTC value with an offset of zero (0).
De +120 is inderdaad weg nu
...maar ik heb +000 in de plaats
...en het werkt enkel met -000
Is er iemand thuis in deze materie? Ik heb momenteel veel zin om dat laatste emoticon écht uit te voeren.
Om gek te worden. Ik doe een WMI query voor wat random data. Men neme deze snippet met het volgende commando
C#:
1
| Get-WMIObject -ComputerName $computerName -Query "SELECT * FROM Win32_NTLogEvent WHERE Logfile = 'Security'" |
Resultaat:
code:
1
2
3
4
5
6
| [...] SourceName : Microsoft-Windows-Security-Auditing TimeGenerated : 20130425142559.392056-000 TimeWritten : 20130425142559.392056-000 Type : Audit Success [...] |
Nu zetten we die TimeGenerated in dezelfde query:
C#:
1
| Get-WMIObject -ComputerName $computerName -Query "SELECT * FROM Win32_NTLogEvent WHERE Logfile = 'Security' AND TimeGenerated = '20130425142559.392056-000'" |
Resultaat:
code:
1
|
Hoe kan dat nou?
[ Voor 13% gewijzigd door YellowOnline op 25-04-2013 16:33 ]