ConfigMgr: TortoiseSVN 1.9.4 verteilen

Hier das minimalistische Script für TortoiseSVN 1.9.4:

<appdefinition>
<file>TortoiseSVN-1.9.4.27285-x64-svn-1.9.4.msi</file>
<hash type="SHA256">7CAD40E63FF5400483F853642477AD17C88177A530C053EA307243E17C6192DC</hash>
<info>
<setupType>MSI</setupType>
<isX86>false</isX86>
</info>
<install/>
<uninstall/>
<detection/>
<dependency/>
<supersedence>
<deploymentType uninstall="false" type="SHA256">0D3894C8B0E6F116C34408E87C645757E9B568ABCCE3C9FCEA42076FA7A01293</deploymentType><!--TortoiseSVN-1.8.11.26392-x64-svn-1.8.13.msi-->
<deploymentType uninstall="false" type="SHA256">5059209B24972D978E80AFCAC1721AAFB560C42C59ED193689EEE23563D23850</deploymentType><!--TortoiseSVN-1.9.3-->
</supersedence>
</appdefinition>
Posted in automateAppDeployment, Configuration Manager, Deutsch, System Center, System Center 2012, Tools | Tagged , | Leave a comment

ConfigMgr: Firefox ESR 45.2.0 verteilen

Firefox ESR gibt es aktuell in der Version 45.2.0. Für das Update (inkl. Supersedence) habe ich unten das passende Script angehängt.
Download unter: https://www.mozilla.org/en-US/firefox/organizations/all/

<appdefinition>
<file>Firefox Setup 45.2.0esr.exe</file>
<hash type="SHA256">CA99927AA526C7C002C137337BFA0A1CB2C9118F8C7568F1F3B5C6DCDBAEEE08</hash>
<info>
	<company>Mozilla Corporation</company>
	<productName>Mozilla Firefox</productName>
	<productversion>45.2.0</productversion>
	<setupType>NSIS</setupType>
	<isX86>true</isX86>
	<hasUninstall>true</hasUninstall>
