Schlagwort-Archiv: Powershell

Neue Version der System Center Configuration Manager Cmdlet Library verfügbar

Veröffentlicht am 21.04.2015 um 14:44 Uhr von

Microsoft hat vor ein paar Tagen eine neue Cmdlet Library für den System Center Configuration Manager 2012 R2 veröffentlicht. Die Cmdlet Library trägt die Version 5.0.8231.1004 und bringt neue, verbesserte und korrigierte Cmdlets mit sich.

ConfigMgr2012PowerShellCmdlets

Download: System Center Configuration Manager Cmdlet Library

PS: Eine Randnotiz: „Installing the Cmdlet Library now updates PSModulePath to allow for easier importing of the ConfigurationManager module. To import the ConfigurationManager module into your Windows PowerShell session, you can now use the command: Import-Module ConfigurationManager without having to specify the full path to the Configuration Manager administrator console.

ConfigMgr: E-Mail-Notification for Application Catalog

Veröffentlicht am 03.11.2014 um 17:58 Uhr von

Mit der Application Catalog-Rolle bietet der Microsoft System Center Configuration Manager ab Version 2012 (SCCM) u.a. die Möglichkeit Anwendungen in einem recht einfach gestalteten Self-Service-Portal zur Verfügung zu stellen. Leider bietet die Rolle keine Funktion um den Administrator bei eingehenden Application Requests über E-Mail zu benachrichtigen. Abhilfe schafft dieses Powershell-Skript:

#####################################################################
### E-Mail-Notification for Application-Request in ConfigMgr 2012 R2
### powered by Andre Picker - www.clientmgmt.de
### http://twitter.com/clientmgmt
#####################################################################

### E-Mail Settings #################################################

$SmtpServer = "smtp.contoso.com"
$SenderMail = "configmgr@contoso.com"
$TargetMail = "andre.picker@contoso.com"
$Subject = "Application Catalog Request"
$Message = "You have received a new Application Request from System Center Configuration Manager:`n"
$Footer = "To process the request go to: \Software Library\Overview\Application Management\Approval Requests.`n`n*** This is an automatically generated email. Please do not reply to this message. ***"

### Interval #########################################################

$interval = $(Get-Date).AddMinutes(-60)

### Get SMS.Sitecode #################################################

$smsproviderloc = "select * from sms_providerlocation"
$sitecode = Get-WmiObject -Query $smsproviderloc -Namespace "root\sms" -ComputerName localhost
$sitecode = $sitecode.sitecode

### Query ############################################################

Get-WmiObject -Namespace "root\SMS\Site_$sitecode" -Class SMS_UserApplicationRequest | where {$_.CurrentState -match "1" -and [Management.ManagementDateTimeConverter]::ToDateTime($_.LastModifiedDate) -gt $interval} | Foreach-Object {

$User = $_.User
$Application = $_.Application
$Comments = $_.Comments
$Date = [Management.ManagementDateTimeConverter]::ToDateTime($_.LastModifiedDate)

Send-MailMessage -From $SenderMail -Subject "$Subject from $User" -To $TargetMail -Body "$Message`nUser: $user`nApplication: $Application `nDate: $Date `nComments: $Comments `n`n$Footer" -SmtpServer $SmtpServer
}

Das Skript kann im Task-Scheduler eingebunden und über folgenden Befehl aufgerufen werden:

powershell.exe -ExecutionPolicy Bypass -file "emailnotification.ps1"

E-Mail-Notification for Application Catalog:

configmgr-e-mail-notification-for-application-catalog

Download: ConfigMgr: E-Mail-Notification for Application Catalog (TechNet Gallery)

ConfigMgr: Limiting Collection per Powershell ersetzen

Veröffentlicht am 03.11.2014 um 09:42 Uhr von

Im Zuge der Restrukturierung einer ConfigMgr-Umgebung habe ich vor ein paar Tagen ein paar Powershellskripte geschrieben, die ich hier mit Euch teilen möchte.

Das erste Skript erfasst alle Sammlungen in einer ConfigMgr-Umgebung, die eine bestimmte LimitToCollectionID (Begrenzende Sammlung) hinterlegt haben und tauscht diese LimitToCollectionID durch eine andere CollectionID aus.

$sammlungen = Get-WmiObject -Namespace "root\SMS\Site_PR1" -Class SMS_Collection | where {$_.LimitToCollectionID -match "PR100065"}
foreach ($objItem in $sammlungen) {
$objItem.LimitToCollectionID = "SMS00001"
$objItem.Put()
}

