Reputation: 949
I'va made a powershell script which collects information and saves it to an XML-file on current computer. I was thinking it was better to directly save the XML to a local server. Q: How is it possible to save XML-file to server? - This is how i'm saving to the same directory as the script: $scriptpath = Split-Path -parent $myinvocation.MyCommand.Definition $template | out-File $ScriptPath\tempXML.xml
Q: Is it possible to run the script from a local server ant then save the XML directly on there server?
This is my script:
<#
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")
#-----------------------------------
Upvotes: 1
Views: 358
Reputation: 60956
try like this:
$xml.Save("\\$compname\c$\tempXML.xml") # this save on the root (c:\) of remote server
You need local administrative credential to access a c$ share. You can in other way create a share in each server as \\server\myshareforxlm and setting the right permission and do:
$xml.Save("\\$compname\myshareforxml\tempXML.xml")
Upvotes: 3