</info>
<install>
$inf=Join-Path $env:temp firefox.ini
$content="[Install]
QuickLaunchShortcut=false
DesktopShortcut=false
MaintenanceService=false" -replace "`n", "`r`n"
Out-File -FilePath $inf -Force -InputObject $content -Encoding ascii
Show-InstallationProgress -StatusMessage "Installing $appName $appVersion. This may take some time. Please wait..."
Execute-Process -Path "Firefox Setup 45.2.0esr.exe" -Parameters "/INI=`"$inf`"" -WindowStyle Hidden
</install>
<uninstall>
if ([IntPtr]::Size -eq 8) {$regPath="HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*"} else { $regPath="HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*"}
$item=Get-ItemProperty $regPath | where {$_.DisplayName -like "*Mozilla Firefox*" -and $_.DisplayVersion -eq "45.2.0"}
Execute-Process -Path ($item.UninstallString -replace "`"", "") -Parameters "/S"
</uninstall>
<detection/>
<dependency/>
<supersedence>
<deploymentType uninstall="false" type="SHA256">8CA1EC61B9DF30DDCEF3E7CE5234C2BEF6EC7C9C3A4B51F57C67FC9E8822E7FB</deploymentType><!--38.2.0-->
<deploymentType uninstall="false" type="SHA256">40DC3DF8C548819733386B70791DB753793E98C5F08283001D851A204376F017</deploymentType><!--38.2.1-->
<deploymentType uninstall="false" type="SHA256">FDC5BAA6033918E7FE8018DE130F16A23896B623B0B4F60A8EA578759C2DD29C</deploymentType><!--38.6.0-->
<deploymentType uninstall="false" type="SHA256">771A00786C69F7290A25C495A03622B4616C21D6A062BC712F55E0AE0282C219</deploymentType><!--38.6.1-->
<deploymentType uninstall="false" type="SHA256">85B1438D427FB6C9A52415BF46239AD491FD30EA410698ECDE256D0BC9AE7DB4</deploymentType><!--45.0.0-->
<deploymentType uninstall="false" type="SHA256">4477B833266C0ED9306AFC8347A547C1D27AB854C0438BC353A943C00774CAFD</deploymentType><!--45.0.1-->
</supersedence>
</appdefinition>
Posted in automateAppDeployment, Configuration Manager, Deutsch, Powershell, System Center, System Center 2012 | Tagged , , , | Leave a comment

Mögliche Probleme mit MS16-072

Kurze Warnung: Das aktuelle Security Update MS16-072 kann dazu führen, dass Benutzer-GPOs nicht mehr angewendet werden, wenn die Authentificated User die GPO nicht mehr lesen können, da die Gruppenrichtlinien nicht mehr im Benutzer sondern im Computerkontext gelesen werden und somit bei einer Lese-Einschränkung auf eine Benutzergruppe das Computerobjekt keine Rechte hat.

Ich habe es bei meinen eingeschränkten GPOs immer versucht zu vermeiden (es reicht den authent. Users das Apply Recht zu nehmen), aber ich weiss, dass einige Firmen diese “falsche” Einstellung so umgesetzt haben. Daher diese kurze Warnung von mir

Hier noch ein Blog Post mit Details:

http://www.grouppolicy.biz/2016/06/caution-ms16-072-may-break-group-policies/

Posted in Windows | Tagged , , | Leave a comment

Windows Server 2016 TP5 verfügbar!

Seit einigen Stunden ist die neue Beta-Version zu TP5 verfügbar.

Daher ein paar Links dazu:

Download u.a. über folgende Landing Page:

Windows Server 2016 Product Page (oder MSDN…)

https://www.microsoft.com/en-us/server-cloud/products/windows-server-2016/

Und neue Videos auf Channel9 zu den neuen TP5 Funktionen:

https://channel9.msdn.com/Blogs/windowsserver

Und noch ein kostenloses E-Book (auf den ersten Blick sehe ich aber noch keine Referenzen auf TP5):

https://blogs.msdn.microsoft.com/microsoft_press/2016/04/20/free-ebook-introducing-windows-server-2016-technical-preview/

Posted in Hyper-V, Windows | Tagged | Leave a comment

Software Update Baselines

Automatic Deployment Rules (ADR) sind bei der Verteilung von Updates hilfreich, da sie automatisiert für jeden Monat (oder häufiger) neue Software Update Gruppen anlegen können, die nur die benötigten Updates beinhalten und somit die Gruppengrößen klein halten. Eine entsprechende Strategie habe ich bereits 2014 beschrieben. Kommt aber ein Client nach längerer Zeit wieder ans Netz, dann fehlen u.U. in den aktuellen Gruppen notwendige Updates, die erst bei der nächsten automatischen Regelabarbeitung wieder heruntergeladen werden müssen.

Auch im Bereich des OS Deployments können Updates fehlen. Ebenso ist ein Reporting mit vielen einzelnen Gruppen nur schwer zu realisieren.

Daher wird immer empfohlen zusätzlich Baselines zu pflegen, die alle in der Umgebung notwendigen Updates beinhalten.

Auch dafür kann man ADR nutzen:

  • eine Baseline pro Produkt (Windows 10, Office 2013, …)
  • Beinhaltet alle kritischen und Sicherheitsupdates inkl. Service Packs und Update Rollups
  • Beinhaltet nur nicht ersetzte Updates (superseded)
  • Keine Einschränkung auf “required”
  • Baseline füllt immer die gleiche Software Update Gruppe

Das Ziel der Baseline sollte eine leere Collection sein, da eine ADR immer erzwungen sein muss und die Deadline maximal zwölf Monate in der Zukunft liegen kann. Trotzdem kann man die Update Gruppe zusätzlich an ein OSD Collection oder andere Ziele mit individuellen Installationszeitpunkten verteilen.

Diese ADR erzeugt somit eine Gruppe mit allen für das Produkt relevanten Updates – unabhängig davon, ob sie gerade in der Umgebung benötigt werden.

Um die Einrichtung dieser ADRs zu vereinfachen, habe ich ein kleines Powershell Script geschrieben:

$siteServer='cm01' #name of the configuration manager server
$site='MBK' #site name
$DeploymentPackageName="Microsoft Updates" #name of the update package to store the updates
$products="Windows Server 2012 R2","Windows 10","Office 2013","Windows 7" #array of products to create baseline ADRs
$rootFolder='_Software Updates' #Name of the Folder to move the new collections for the baselines


$sourcePath='{1}\\{0}\ConfigMgr\Content\Updates' -f $siteServer,'Microsoft.PowerShell.Core\FileSystem::'
$DeploymentPackageLocation='{0}\{1}' -f $sourcePath,$deploymentpackagename
$namespace='root\SMS\Site_'+$site

function initialize{
  [CmdletBinding()]
  param(
    [Parameter(Mandatory=$true)]
    [string]$Site,
    [Parameter(Mandatory=$true)]
    [string]$Siteserver
  )
  #Load the ConfigurationManager Module
  
  #from http://www.dexterposh.com/2014/06/powershell-sccm-2012-getting-started.html
  if ((get-module ConfigurationManager) -eq $null) {
  try
  {
    $ConfigMgrModule = "$($env:SMS_ADMIN_UI_PATH | Split-Path -Parent)\ConfigurationManager.psd1"
    if (!(Test-Path -Path $ConfigMgrModule)) {
      throw 'Configuration Manager module not found in admin console path'
    }
    write-host 'Loading ConfigMgr Module from ' $ConfigMgrModule
    Import-Module "$ConfigMgrModule"
    #Get-Module
    $BeforeLocation = (Get-Location).Path
  } catch 
  {
    Write-Error $_.Exception.Message        
  }
  }
  $PSDefaultParameterValues =@{"Get-wmiobject:namespace"=("Root\SMS\site_"+$site);"Get-WMIObject:computername"=$siteServer}
  Set-Location $site":"
}


function create-DeploymentPackage{
  [CmdletBinding()]
  param(
    [Parameter(Mandatory=$true)]
    [string]$DeploymentPackageName,
    [Parameter(Mandatory=$true)]
    [string]$DeploymentPackageLocation
  )
  #existiert swupk schon?
  $rt=Get-CMSoftwareUpdateDeploymentPackage -Name $DeploymentPackageName
  if ($rt -eq $null) {
    #existiert zielpfad schon?
    if (-not (Test-Path $DeploymentPackageLocation)) {
        #anlegen
        write-host $DeploymentPackageLocation
        new-item -itemtype directory -path $DeploymentPackageLocation
    }
    #sudp anlegen
    New-CMSoftwareUpdateDeploymentPackage -Name $DeploymentPackageName -Path $DeploymentPackageLocation
    $rt=Get-CMSoftwareUpdateDeploymentPackage -Name $DeploymentPackageName
  }
  return $rt
}

function create-AutomaticDeploymentRule{
  [CmdletBinding()]
  param(
    [Parameter(Mandatory=$true)]
    $sudp,
    [Parameter(Mandatory=$true)]
    [string]$collectionName,
    [Parameter(Mandatory=$true)]
    [string]$ADPName,
    [Parameter(Mandatory=$true)]
    [string]$Product

  )

    $rt=get-CMSoftwareUpdateAutoDeploymentRule -Name $adpname

    if ($rt -eq $null) {
    $ADPHash = @{
        AddToExistingSoftwareUpdateGroup  = $true   #Indicates whether the rule adds to an existing update group. If this value is $True, each time the rule runs and finds new updates, it adds them to an existing update group.
        AllowRestart = $false
        AllowSoftwareInstallationOutsideMaintenanceWindow  =$false
        AllowUseMeteredNetwork = $false
        AvailableImmediately =$true
        #AvailableTime =12
        #AvailableTimeUnit = "Month"
        CollectionName = $collectionName
        DeadlineImmediately  =$false
        DeadlineTime =12
        DeadlineTimeUnit ="Month"
        DeploymentPackageName =$sudp.name
        DeployWithoutLicense =$false
        DownloadFromInternet =$true
        DownloadFromMicrosoftUpdate =$true
        EnabledAfterCreate =$true
        MicrosoftAsVendor=$true
        Name=$ADPName
        Product=$product
        RunType = "RunTheRuleAfterAnySoftwareUpdatePointSynchronization"
        Superseded=$false
        SuppressRestartServer=$true
        SuppressRestartWorkstation=$true
        UpdateClassification="Critical Updates","Security Updates","Service Packs","Update Rollups","Updates"
        UseBranchCache=$true
        UserNotification="DisplayAll" #"HideAll"

        }
        New-CMSoftwareUpdateAutoDeploymentRule @ADPHash
        $rt=get-CMSoftwareUpdateAutoDeploymentRule -Name $adpname
        }
        return $rt
}

function create-basecollection{
  [CmdletBinding()]
  param(
    [Parameter(Mandatory=$true)]
    [string]$rootfolder,
    [Parameter(Mandatory=$true)]
    [string]$collectionName,
    [Parameter(Mandatory=$true)]
    [string]$site
    )

  $folder=Get-CimInstance -ClassName SMS_ObjectContainerNode -Filter "ObjectType=5000 and ParentContainerNodeid=0 and Name='$rootFolder'" -Namespace $namespace
  if (-not $folder) {
    $rt=New-CimInstance -ClassName SMS_ObjectContainerNode -Property @{Name=$rootFolder;ObjectType=5000;ParentContainerNodeid=0;SourceSite=$site}   -Namespace $namespace
    $folder=Get-CimInstance -ClassName SMS_ObjectContainerNode -Filter "ObjectType=5000 and ParentContainerNodeid=0 and Name='$rootFolder'" -Namespace $namespace
  }

  $collection=Get-CMDeviceCollection -Name $collectionName
  if (-not $collection) {
    $collection=New-CMDeviceCollection -Name $collectionName -Comment ('Software Update Baseline Target') -LimitingCollectionName 'All Systems'
  }
  Move-CMObject -FolderPath ($site+':\DeviceCollection\'+$rootFolder) -InputObject $collection
  return $collection
}

function main {
    initialize -site $site -siteserver $siteserver
    $sudp=create-deploymentpackage -DeploymentPackageName $DeploymentPackageName -DeploymentPackageLocation $DeploymentPackageLocation
    
    $products | ForEach-Object {
        $product=$_
        $pname='Microsoft {0} Baseline' -f $product
        $col=create-basecollection -rootfolder $rootFolder -site $site -collectionName $pname 
        $adp=create-AutomaticDeploymentRule -sudp $sudp -collectionName $col.name -ADPName $pname -Product $product
    }
}

main
Posted in Configuration Manager, Deutsch, System Center, System Center 2012 | Tagged , , , , , , | Leave a comment