Das zweite Skript erfasst alle Sammlungen, die ein bestimmtes Namensschema aufweisen und zusätzlich eine definierte LimitToCollectionID hinterlegt haben. Anschließend werden dann auch hier die LimitToCollectionID durch eine andere CollectionID getauscht.

$sammlungen = Get-WmiObject -Namespace "root\SMS\Site_PR1" -Class SMS_Collection | where {$_.Name -like "SCEP*" -and $_.LimitToCollectionID -match "PR100065"}
foreach ($objItem in $sammlungen) {
$objItem.LimitToCollectionID = "SMS00001"
$objItem.Put()
}

Kein Hexenwerk, aber unter Umständen sehr praktisch!

PS: Um die CollectionID für eine bestimmte Sammlung über Powershell herauszufinden reicht folgende Befehlszeile:

Get-WmiObject -Namespace "root\SMS\Site_PR1" -Class SMS_Collection | where {$_.Name -match "Sammlungsname"} | select Name, CollectionID

ConfigMgr: Zeige alle Sammlungen, bei denen „incremental update“ aktiviert ist (Powershell)

Veröffentlicht am 13.10.2014 um 12:59 Uhr von

Kurz und knapp: Es macht manchmal Sinn sich einen Überblick darüber zu verschaffen, welche Sammlungen in einer Configuration Manager-Hierarchy mit inkrementellen Updates arbeiten. Um alle Sammlungen anzuzeigen, bei denen die „Use incremental updates for this collection“-Option aktiviert ist, reicht ein einfacher Powershell-Befehl:

Get-CMDeviceCollection | Where-Object {$_.refreshtype -eq "4" -or $_.refreshtype -eq "6"}  | select Name, CollectionID, RefreshType | format-list  -GroupBy refreshtype

Der Refreshtype gibt dabei den jeweiligen Zustand an:

  • 6 = Incremental and Periodic Updates
  • 4 = Incremental Updates only
  • 2 = Periodic Updates only
  • 1 = Manual Update only

Über ein einfaches Count kann dann auch noch die Anzahl der Sammlungen gezählt werden. Microsoft empfiehlt allerdings nicht mehr als 200 Sammlungen in einer Hierarchy zu verwenden, bei denen das inkrementelle Update aktiviert ist (siehe: Best Practices for Collections in Configuration Manager).

Powershell: Download TechEd North America 2014 Sessions

Veröffentlicht am 14.05.2014 um 12:32 Uhr von

Derzeit findet die TechEd North America 2014 in Housten statt. Wie immer kann man sich alle Vorträge auf Channel 9 anschauen.

TechEd2014_KeynoteFür den Download der Videos eignet sich folgendes Skript, das größtenteils von Jon Galloway zur Verfügung gestellt wurde. Ich habe lediglich die Adressen für die TechEd North America 2014 angepasst sowie die Funktionalität ergänzt, dass das Skript auch hinter einem Proxy-Server funktioniert, der eine Authentifizierung verlangt.

Download: Ch9techedna2014Downloader.ps1

# Powershell: Download TechEd North America 2014 Sessions
# --- settings ---
$feedUrl = "http://s.ch9.ms/Events/TechEd/NorthAmerica/2014/RSS/"
$mediaType = "mp4high"
$overwrite = $false
$destinationDirectory = join-path ([Environment]::GetFolderPath("MyDocuments")) "TechEd2014"
 
# --- locals ---
$webClient = New-Object System.Net.WebClient
$webClient.Proxy = [System.Net.WebRequest]::DefaultWebProxy
$webClient.Proxy.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials
 
# --- functions ---
function PromptForInput ($prompt, $default) {
$selection = read-host "$prompt`r`n(default: $default)"
if ($selection) {$selection} else {$default}
}
 
