我在Powershell中有一個字串,它包含了以下資料
。 An account failed to log on。
主題:
安全ID: S-1-5-18。
賬戶名稱: TEX
賬戶域名: TD2
登錄ID: 0x3E7
登錄型別: 8
登錄失敗的帳戶:
安全ID: S-1-0-0
賬戶名稱: test_mathysf
賬戶域名: tdlz2
故障資訊:
失敗的原因。 未知 用戶 名稱 或 壞 密碼。
狀態: 0xC000006D。
子狀態: 0xC000006A
程序資訊: 0xC000006A
呼叫者行程ID: 0x4f80
主叫行程名稱: C:WindowsSystem32inetsrvw3wp.exe。
網路資訊:
作業站名稱: T22
源網路地址: 192.168.10.28
源埠: 45221
詳細認證資訊:
登錄程序: Advapi
Authentication Package: Negotiate
過渡性服務: -
包 名 (NTLM 唯一): -
密鑰長度: 0
這 事件 是 生成的 當 a logon request fails。 它 是 生成的 在 的 計算機 where access was attempted。
Subject fields 表明 the account on the local system which? string">which requested the logon. 這 是 最 commonly a service such as the Ser
ver service, 或 一個 本地 process such as Winlogon. 或者 Services.exe.。
該 登錄 型別 域 指示 the kind of logon that was requested。 最常見的型別 是 2 (互動式) 和 3 (網路)。
的 流程 資訊 fields indicate which account 和 程序 上 的 系統 要求 the 登錄。
的 網路 資訊 欄位 指示 where a remote logon request originated。 作業站 名稱 是 非 總是 可用 和 可能 被 l
eft blank in some cases.
的 認證 資訊 欄位 提供了 detailed information about this specific logon request。
- Transited services指示 哪一個 中間 服務 已經 參與 in this logon request。
- package name indicates which sub- 協議 被 使用 其中 的 NTLM 協議。
- Key length indicates the length indicates the the string">length of the generated session key。 這 將 是 0 如果 沒有 session key was requested.
我想用下面的regex Pattern來轉義Subject和Key Lenght之間的所有內容,
。$pattern = "(?<=.*Subject:)w ? (?=Length:*)"
重碼的結果應該是這樣的
重碼的結果應該是這樣的
Subject:
安全ID: S-1-5-18。
賬戶名稱: TEX
賬戶域名: TD2
登錄ID: 0x3E7
登錄型別: 8
登錄失敗的帳戶:
安全ID: S-1-0-0
賬戶名稱: test_mathysf
賬戶域名: tdlz2
故障資訊:
失敗的原因。 未知 用戶 名稱 或 壞 密碼。
狀態: 0xC000006D。
子狀態: 0xC000006A
程序資訊: 0xC000006A
呼叫者行程ID: 0x4f80
主叫行程名稱: C:WindowsSystem32inetsrvw3wp.exe。
網路資訊:
作業站名稱: T22
源網路地址: 192.168.10.28
源埠: 45221
詳細認證資訊:
登錄程序: Advapi
Authentication Package: Negotiate
過渡性服務: -
包 名 (NTLM 唯一): -
密鑰長度: 0
但是在我的專案中,這個詞組不起作用。(它沒有得到一個匹配)
之后,我將使用ConvertFrom-StringData cmdlet來創建一個帶有條目的哈希表(例如Security ID --> Key = S-1-5-18)
。有人知道問題出在哪里嗎?
uj5u.com熱心網友回復:
你似乎想從事件文本中提取結構化資訊。
以下是我要做的事情。
function ExtractEventData{
param(
[string]$EventText
)
$pattern = [regex]"(?m)^(.*):s*(^ S.*:.*)
) "
$result = @{}。
foreach ($match in $pattern.Matches($EventText) {
$section_name = $match.Group[1] .Value
$result[$section_name] = @{}。
foreach ($line in $match.Group[2] .Captures) {
$key, $value = $line.Value.Split(' :'.ToCharArray(), 2)
$result[$section_name][$key.Trim()] =$value.Trim()
}
$result[$section_name] = [pscustomobject]$result[$section_name]
}
[pscustomobject]$result] }
}
當你用上面的樣本字串這樣呼叫它時
$result = ExtractEventData -EventText $sampleEvent
它產生這個資料結構:
行程資訊。@{呼叫者行程ID=0x4f80;呼叫者行程名稱=C:WindowsSystem32inetsrvw3wp.exe}。 詳細的認證資訊。@{密鑰長度=0; 登錄行程=Advapi; 包名稱(僅NTLM)=-; 認證包=Negotiate; 傳輸的服務=-}。 主題 : @{賬戶域=TD2; 安全ID=S-1-5-18; 賬戶名稱=TEX; 登錄ID=0x3E7}。 登錄失敗的賬戶: @{賬戶域名=tdlz2; 安全ID=S-1-0-0; 賬戶名=test_mathysf}。 失敗資訊 : @{狀態=0xC000006D; 失敗原因=用戶名不詳或密碼錯誤。} 網路資訊 : @{作業站名稱=T22; 源網路地址=192.168.10.28; 源埠=45221}。你可以直接訪問,例如,
$result.'網路資訊'.'作業站名稱' # => T22
重詞是
(?m) # 多行模式
^ # 行的開始
(.*):s* # 任何東西(例如'網路資訊'進入第1組),一個冒號,空格
( # 第2組(例如:'作業站名稱:T22')
^ S.*:.*
# 行的開始,4個空格,一個非空格,一個冒號,任何東西,換行
) #結束第2組,重復
這樣一來,每個部分都會被單獨處理,而在每個部分中,每一行都會被單獨處理。
uj5u.com熱心網友回復:
這是你從Get-WinEvent得到的Message屬性,它是一個具有LOCALIZED屬性的多行字串。
與其將該字串轉換為一個物件陣列,不如使用事件的XML符號,在那里你可以得到普遍命名的屬性。
像這樣:
$filter = @{LogName='Security'/span>; ProviderName='Microsoft-Windows-Security-Auditing';ID=4625 }
$result = Get-WinEvent -FilterHashtable $filter -ComputerName SECRETSERVER | ForEach-Object {
# 將事件轉換為XML并抓住事件節點。
$eventXml = ([xml]$_.ToXml()) 。
# 在你的輸出中輸出你需要的屬性。
[PSCustomObject]@{
時間 = [DateTime]$eventXml.System.TimeCreated.SystemTime
UserName = ($eventXml.EventData.Data | Where-Object { $_. Name -eq 'TargetUserName' }).'#text'。
UserSID = ($eventXml.EventData.Data | Where-Object { $_. Name -eq 'TargetUserSid' }).'#text'。
Computer = ($eventXml.EventData.Data | Where-Object { $_。 Name -eq 'WorkstationName' }).'#text'。
}
}
# output on screen
$result | Format-Table -AutoSize
# 輸出到CSV檔案
$result | Export-Csv -Path 'X:FailedLogons.csv' /span> -NoTypeInformation
在這里你可以看到XML將包含事件4625的所有屬性。上面的例子只是列出了登錄失敗發生的時間、進行該嘗試的計算機以及登錄失敗的用戶名。
uj5u.com熱心網友回復:
你可以使用
(?ms)^Subject:. *?L長度:(?-s)。
請看regex演示.
。Regex詳情:
(?ms)- 行內修改器,m使^匹配任何行的開始,$匹配任何行的結束位置,s使.匹配任何字符包括LF字符 。
^- 一行的開始 。
Subject:- 一個字面文本 。
.*?- 任何零或更多的字符,越少越好 。
Length:- 一個字面的文本 。
(?-s)- 現在,.不能再匹配LF字符了 。
.*--除換行符(LF)以外的任何零個或多個字符,盡可能多。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/326664.html
標籤:
