Archive

Archive for the ‘Powershell’ Category

Hyper-V 3.0: Kleines Script zum Aufräumen

March 17th, 2013 No comments

Je nachdem wie gründlich man seinen Hyper-V Server pflegt, kann es passieren, dass im Cluster Shared Volume (CSV) ein paar Leichen übrig bleiben, da beim Löschen einer Virtuellen Maschine (VM) nicht automatisch die zugehörigen Disks (VHD) gelöscht werden.

Daher habe ich für meine Demo-Umgebung ein kleines Powershell Script geschrieben, dass alle an im Cluster registrierten VMs angehängte Disks auflistet und diese mit den im Dateisystem vorhandenen VHD Dateien abgleicht. Das Ergebnis kann dann genutzt werden, um eventuelle Leichen zu entdecken.

$vms=get-cluster | Get-ClusterResource | where {$_.ResourceType -like 'Virtual Machine'} | get-vm
$arrFiles=@()
$vms | ForEach-Object {
  $vm=$_
  #Add Hard disks to array
  $vm.HardDrives | ForEach-Object {
    $arrFiles+=$_.Path
  }
  #add isos to array
  $vm.DVDDrives | ForEach-Object {
    $arrFiles+=$_.Path
  }
}
#$arrFiles
Get-ChildItem C:\ClusterStorage -Recurse -Include *.vhd,*.vhdx,*.iso | ForEach-Object {
$file=$_.FullName
if ($arrFiles -notcontains $file) {
    write-host $file 
 }
} 
Categories: Hyper-V, Powershell Tags: ,

Hyper-V 3.0: Measure und NetworkACL

September 30th, 2012 No comments

Nachdem im letzten Artikel eine riesige Auswahl von Neuerungen in Windows 2012 vorgestellt wurden, soll dieser Artikel auf zwei Spezialitäten eingehen, die momentan nur mit PowerShell zu aktivieren sind:

  • Network ACLs: pro Virtuellen Maschine (VM) auf Netzwerkebene definieren, auf welche Zielsysteme die VM zugreifen kann. Diese “Firewall”-Funktion wird direkt durch Hyper-V durchgeführt und ist vom in der VM eingesetzten Betriebssystem unabhängig
  • Metering von VMs: Mitprotokollieren von Verbrauchswerten einer VM

Network ACL

Read more…

SCSM: Mass deleting incidents

September 2nd, 2012 No comments

Sometimes if you are testing the import of a bunch of incidents, it is necessary to delete them.

As usual you can do it with a one-line powershell:

This command deletes all incidents that are created from yesterday to now:

(Get-SCSMClass -Name "System.WorkItem.Incident" | Get-SCSMClassInstance)
 | where {$_.FirstAssignedDate -gt ((get-Date).addDays(-1))} | Remove-SCSMClassInstance

In SCSM you first have to retrieve the class you are interessted in. After that you search for all instances of this class. The last command Remove-SCSMInstance deletes all matching instances.

MDOP: UE-V–Teil 3 – Verwendung von UE-V in WHS

May 27th, 2012 No comments

Da ich zu hause einen Windows Home Server (WHS) mit mehreren Clients aber ohne zentrale Profile (da keine Windows Domäne vorhanden ist) einsetze, ist User Environment Virtualization (UE-V) die optimale Ergänzung.

Dazu bin ich folgendermaßen vorgegangen:

Über das Dashboard habe ich ein neue Freigabe namens Settings angelegt. Um mir die Berechtigungsvergabe zu vereinfachen habe ich für alle relevanten Benutzer Read/Write Berechtigungen vergeben.

In einem Unterordner namens Agent liegt darin der Agent mit einem Installationsscript. Parallel zu diesem Ordner existiert ein Ordner Templates, in dem ich die selbsterstellten Vorlagen abgelegt habe.

Im Agent Ordner liegt der komplette Inhalt des heruntergeladenen Installationspakets (der Ordner mit AgentSetup.exe). Zusätzlich existiert die Datei install.cmd zur Einfachen Installation:

"%~dp0agentsetup.exe" /quiet /norestart /l*v "%systemroot%\UE-VAgentInstaller.log" SettingsStoragePath="\\whsserver\settings\%%username%%" SettingsTemplateCatalogPath="\\whsserver\settings\Templates"
call "%~dp0settings.cmd"

Diese Datei führt nach der Installation die zusätzliche Datei settings.cmd aus. Diese Batchdatei ist für den Import der Templates zuständig:

rem reg add HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\UEV\Agent\Configuration /v DisableOfflineSupport /t REG_DWORD /d 1 /f
powershell -Command "set-executionpolicy remoteSigned"
copy "%~dp0importall.ps1" "%temp%\importall.ps1"
powershell "%temp%\importall.ps1"
pause

Der Import erfolgt über Powershell. Da Powershell standardmäßig keine Scripts ausführt, wird zuerst die Execution Policy angepasst. Danach wird das Powershell Script lokal kopiert und ausgeführt. Das Powershell Script ist sehr übersichtlich:

Import-module Microsoft.UEV.commands
get-childitem -Recurse \\whsserver\settings\templates\*.xml  | ForEach-Object { $_.fullname | Register-UevTemplate }
get-childitem -Recurse \\whsserver\settings\templates\*.xml  | ForEach-Object { $_.fullname | Update-UevTemplate }

Zuerst registriert es alle Templates die in dem Templates Ordner vorhanden sind. Sollte das Template schon registriert sein, so wird es automatisch ignoriert. Danach werden alle Templates aktualisiert, d.h. ist ein Templates schon registriert worden aber es liegt eine neuere Version vor, so wird es in diesem Schritt auf die neue Version gebracht. Somit ist das settigns.cmd Script auch für spätere Templateaktualisierungen verwendbar.

SCVMM: mit Powershell Teil 1

December 4th, 2011 No comments

Ich habe gerade das Glück etwas mehr mit Powershell und System Center Virtual Machine Manager 2012 (SCVMM, RC) zu arbeiten. Daher werde ich hier wieder ein paar Codesnippsel posten, um bestimmte Funktionen zu automatisieren:

die erste Funktion soll eine neue Cloud für Hyper-V erzeugen . Zusätzlich wird ein neue Rolle für diese Cloud angelegt, die nur VMs verwalten darf.

#creates a new cloud and a corresponding usergroup
function createCloud([string]$name,[string]$hostgroupname)
{
   #retrieving first GUID for creating the new cloud
     $job= ([System.Guid]::NewGuid().toString())
   #define Cloud limitations (here: no limit)
     Set-SCCloudCapacity -JobGroup $job -UseCustomQuotaCountMaximum $true -UseMemoryMBMaximum $true -UseCPUCountMaximum $true -UseStorageGBMaximum $true -UseVMCountMaximum $true
   #setting the used network (here: the network has the same name as the cloud)
     $resources = @()
     $resources += Get-SCLogicalNetwork -Name $Name
   #defining that the cloud can be used on hyper-v server
     $addCapabilityProfiles = @()
     $addCapabilityProfiles += Get-SCCapabilityProfile -Name "Hyper-V"
   #adding the settings to the cloud with the defined GUID
     Set-SCCloud -JobGroup $job -RunAsynchronously -AddCloudResource $resources -AddCapabilityProfile $addCapabilityProfiles
   #adding the cloud to the hostgroup
     $hostGroups = @()
     $hostGroups += Get-SCVMHostGroup -Name $hostgroupname
   #creating the cloud and the rest from the first job :-) 
     New-SCCloud -JobGroup $Job -VMHostGroup $hostGroups -Name $Name -RunAsynchronously

#creating the usergroup
   #GUID for the second job
     $job= ([System.Guid]::NewGuid().toString())
   #the roleis for the newly created cloud
     $scopeToAdd = @()
     $scopeToAdd += Get-SCCloud -name $name
   #the user of this role can start, stop and shutdown virtual machines in the cloud and start a remote control
     Set-SCUserRole -JobGroup $job -AddScope $scopeToAdd -Permission @("RemoteConnect", "Shutdown", "Start", "Stop") -ShowPROTips $false
     $cloud = Get-SCCloud -Name $name
   #add all settings to the role
     Set-SCUserRoleQuota -Cloud $cloud -JobGroup $job -QuotaPerUser -UseCPUCountMaximum -UseMemoryMBMaximum -UseStorageGBMaximum -UseCustomQuotaCountMaximum -UseVMCountMaximum
   #create the role with the job guid
     New-SCUserRole -Name $name -UserRoleProfile "SelfServiceUser" -Description "" -JobGroup $job
}

Die Funktion kann einfach per


createCloud "MeineCloud" "Alle Hosts"

aufgerufen werden.

Enteo: Powershell und schnelles Gruppenfüllen

September 20th, 2011 No comments

icon-11Auch diesmal wieder ein Script, um schnell eine statische Gruppen füllen zu können. Als Input wird nur eine Textdatei mit den PC Namen benötigt. Die Gruppe wird ebenfalls als Name hinterlegt.

Add-PSSnapin NwcServices.BlsAdministration
$server="\\enteoWebServiceServer"
$csvfile="C:\Computerliste.csv"
$groupName="Statische Gruppe"
New-PSDrive -Name emdb -psProvider BlsEmdb -Root $server
cd "emdb:\rootdse"
$csv=import-csv $csvfile

$grp=get-emdbgroup -recurse $groupName
if (-not $grp) {
   write-host "ERROR: Software nicht gefunden: " $groupName
}
else
{
   $csv | forEach-Object {
      write-host $_.pc
      $pc=get-emdbcomputer -recurse $_.pc
      $grp.addMember($pc)
   }
}

Die CSV Datei muss als erste Zeile die Überschrift definieren, d.h. eine Zeile mit PC besitzen. Das Skript selber ist wie üblich aufgebaut. Zuerst wird die Verbindung zum Enteo Webservice Server aufgebaut und danach die Zielgruppe gesucht. Wird diese gefunden, dann wird die CSV Datei geladen und aus jeder Zeile der Wert in der Spalte PC genommen. Nach diesem Namen wird gesucht und der gefundene PC der Gruppe hinzugefügt.