function DownloadEntries {
param ([string]$feedUrl)
$feed = [xml]$webClient.DownloadString($feedUrl)
$progress = 0
$pagepercent = 0
$entries = $feed.rss.channel.item.Length
$invalidChars = [System.IO.Path]::GetInvalidFileNameChars()
$feed.rss.channel.item | foreach {
$url = New-Object System.Uri($_.enclosure.url)
$name = $_.title
$extension = [System.IO.Path]::GetExtension($url.Segments[-1])
$fileName = $name + $extension
 
$invalidchars | foreach { $filename = $filename.Replace($_, ' ') }
$saveFileName = join-path $destinationDirectory $fileName
$tempFilename = $saveFilename + ".tmp"
$filename
if ((-not $overwrite) -and (Test-Path -path $saveFileName))
{
write-progress -activity "$fileName already downloaded" -status "$pagepercent% ($progress / $entries) complete" -percentcomplete $pagepercent
}
else
{
write-progress -activity "Downloading $fileName" -status "$pagepercent% ($progress / $entries) complete" -percentcomplete $pagepercent
$webClient.DownloadFile($url, $tempFilename)
rename-item $tempFilename $saveFileName
}
$pagepercent = [Math]::floor((++$progress)/$entries*100)
}
}
# --- do the actual work ---
[string]$feedUrl = PromptForInput "Enter feed URL" $feedUrl
[string]$mediaType = PromptForInput "Enter media type`r`n(options:Wmv,WmvHigh,mp4,mp4high,zune,mp3)" $mediaType
$feedUrl += $mediaType
 
[string]$destinationDirectory = PromptForInput "Enter destination directory" $destinationDirectory
# if dest dir doesn't exist, create it
if (!(Test-Path -path $destinationDirectory)) { New-Item $destinationDirectory -type directory }
DownloadEntries $feedUrl

Anleitung: Java mit Powershell installieren, deinstallieren und konfigurieren

Veröffentlicht am 13.03.2014 um 11:37 Uhr von

Ich muss zugeben, dass ich in der kein großer Freund von Java bin. Trotzdem ist Java auf der Mehrzahl aller PCs installiert und sollte aus Sicherheitsgründen zwingend in der neuesten Version betrieben werden. Ein einfaches Update auf eine neuere Version reicht jedoch nicht aus. Ältere Versionen sollten im Vorfeld rückstandslos vom System entfernt werden.

Für die rückstandlose Deinstallation von Java habe ich ein Powershell-Skript geschrieben, das alle bestehenden Java-Installationen ermittelt und im Anschluss deinstalliert. Das Skript überprüft dabei die momentan installierten Versionen über die Registry und führt die jeweils hinterlegten UninstallStrings in abgeänderter Form aus. Im Anschluss werden die Registry und das Dateisystem durch das gezielte Löschen von Überresten befreit. Dabei spielt es keine Rolle, um welche Java-Version es sich handelt. Folgende Verzeichnisse werden gelöscht:

  • %ProgramFiles(x86)%\Java
  • %ProgramFiles%\Java\
  • %windir%\sun\java
  • %userprofile%AppData\LocalLow\Sun\Java

Optionale Neuinstallation: Liegt eine aktuelle Java-Version als MSI-Datei im gleichen Ordner wie das Powershell-Skript, dann wird diese im Anschluss automatisch installiert. Dabei werden folgende Konfigurationsparameter mitgegeben.

deployment.javaws.autodownload=NEVER
deployment.javaws.autodownload.locked
deployment.expiration.check.enabled=FALSE
deployment.security.level=MEDIUM
deployment.security.level.locked

Durch die Konfigurationsparameter werden die Java-Sicherheitsebene auf Medium festgesetzt und die integrierte Updatefunktion deaktiviert. Letzteres macht insbesondere im Enterprise-Umfeld Sinn. Die jeweiligen Parameter beschreibt Oracle unter diesem Link recht umfangreich.

Anleitung am Beispiel Java SE Runtime Environment 7 Update 51

Schritt 1: Download Offline-Installer Java SE Runtime Environment 7 Update 51

Am Beispiel Java SE Runtime Environment 7 Update 51 muss im ersten Schritt der Offline-Installer heruntergeladen werden. Die Version nach Wahl kann über diesen Link heruntergeladen werden:

Schritt 2: Java SE Runtime Environment Update 51 Offline-Installer entpacken

Im Anschluss muss die MSI-Datei aus der heruntergeladen EXE-Datei exportiert werden. Dazu muss das Setup lediglich aufgerufen werden. Die Setup-Routine legt dann die MSI-Datei unter folgendem Pfad temporär ab.

C:\Users\%username%\AppData\LocalLow\Sun\Java\

java_msiDer Verzeichnisinhalt muss, sofern eine Java-Neuinstallation und -Konfiguration gewünscht ist, in das Powershell-Skript-Verzeichnis kopiert werden. Im Anschluss kann das Powershell-Skript einfach ausgeführt werden.

Schritt 3: Verteilung mit dem Configuration Manager (optional)

Das Skript kann natürlich auch als Package über den Configuration Manager ausgeführt werden. Am einfachsten ist es wohl, das Script mit folgender Befehlszeile auszuführen.

powershell.exe -ExecutionPolicy Bypass -file "clientmgmtde_reinstallljava.ps1"

