powershell创建xml以及父元素和子元素(如果它们不存在)

时间:2016-10-28 14:36:01

标签: xml powershell powershell-v2.0 powershell-v3.0 powershell-v4.0

我想知道是否有人可以提供帮助。 PowerShell从Exchange邮箱信息创建XML

我被告知需要审核Exchange环境中每个邮箱的访问权限。 我设法抓住每个邮箱并添加到XML,我的问题是其余的! 对于每个邮箱,我需要执行以下操作

  
      
  • 获取DisplayName,PrimarySMTP,Alias
  •   
  • 检查邮箱是否已在XML文件中,如果不是<Mailbox DisplayName="Jerry The Mouse" PrimarySMTP="jerrythemouse@domain.com" Alias="jerrythemouse" />
  •   
  • 检查OWA已启用
  •   
  • 检查邮箱部分中的OWA是否已经在XML文件中,如果没有添加<Access ServiceName="OWA" />
  •   
  • 获取当月的当天并向OWA添加条目<Report Day="DAY of REPORT" Enabled="true/false" />
  •   
  • 检查IMAP是否已启用
  •   
  • 检查邮箱部分中的IMAP是否已存在于XML文件中,如果未添加<Access ServiceName="IMAP" />
  •   
  • 获取当月的当天,并将条目添加到IMAP <Report Day="DAY of REPORT" Enabled="true/false" />
  •   
  • 检查POP已启用
  •   
  • 检查邮箱部分中的POP是否已存在于XML文件中,如果未添加<Access ServiceName="POP" />
  •   
  • 获取当月的当天,并将条目添加到IMAP <Report Day="DAY of REPORT" Enabled="true/false" />
  •   
  • 检查MAPI已启用
  •   
  • 检查邮箱部分中的MAPI是否已存在于XML文件中,如果未添加<Access ServiceName="MAPI" />
  •   
  • 获取当月的当天,并将条目添加到IMAP <Report Day="DAY of REPORT" Enabled="true/false" />
  •   
  • 完成后,保存XML
  •   

我不需要Exchange方面的帮助,只需按照上面的列表创建元素(如果它们不存在)!
XML文件将在下个月的第1天被删除 格式的原因是因为另一个部门的额外要求将采用xml并绘制月份的天数。 希望有人可以提供帮助

谢谢

xml的副本应如下所示。

<root>
    <Mailbox DisplayName="Jerry The Mouse" PrimarySMTP="jerrythemouse@domain.com" Alias="jerrythemouse">
        <Access ServiceName="OWA">
            <Report Day="01" Date="01/10/2016" Enabled="true" />
            <Report Day="02" Date="02/10/2016" Enabled="true" />
            <Report Day="03" Date="03/10/2016" Enabled="false" />
        </Access>
        <Access ServiceName="IMAP">
            <Report Day="01" Date="01/10/2016" Enabled="false" />
            <Report Day="02" Date="02/10/2016" Enabled="false" />
            <Report Day="03" Date="03/10/2016" Enabled="false" />
        </Access>
        <Access ServiceName="POP">
            <Report Day="01" Date="01/10/2016" Enabled="true" />
            <Report Day="02" Date="02/10/2016" Enabled="true" />
            <Report Day="03" Date="03/10/2016" Enabled="true" />
        </Access>
        <Access ServiceName="MAPI">
            <Report Day="01" Date="01/10/2016" Enabled="true" />
            <Report Day="02" Date="02/10/2016" Enabled="true" />
            <Report Day="03" Date="03/10/2016" Enabled="true" />
        </Access>
    </Mailbox>
    <Mailbox DisplayName="Tom The Cat" PrimarySMTP="tomthecat@domain.com" Alias="tomthecat">
        <Access ServiceName="OWA">
            <Report Day="01" Date="01/10/2016" Enabled="true" />
            <Report Day="02" Date="02/10/2016" Enabled="true" />
            <Report Day="03" Date="03/10/2016" Enabled="false" />
        </Access>
        <Access ServiceName="IMAP">
            <Report Day="01" Date="01/10/2016" Enabled="false" />
            <Report Day="02" Date="02/10/2016" Enabled="false" />
            <Report Day="03" Date="03/10/2016" Enabled="false" />
        </Access>
        <Access ServiceName="POP">
            <Report Day="01" Date="01/10/2016" Enabled="true" />
            <Report Day="02" Date="02/10/2016" Enabled="true" />
            <Report Day="03" Date="03/10/2016" Enabled="true" />
        </Access>
        <Access ServiceName="MAPI">
            <Report Day="01" Date="01/10/2016" Enabled="true" />
            <Report Day="02" Date="02/10/2016" Enabled="true" />
            <Report Day="03" Date="03/10/2016" Enabled="true" />
        </Access>
    </Mailbox>
    ...
</root>

1 个答案:

答案 0 :(得分:1)

您可以使用XPath查询检查节点是否存在:

$xml = [xml](Get-Content $filename)

$xml.SelectNodes("//root/Mailbox[@DisplayName='Jerry The Mouse']").Count
1

$xml.SelectNodes("//root/Mailbox[@DisplayName='Jerry The Mouse']/Access[@ServiceName='OWA']").Count
1

也就是说,如果这不是零,那么该节点至少存在一次。

添加新元素更加费力:

# Adding a new mailbox
$newMbx = $xml.CreateElement('Mailbox')

$attDisplayName = $xml.CreateAttribute('DisplayName')
$attPrimarySmtp = $xml.CreateAttribute('PrimarySmtp')
# etc.

$attDisplayName.Value = 'Spike The Dog'
$attPrimarySmtp.Value = 'SpikeTheDog@domain.com'
# etc.

$newMbx.Attributes.Append($attDisplayName)
$newMbx.Attributes.Append($attPrimarySmtp)
# etc.

$newSvc = $xml.CreateElement('Access')
$attServiceName = $xml.CreateAttribute('ServiceName')
$attServiceName.Value = 'OWA'
$newSvc.Attributes.Append($attServiceName)

# Add this back into the XML document:
$xml.LastChild.Append($newMbx)

在Mailbox / Access元素中添加新元素:

# Create a new $record XML element using the technique above

# Add this new element to an existing XML element:

$xml.SelectNodes("//root/Mailbox[@DisplayName='Spike The Dog']/Access[@ServiceName='OWA']").AppendChild($record)