Categories: Deutsch, Powershell Tags: ,

Enteo, Powershell und PnP IDs

August 30th, 2011 No comments

Heute mal wieder eine kurze Powershell Zeile, um alle in Enteo hinterlegten PnP-IDs in den Driver Packages auszulesen und auszugeben.

Interessant kann diese Liste sein, um sie mit einer Enteo-externen Inventur zu vergleichen oder zu überprüfen, ob eine neue Hardware bereits unterstützt wird.


(Get-EmdbSoftwarePackage -recurse -Filter "SchemaTag=PnpPackage" |

where {$_.PnPEnabledIdList -ne $null}) |

foreach-object{$_.PnPEnabledIdList.Split(",")} > c:\temp\pnpids.txt

Zuerst wird in allen Software Paketen nach dem Typ PnPPackage gesucht. Aus diesen Ergebnissen werden alle Treiber ohne PnP Ids ausgefiltert. Das Ergebnis ist eine kommaseparierte Liste pro Treiber-Paket, die beim Komma getrennt wird. Am Ende steht eine Liste mit jeweils einer PnP Id pro Zeile:


[...]
OPTIONBUS\GTHSM501_DBG
OPTIONBUS\GTHSM501_DBG2
OPTIONBUS\GTHSM501_GPSD
OPTIONBUS\GTHSM501_GPSC
OPTIONBUS\GTHSM501_APP
OPTIONBUS\GTHSM501_APL
PCI\VEN_8086&DEV_105E&SUBSYS_105E8086
PCI\VEN_8086&DEV_105E&SUBSYS_005E8086
PCI\VEN_8086&DEV_105E&SUBSYS_115E8086
PCI\VEN_8086&DEV_105E&SUBSYS_125E8086
PCI\VEN_8086&DEV_105E&SUBSYS_135E8086
PCI\VEN_8086&DEV_105E&SUBSYS_704E103C
PCI\VEN_8086&DEV_105E
PCI\VEN_8086&DEV_105F&SUBSYS_005F8086
PCI\VEN_8086&DEV_105F&SUBSYS_115F8086
PCI\VEN_8086&DEV_105F&SUBSYS_125F8086
PCI\VEN_8086&DEV_105F&SUBSYS_704F103C
PCI\VEN_8086&DEV_105F
PCI\VEN_8086&DEV_1060&SUBSYS_00608086
[...]

Enteo, Powershell und Installationsstatus

July 23rd, 2011 No comments

Zentraler Punkt in dem Script ist die Erkennung in welchem status die Installation gerade ist. Folgende Status sind möglich:

  • Installation noch nicht eingeplant
  • Installation eingeplant aber noch nicht gestartet
  • Installation ist angelaufen aber noch nicht beendet
  • Installation ist durchgelaufen

Zur Ermittlung dierer Status greifen wir wieder auf das Auslesen von PolicyInstancen zurück. Dazu werden am Anfang einige Policy-IDs definiert, die die verschiedene Status beschreiben:
Read more…

Enteo, Powershell, ReInstall

July 11th, 2011 No comments

boxJetzt wo wir einen Rechner per Powershell aufwecken können kommt als nächstes die Funktion um eine Neuinstallation anzustossen und sie wieder abzubrechen.

Der Abbruch ist deswegen relevant, da u.U. das WoL nicht funktioniert. Startet der Benutzer am nächsten Morgen den PC wieder ganz normal an, so würde die Installation direkt startet und er könnte ein paar Stunden nicht arbeiten. Daher stoppt das Script die Installation automatisch, falls sie nicht innerhalb eines bestimmten Zeitfenster gestartet werden konnte.

Read more…

Enteo, Powershell und Wake on Lan (WoL)

July 9th, 2011 No comments

boxWie versprochen geht es weiter mit der Automatisierung von Enteo durch Powershell. In diesem Blog Eintrag nehme ich mir die Funktion für das Aufwecken eines PCs vor. Leider funktioniert hier die WoL Funktion von Enteo nicht immer. Das liegt u.a. daran, dass bei einem neuen PC nicht alle Informationen vorliegen. In den meisten Netzen wird ein normales WoL Paket (ein Broadcast Paket) nicht an alle Subnetze verteilt. Der Enteo Server und der zu weckende Client sind im Allgemeinen in unterschiedlichen Subnetzen beheimatet. Daher muss mit einem directed Broadcast gearbeitet werden. Dazu wird das Broadcast Paket direkt an die Broadcast Adresse des Zielsubnetzes geschickt. Dazu ist aber die IP Adresse und die Subnetzmaske zur Ermittlung der Broadcast Adresse notwendig. Diese Information liegt Enteo nicht immer vor und ich habe noch keinen Weg gefunden, diese Info beim Erstellen des Computerkontos mitzugeben.

Read more…

Categories: Powershell Tags: , , , ,