Войти

Показать полную графическую версию : Выборка данных из XML


Dim4eg10
07-08-2017, 15:57
Добрый день!
Возникла прям насущная необходимость автоматизации работы с отчетами в XML формате (генерит кучу файлов-отчетов по каждому ПК в сети).
Нужно собрать из каждого файла необходимую информацию (учетные записи администраторов, пароли без ограничения по времени, гостевые учетки и т.д. - Administrators, Password Expiration, Guest Account). Как я вижу механизм разбора:

1. Считываем файл .xml в память
2. по нему проводим разбор интересующих нас вхождений (каждый пункт имеет вид типа Check ID="106" Grade="3" Type="1" Cat="1" Rank="8" Name="Password Expiration").
3. Заносим полученную информацию в новый xml файл
4. Повторяем для каждого файла пункты 1-3.

Не могу добраться до данных, находящихся в разделах XML - (в примере, Check ID="106", Нужны данные по пользователям, находящимся в подразделах <Head> <Col>User</Col> </Head>.
команда
[XML]$c=get-content c:\ps\1\convert.xml
$p=$c.SecScan.Check

не дает мне добраться до необходимых полей (такое впечатление, что они просто обрезаются)


Проблемы, которые я вижу - "вычленить" только необходимые данные из строк, свести их вместе?

Пример .xml файла: <SecScan ID="0" DisplayName="test\DC2" Machine="DC2" Date="2017-04-13 12:05:27" LDate="13.04.2017 12:05" Domain="test" IP="192.168.1.242" Grade="1" HotfixDataVersion="2017-04-10T21:31:59Z" MbsaToolVersion="2.3.2211.0" IsWorkgroup="False" SUSServer="" HFFlags="4" SecurityUpdatesScanDone="True" WUSSource="" IsCSAMode="false">
<IPList><IP addr="-1022950926" /></IPList>
<AdditCabs><Cab Prop="" /></AdditCabs>
<Check ID="104" Grade="6" Type="1" Cat="1" Rank="1" Name="Local Account Password Test" URL1="Help/Check5315.html" URL2="Help/Check5315fix.html" >
<Advice>Password checks are not performed on a domain controller.</Advice>
</Check>
<Check ID="10500" Grade="1" Type="5" Cat="1" Rank="1" Name="Security Updates" >
<Advice>Cannot load security CAB file.</Advice>
</Check>
<Check ID="10101" Grade="4" Type="1" Cat="2" Rank="15" Name="Windows Version" URL1="Help/Check53117.html" >
<Advice>Computer is running Microsoft Windows 8.1.</Advice>
</Check>
<Check ID="102" Grade="5" Type="1" Cat="1" Rank="3" Name="File System" URL1="Help/Check5313.html" URL2="Help/Check5313fix.html" >
<Advice>All hard drives (1) are using the NTFS file system.</Advice>
<Detail>
<Head>
<Col>Drive Letter</Col>
<Col>File System</Col>
</Head>
<Row Grade="5">
<Col>C:</Col>
<Col>NTFS</Col>
</Row>
</Detail>
</Check>
<Check ID="106" Grade="3" Type="1" Cat="1" Rank="8" Name="Password Expiration" URL1="Help/Check5317.html" URL2="Help/Check5317fix.html" >
<Advice>Some user accounts (34 of 262) have non-expiring passwords. </Advice>
<Detail text="Accounts with a green check have passwords that do not expire but were specified in NoExpireOk.txt">
<Head>
<Col>User</Col>
</Head>
<Row Grade="3">
<Col>AdmOraMon</Col>
</Row>
<Row Grade="3">
<Col>Barsov-AS</Col>
</Row>
<Row Grade="3">
<Col>CCB</Col>
</Row>
<Row Grade="3">
<Col>Guest</Col>
</Row>
<Row Grade="3">
<Col>Ivanov-AS</Col>
</Row>
<Row Grade="3">
<Col>testDLP</Col>
</Row>
<Row Grade="3">
<Col>OPER1</Col>
</Row>
<Row Grade="3">
<Col>OPER2</Col>
</Row>
<Row Grade="3">
<Col>AlterAgentSrv</Col>
</Row>
<Row Grade="3">
<Col>AlterAgentSrvTest</Col>
</Row>
<Row Grade="3">
<Col>SB</Col>
</Row>
<Row Grade="3">
<Col>SBEA</Col>
</Row>
<Row Grade="3">
<Col>SBEU</Col>
</Row>
<Row Grade="3">
<Col>SYSOPMCI</Col>
</Row>
<Row Grade="3">
<Col>SrvtAgentOnline</Col>
</Row>
<Row Grade="3">
<Col>SysOp</Col>
</Row>
<Row Grade="3">
<Col>admback</Col>
</Row>
<Row Grade="3">
<Col>admbackag</Col>
</Row>
<Row Grade="3">
<Col>altst</Col>
</Row>
<Row Grade="3">
<Col>bellcow</Col>
</Row>
<Row Grade="3">
<Col>bellfish</Col>
</Row>
<Row Grade="3">
<Col>ckfr</Col>
</Row>
<Row Grade="3">
<Col>kav</Col>
</Row>
<Row Grade="3">
<Col>kAdmin</Col>
</Row>
<Row Grade="3">
<Col>kControl</Col>
</Row>
<Row Grade="3">
<Col>kInter</Col>
</Row>
<Row Grade="3">
<Col>kMonitor</Col>
</Row>
<Row Grade="3">
<Col>kOper</Col>
</Row>
<Row Grade="3">
<Col>kTrans</Col>
</Row>
<Row Grade="3">
<Col>kTransport</Col>
</Row>
<Row Grade="3">
<Col>qurto</Col>
</Row>
<Row Grade="3">
<Col>scom</Col>
</Row>
<Row Grade="3">
<Col>scom_sql</Col>
</Row>
<Row Grade="3">
<Col>useruit</Col>
</Row>
<Row Grade="5">
<Col>SUPPORT_388945a0</Col>
</Row>
</Detail>
</Check>
<Check ID="107" Grade="5" Type="1" Cat="1" Rank="5" Name="Guest Account" URL1="Help/Check5318.html" URL2="Help/Check5318fix.html" >
<Advice>The Guest account is disabled on this computer.</Advice>
</Check>
<Check ID="110" Grade="5" Type="1" Cat="1" Rank="4" Name="Autologon" URL1="Help/Check5319.html" URL2="Help/Check5319fix.html" >
<Advice>Autologon is not configured on this computer.</Advice>
</Check>
<Check ID="117" Grade="5" Type="1" Cat="1" Rank="6" Name="Restrict Anonymous" URL1="Help/Check53110.html" URL2="Help/Check53110fix.html" >
<Advice>Computer is properly restricting anonymous access.</Advice>
</Check>
<Check ID="118" Grade="5" Type="4" Cat="1" Rank="10" Name="IE Zones" URL1="Help/Check53111.html" URL2="Help/Check53111fix.html" >
<Advice>Internet Explorer zones have secure settings for all users.</Advice>
</Check>
<Check ID="119" Grade="4" Type="1" Cat="2" Rank="12" Name="Auditing" URL1="Help/Check53114.html" URL2="Help/Check53114fix.html" >
<Advice>Logon Success auditing is enabled, however Logon Failure auditing should also be enabled.</Advice>
</Check>
<Check ID="121" Grade="4" Type="1" Cat="2" Rank="14" Name="Shares" URL1="Help/Check53115.html" URL2="Help/Check53115fix.html" >
<Advice>7 share(s) are present on your computer. </Advice>
<Detail text="Access: F - Full, R - Read, W - Write, D - Delete, X - Execute, C - Change">
<Head>
<Col>Share</Col>
<Col>Directory</Col>
<Col>Share ACL</Col>
<Col>Directory ACL</Col>
</Head>
<Row Grade="4">
<Col>ADMIN$</Col>
<Col>C:\Windows</Col>
<Col>Admin Share</Col>
<Col>NT AUTHORITY\Authenticated Users - RX, BUILTIN\Server Operators - RWXD, BUILTIN\Administrators - F, NT AUTHORITY\SYSTEM - F, NT SERVICE\TrustedInstaller - F</Col>
</Row>
<Row Grade="4">
<Col>C$</Col>
<Col>C:\</Col>
<Col>Admin Share</Col>
<Col>NT AUTHORITY\SYSTEM - F, BUILTIN\Administrators - F, BUILTIN\Users - RX</Col>
</Row>
<Row Grade="4">
<Col>NETLOGON</Col>
<Col>C:\Windows\SYSVOL\sysvol\test.local\SCRIPTS</Col>
<Col>Everyone - R, Administrators - F</Col>
<Col>NT AUTHORITY\Authenticated Users - RX, BUILTIN\Server Operators - RX, BUILTIN\Administrators - F, NT AUTHORITY\SYSTEM - F</Col>
</Row>
<Row Grade="4">
<Col>SYSVOL</Col>
<Col>C:\Windows\SYSVOL\sysvol</Col>
<Col>Everyone - R, Administrators - F, NT AUTHORITY\Authenticated Users - F</Col>
<Col>NT AUTHORITY\Authenticated Users - RX, BUILTIN\Server Operators - RX, BUILTIN\Administrators - F, NT AUTHORITY\SYSTEM - F</Col>
</Row>
<Row Grade="4">
<Col>dfs</Col>
<Col>c:\DFSTEST</Col>
<Col>Everyone - R</Col>
<Col>NT AUTHORITY\SYSTEM - F, BUILTIN\Administrators - F, BUILTIN\Users - RX</Col>
</Row>
<Row Grade="4">
<Col>dfs_adm</Col>
<Col>c:\DFSADM</Col>
<Col>Everyone - R</Col>
<Col>NT AUTHORITY\SYSTEM - F, BUILTIN\Administrators - F, BUILTIN\Users - RX</Col>
</Row>
<Row Grade="4">
<Col>print$</Col>
<Col>C:\Windows\system32\spool\drivers</Col>
<Col>Everyone - R, Administrators - F</Col>
<Col>Everyone - RX, BUILTIN\Print Operators - F, NT AUTHORITY\Authenticated Users - RX, BUILTIN\Server Operators - RWXD, BUILTIN\Administrators - F, NT AUTHORITY\SYSTEM - F</Col>
</Row>
</Detail>
</Check>
<Check ID="122" Grade="3" Type="1" Cat="1" Rank="7" Name="Administrators" URL1="Help/Check5316.html" URL2="Help/Check5316fix.html" >
<Advice>More than 2 Administrators were found on this computer.</Advice>
<Detail>
<Head>
<Col>User</Col>
</Head>
<Row Grade="3">
<Col>TEST\Enterprise Admins</Col>
</Row>
<Row Grade="3">
<Col>TEST\LocalAdminsTEST</Col>
</Row>
<Row Grade="3">
<Col>TEST\useruit</Col>
</Row>
</Detail>
</Check>
<Check ID="10124" Grade="6" Type="4" Cat="1" Rank="11" Name="Macro Security" >
<Advice>No supported Microsoft Office products are installed.</Advice>
</Check>
<Check ID="10123" Grade="4" Type="1" Cat="2" Rank="13" Name="Services" URL1="Help/Check53116.html" >
<Advice>No potentially unnecessary services were found.</Advice>
</Check>
<Check ID="10178" Grade="4" Type="1" Cat="1" Rank="9" Name="Windows Firewall" >
<Advice>This check was skipped because it cannot be done remotely.</Advice>
</Check>
<Check ID="179" Grade="2" Type="1" Cat="1" Rank="10" Name="Automatic Updates" URL1="Help/Check53178.html" URL2="Help/Check53178fix.html" >
<Advice>The Automatic Updates system service is not running.</Advice>
</Check>
<Check ID="180" Grade="3" Type="1" Cat="1" Rank="10" Name="Incomplete Updates" URL1="Help/Check5340.html" URL2="Help/Check5340fix.html" >
<Advice>A previous software update installation was not completed. You must restart your computer to finish the installation. If the incomplete installation was a security update, then the computer may be at risk until the computer is restarted.</Advice>
</Check>
<Check ID="10219" Grade="6" Type="2" Cat="4" Rank="0" Name="SQL Server/MSDE Status" >
<Advice>SQL Server and/or MSDE is not installed on this computer.</Advice>
</Check>
<Check ID="10314" Grade="6" Type="3" Cat="4" Rank="1" Name="IIS Status" >
<Advice>IIS is not running on this computer.</Advice>
</Check>
<Composite>41</Composite>
</SecScan>

Если у кого есть готовые механизмы, или хотя бы сможет подробно показать/объяснить как работать с разбором такого типа - буду крайне признателен!

Iska
07-08-2017, 16:33
Пример .xml файла: »
Пример файла прилагайте в архиве.

P.S. Какой смысл дублировать тему: PowerShell - Скрипт разбора отчетов MBSA (http://forum.oszone.net/post-2752728.html#post2752728)?

Dim4eg10
08-08-2017, 09:27
Доброе утро! Файл добавил. Про дублирование темы - mbsa мало кто с ним работал (вообще ни одного ответа), а xml - вот вы уже написали :)

Kazun
08-08-2017, 09:49
PS > $xml.SecScan.Check | ? ID -eq 106 | % Detail | Format-List


text : Accounts with a green check have passwords that do not expire but were specified in NoExpireOk.txt
Head : Head
Row : {Row, Row, Row, Row...}



PS > $xml.SecScan.Check | ? ID -eq 106 | % Detail | % Head

Col
---
User


PS > $xml.SecScan.Check | ? ID -eq 106 | % Detail | % Row

Grade Col
----- ---
3 AdmOraMon
3 Barsov-AS
3 CCB
3 Guest
3 Ivanov-AS
3 testDLP
3 OPER1
3 OPER2
3 AlterAgentSrv
3 AlterAgentSrvTest
3 SB
3 SBEA
3 SBEU
3 SYSOPMCI
3 SrvtAgentOnline
3 SysOp
3 admback
3 admbackag
3 altst
3 bellcow
3 bellfish
3 ckfr
3 kav
3 kAdmin
3 kControl
3 kInter
3 kMonitor
3 kOper
3 kTrans
3 kTransport
3 qurto
3 scom
3 scom_sql
3 useruit
5 SUPPORT_388945a0


PS > $xml.SecScan.Check | ? ID -eq 106 | % Detail | % {$_.Row.Col}
AdmOraMon
Barsov-AS
CCB
Guest
Ivanov-AS
testDLP
OPER1
OPER2
AlterAgentSrv
AlterAgentSrvTest
SB
SBEA
SBEU
SYSOPMCI
SrvtAgentOnline
SysOp
admback
admbackag
altst
bellcow
bellfish
ckfr
kav
kAdmin
kControl
kInter
kMonitor
kOper
kTrans
kTransport
qurto
scom
scom_sql
useruit
SUPPORT_388945a0

Dim4eg10
08-08-2017, 10:05
Больше спасибо! Но мне очень важно разобраться как что работает и в своих ошибках:

почему я не могу добраться до сведений во вкладке detail командами типа

[XML]$c=get-content c:\ps\1\convert.xml
$p=$c.SecScan.check | select detail

или $p=$c.SecScan.check.detail

p.s. в Вашем скрипте есть много вещей, которые я вижу в первый раз (конвеерные передачи %). Это относится чисто с разделу работы с xml или общие принципы работы с PS? (p.p.s какой раздел мануалов, книг почитать?)

Kazun
08-08-2017, 10:20
PS > $p = $xml.SecScan.check | select detail
PS > $p

detail
------



Detail
Detail





Detail
Detail









PS > $p.detail

Head Row
---- ---
Head Row
Head {Row, Row, Row, Row...}
Head {Row, Row, Row, Row...}
Head {Row, Row, Row}

PS > $p.detail.Head[0].Col
Drive Letter
File System
PS > $p.detail.Row[0].Col
C:
NTFS
PS > $p.detail.Row[0]

Grade Col
----- ---
5 {C:, NTFS}

Dim4eg10
08-08-2017, 10:41
$p = $xml.SecScan.check | select detail »

а переменная $xml? в нее мы get-content считываем содержимое файла?
[XML]$xml=get-content c:\test.xml

P.s. может я делаю что-то неправильно, но результата у меня нет :(((

[XML]$xml=get-content c:\test.xml
$p = $xml.SecScan.check | select detail

После ввода
$p.detail

ничего нет на выходе

Busla
08-08-2017, 10:56
Это относится чисто с разделу работы с xml или общие принципы работы с PS? (p.p.s какой раздел мануалов, книг почитать?) »
Eсли задачи преобразования xml возникают регулярно - есть смысл взяться за xslt. Для получения данных из xml предназначен xpath.

Бегать циклами по объектному представлению xml катит только как частное решение на скорую руку.

Dim4eg10
08-08-2017, 10:58
$xml.SecScan.Check | ? ID -eq 106 | % Detail | Format-List »

Выдает ошибку:

PS C:\ps\1> [XML]$xml=get-content c:\test.xml
$xml.SecScan.Check | ? ID -eq 106 | % Detail | Format-List

Where-Object : Не удается привязать параметр "FilterScript". Не удается преобразовать значение "ID" типа "System.String" в
тип "System.Management.Automation.ScriptBlock".
строка:2 знак:23
+ $xml.SecScan.Check | ? <<<< ID -eq 106 | % Detail | Format-List
+ CategoryInfo : InvalidArgument: (:) [Where-Object], ParameterBindingException
+ FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.WhereObjectCommand

Kazun
08-08-2017, 11:04
PowerShell V2 - признан устаревшим и больше не поддерживается. Данный функционал доступен с версии 3+.

Для V2:
$xml.SecScan.Check | ? {$_.ID -eq "106"} | % {$_.Detail} | Format-List

Dim4eg10
08-08-2017, 11:37
PowerShell V2 - признан устаревшим и больше не поддерживается. Данный функционал доступен с версии 3+. »

ЗАРАБОТАЛО! Огромное спасибо!




© OSzone.net 2001-2012