2012-04-15 2 views
1

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

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") 
#----------------------------------- 
+0

あなたは-computernameのPARAMが欠落している呼び出します。値は、常にスクリプトが実行されるローカルコンピュータのものです。 –

答えて

3

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

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

あなたは、C $共有にアクセスするためのローカル管理者の資格を必要としています。 あなたは他の方法で、\\サーバー\ myshareforxlmとして、各サーバーでの共有を作成し、右のパーミッションを設定して行うことができます。gwmiの一部で

$xml.Save("\\$compname\myshareforxml\tempXML.xml") 
+0

クリスチャンありがとうございましたが、上記のコード "\\ $ compname \ c $ \ tempXML.xml"からパスを詳しく説明できます。私は実際には、このパスがサーバ上のC-diskをどのようにポイントしているのか、ローカルマシンではないのか分かりません。ありがとう:) – haakonlu

+1

あなたはリモートサーバの名前に基づいて$ compnameの値を変更する必要があります!多分、名前とforeach($ complistの$ compname){..あなたの実際のスクリプト...}の配列で。 $ compnameが$ enc:computernameから削除されているのを見ない。私はそれがparamとしてスクリプトに渡されたと思った。 –

関連する問題