1

情報を収集して現在のコンピューターの XML ファイルに保存する powershell スクリプトを作成しました。XML をローカル サーバーに直接保存する方がよいと考えていました。Q: XML ファイルをサーバーに保存するにはどうすればよいですか? - これは、スクリプトと同じディレクトリに保存する方法です: $scriptpath = Split-Path -parent $myinvocation.MyCommand.Definition $template | 出力ファイル $ScriptPath\tempXML.xml

Q: スクリプトをローカル サーバー アントから実行し、そのサーバーに直接 XML を保存することはできますか?

これは私のスクリプトです:

<#
FORMAT:
 - All variabel names are lowercase
 - All tags in XML are lowercase
Some commands are run and placed directly into the XML (Commands before XML is made). 
Some commands are run after the XML is made and then adds children to specified nodes in the XML.
#>

#Saves the scriptpath to ScriptPath variable(HELPER)
$scriptpath = Split-Path -parent $myinvocation.MyCommand.Definition

#Saves computername to compname variable(HELPER)
$compname = gc env:computername

#Username
$brukernavn = gc env:username

#PC Serial Number
$serialnr = gwmi -computer $compname Win32_BIOS | ForEach {$_.SerialNumber}

#System Info
gwmi -computer $compname Win32_ComputerSystem | ForEach {$siname = $_.Name; $simanufacturer = $_.Manufacturer; $simodel = $_.Model}

#Graphic card
gwmi "win32_VideoController" | ForEach-Object {$gpuname = $_.Name}

#Processor Info
gwmi -computer $compname Win32_Processor | ForEach-Object {$cpuname = $_.Name; $cpumanufacturer = $_.Manufacturer; $cpucores = $_.NumberOfCores; $cpuaddresswidth = $_.AddressWidth}

#Memory
$totalmem = 0
$memsticks = gwmi -Class win32_physicalmemory
foreach ($stick in $memsticks) { $totalmem += $stick.capacity }
$totalmem = [String]$($totalmem / 1gb) + " GB"

#Install time for windows OS
$utctime = get-wmiobject win32_OperatingSystem | select-object -expandproperty installDate
$installtime = [System.Management.ManagementDateTimeConverter]::ToDateTime($utctime);


#--------#
#XML-form
#--------#

$template = "<computer version='1.0'>
    <hardware>
        <serialnumber>$serialnr</serialnumber>
        <systeminfo>
            <name>$siname</name>
            <manufacturer>$simanufacturer</manufacturer>
            <model>$simodel</model>
        </systeminfo>
        <drive>
            <name></name>
            <volumename></volumename>
            <size></size>
        </drive>
        <memory>
            <size>$totalmem</size>
        </memory>
        <gpu>
            <name>$gpuname</name>
        </gpu>
        <cpu>
            <name>$cpuname</name>
            <manufacturer>$cpumanufacturer</manufacturer>
            <id>cpuid</id>
            <numberofcores>$cpucores</numberofcores>
            <addresswidth>$cpuaddresswidth</addresswidth>
        </cpu>
    </hardware>
    <software>
        <user>
            <name>$brukernavn</name>
        </user>
        <osinfo>
            <caption></caption>
            <serialnumber></serialnumber>
            <installdate>$installtime</installdate>
            <servicepack></servicepack>
        </osinfo>
    </software>
</computer>"

$template | out-File $ScriptPath\tempXML.xml
$systemroot = [System.Environment]::SystemDirectory
$xml = New-Object xml
$xml.Load("$ScriptPath\tempXML.xml")

#Drive, hardware
$newdrive = (@($xml.computer.hardware.drive)[0])
Get-WmiObject -Class Win32_logicaldisk |
ForEach-Object {
    $newdrive = $newdrive.clone()
    $newdrive.name = [string]$_.name
    $newdrive.volumename = [string]$_.volumename
    $newdrive.size = "{0:N2}" -f ($_.size/1Gb) + " GB"   
    $xml.computer.hardware.AppendChild($newdrive) > $null
}
$xml.computer.hardware.drive | where-object {$_.size -eq "0,00 GB" -or $_.volumename -eq ""} | foreach-object {$xml.computer.hardware.RemoveChild($_)}

#Memory Info, hardware
$newmemory = (@($xml.computer.hardware.memory)[0])
Get-WmiObject -Class WIN32_PhysicalMemory |
ForEach-Object {
    $newmemory = $newmemory.clone()
    $newmemory.PositionInRow = [string]$_.PositionInRow
    $newmemory.datawidth = [string]$_.datawidth
    $newmemory.size = [String]$($_.capacity / 1gb) + " GB"
    $newmemory.devicelocator = $_.devicelocator
    $xml.computer.hardware.AppendChild($newmemory) > $null
}
$xml.computer.hardware.memory | where-object {$_.size -eq ""} | foreach-object {$xml.computer.hardware.RemoveChild($_)}

#OSInfo, software
$newosinfo = (@($xml.computer.software.osinfo)[0])
Get-WmiObject -computer $compname Win32_OperatingSystem | 
ForEach-Object {
        $newosinfo = $newosinfo.clone() 
        [String] $bitversion = gwmi Win32_OperatingSystem osarchitecture;
        $newosinfo.caption = [String]$_.caption
        $newosinfo.serialnumber = [string]$_.serialnumber + " " + $bitversion   
        $newosinfo.servicepack = $_.csdversion
        $xml.computer.software.AppendChild($newosinfo) > $null
}
$xml.computer.software.osinfo | where-object {$_.caption -eq ""} | foreach-object {$xml.computer.software.RemoveChild($_)}


#-------Save content----------------
$xml.Save("$ScriptPath\tempXML.xml")
#-----------------------------------
4

1 に答える 1

3

このようにしてみてください:

$xml.Save("\\$compname\c$\tempXML.xml") # this save on the root (c:\) of remote server

ac $共有にアクセスするには、ローカル管理クレデンシャルが必要です。他の方法で、各サーバーに\\ server \ myshareforxlmとして共有を作成し、適切なアクセス許可を設定して、次の操作を行うことができます。

$xml.Save("\\$compname\myshareforxml\tempXML.xml")
于 2012-04-15T17:12:03.897 に答える