uninstalljava.ps1 (Clientmgmt.de-Reinstall-Java-Script)

#####################################################################
### Uninstall all previous Java-Installations with Powershell
### powered by Andre Picker - www.clientmgmt.de
### http://twitter.com/clientmgmt
#####################################################################

#####################################################################
### Check which java versions are installed
#####################################################################

$javaVer = Get-ChildItem -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall, HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall -ErrorAction 0 |
Get-ItemProperty | Where-Object {$_.DisplayName -match "Java" -or $_.DisplayName -match "J2SE" } |
Select-Object -Property DisplayName, UninstallString

#####################################################################
### Silent uninstall of all previous Java-Installations
### Kill iexplore, firefox, java, jp2launcher, jawaw, jqs, jusched
#####################################################################

kill -processname iexplore, firefox, java, jp2launcher, jawaw, jqs, jusched -Force -ErrorAction SilentlyContinue

ForEach ($ver in $javaVer) {
If ($ver.UninstallString) {
	$uninst = $ver.UninstallString
	$startmsiguid = $uninst.IndexOf("{")
	$endmsiguid = $uninst.IndexOf("}") +1 - $startmsiguid
	$msiguid = $uninst.Substring($startmsiguid,$endmsiguid)
	cmd /c start /wait msiexec /x $msiguid /qn REBOOT=ReallySuppress
	}
}

#####################################################################
### Delete not required Java-Folders
### %ProgramFiles(x86)%\Java, %ProgramFiles%\Java\, %windir%\sun\java
#####################################################################

Remove-Item -Recurse -Force -ErrorAction 0 @(
${env:ProgramFiles(x86)} + '\java'
$env:ProgramFiles + '\java'
$env:windir + '\sun\java'
)

#####################################################################
### Delete not required Registry-Entries
### HKLM:\SOFTWARE\JavaSoft, HKLM:\SOFTWARE\Wow6432Node\JavaSoft
#####################################################################

Remove-Item -Recurse -Force -ErrorAction 0 @(
'HKLM:\SOFTWARE\Wow6432Node\JavaSoft'
'HKLM:\SOFTWARE\JavaSoft'
)

#####################################################################
### Delete UserProfile Java-Cache
### HKLM:\SOFTWARE\JavaSoft, HKLM:\SOFTWARE\Wow6432Node\JavaSoft
#####################################################################

$colProfiles = Get-ChildItem "C:\Users\" -Name -ErrorAction SilentlyContinue

$colProfiles | ForEach-Object {
Get-ChildItem C:\Users\$_\AppData\LocalLow\Sun\* -Recurse -force -ErrorAction SilentlyContinue | Remove-Item -Force -Recurse -ErrorAction SilentlyContinue
} 

#####################################################################
### Checking for successful uninstall and Modify exit code
#####################################################################

$check = Get-ChildItem -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall, HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall -ErrorAction 0 |
Get-ItemProperty | Where-Object {$_.DisplayName -match "Java" -or $_.DisplayName -match "J2SE" }

if ($check -eq $null) {
$exitcode = '0'
}
else {
$exitcode = '1'
}

#####################################################################
### Install Java SE Runtime Environment if .msi-File is available
### Select MSI-File from Scriptfolder
### Url: http://www.oracle.com/technetwork/java/javase/downloads/
#####################################################################

$filename = Get-ChildItem -Name -Filter *.msi

if ($filename -eq $null) {
exit $exitcode
}
else {
cmd /c start /wait msiexec /i $filename /qn REBOOT=ReallySuppress
}

#####################################################################
### Remove Startmenu-Shortcuts
#####################################################################

Remove-Item -Recurse -Force -ErrorAction 0  @(
$env:ALLUSERSPROFILE + '\Microsoft\Windows\Start Menu\Programs\Java'
)

#####################################################################
### Configure Java SE Runtime Environment
### http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/jcp/properties.html
### deployment.javaws.autodownload=NEVER
### deployment.javaws.autodownload.locked
### deployment.expiration.check.enabled=FALSE
### deployment.security.level=MEDIUM
### deployment.security.level.locked
#####################################################################

New-Item -ItemType directory  -Path $env:windir\Sun\Java\Deployment\ -Force -ErrorAction 0
Copy-Item -Path .\deployment.config -Destination $env:windir\Sun\Java\Deployment\ -Force -ErrorAction 0
Copy-Item -Path .\deployment.properties -Destination $env:windir\Sun\Java\Deployment\ -Force -ErrorAction 0

exit $exitcode