Skype for Business 2016 kann Adressbuch nicht synchronisieren

Irgendwie scheint Skype for Business 2016 Probleme damit zu haben das Adressbuch vom Lync/SfB Server zu holen – wobei es wenn man den diversen Forenposts Glauben schenkt ziemlich egal ist was so am Server läuft (2013 oder 2015); im Client erscheint immer rechts unten das beliebte Rufezeichen mit der Meldung dass dass Adressbuch nicht synchronsiert werden kann.

Irgendein Post hat mich dann zu Schertz geführt, schnell die einzige Client Policy mit Get-CsClientPolicy|Set-CsClientPolicy -AddressBookAvailability WebSearchOnly von Download auf Onlinesuche umgestellt, SfB 2016 Client restarted (ggf. vorher alte GAL*.* Files unter %USERPROFILE%\AppData\Local\Microsoft\Office\[Version]\Lync\sip_[SIP-Name] vorher entsorgen) und schon pfeifts wieder mit der Kontaktsuche….

Visual Studio für Offline Installation saugen

Die Visual Studio 2015 Downloads (Community/Express zumindestens, die “richtigen” Versionen bekommt man eh z.B. in MSDN Subscriber Downloads oder VLSC als ISO) sind ja nur ein kleines 2 oder 3 MB Installer EXE welches dann alles frisch saugt – das alles ist halt u.U. recht viel und wenn man grad nicht mit Bandbreite ohne Ende gesegnet ist, überhaupt kein Internet hat oder einfach nicht will kann man das gesamte Paket schon vorab holen und dann offline installieren: Einfach das Mini Installer EXE mit Parameter /layout starten und das große Saugen (ohne Installen) beginnt….

SCCM Client liefert SCEP Definitionsstatus nicht beim SCCM Server ab

SCEP Report “Gesamtstatus und Verlauf der Antischadsoftware” liefert unter anderem den Definitionsstatus der Clients, also wie alt die Definitionen dort so sind:
SCEP

Die wo gar keine Definitionen gefunden werden entstehen unter Umständen durch einen WMI Defekt wie ich gestern mühsam feststellen musste: Die Klasse ROOT\Microsoft\SecurityClient\AntiMalwareHealthStatus sollte eigentlich vom SCEP Client befüllt, vom SCCM Client (Logfile: ExternalEventAgent.log, da sieht man auch recht gut die Daten, bzw. auch nicht 🙂 ) abgeholt und via “normalem” State Messaging an den SCCM Server geschickt werden. Im gegenständlichen Fall war aber bis auf die Version in der Klasse nix befüllt (von Defaultwerten mal abgesehen) – SCEP neu installieren hat auch nix geholfen. Erst die Neuregistrierung der Klasse (und damit des Providers) mit MOFCOMP "C:\Program Files\Microsoft Security Client\AmStatusInstall.mof" hat das Problem gelöst (SCCM typisch natürlich nicht sofort aber SCCM untypisch schneller als ein Tag – alle 5 Minuten werden die Daten aktualisiert).

Apple Magic

Wir haben es alle immer vermutet, befürchtet oder gehofft – hier stehts schwarz auf weiß (aus dem Service Log des Apple MDM aka Profile Manager):

AppleMagic

August CU oder KB3085501 bricht SharePoint 2013 Uploads

Entweder der August CU oder der September Security Update KB3085501 (oder auch beide) brechen die Uploadmöglichkeit von Attachments bei Listenelementen mit dem Hinweis dass der Dateiname ungültige Zeichen enthält (siehe auch hier, Fehler: Dateinamen dürfen folgenden Zeichen nicht enthalten: & “ ? < > # { } % ~ / \).

Bis MS das Problem fixed kann man in der Datei C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\TEMPLATE\LAYOUTS\FORM.JS in der Funktion OkAttach() den Aufruf von c=TrimWhiteSpaces(b.value) auf c=TrimWhiteSpaces(b.value).split('\\').pop() ändern – damit funktionierts in allen Browsern. Mit dem nächsten CU oder Fix sollte die Datei dann (hoffentlich) mit einer korrigierten Version überschrieben werden.

 

 

Hochverfügbarkeits-VMM mit AlwaysOn

Nachdem ich gerade beim Setup (Move standalone auf clustered) in alle Fallen gelaufen bin die sich dabei bieten hier eine kleine Aufstellung der notwendingen Schritte:

  • Prerequisite: Cluster (nix shared), nanonaned – und das is der einfache Teil 😀
  • Prerequisite: Windows ADK 8.1 (Deployment Tools & PE)
  • Prerequisite: SQL 2012 Native Client (aus Feature Pack)
  • Prerequisite: SQL 2012 Command Line Tools (aus Feature Pack)
  • Dann wollte er natürlich einen Reboot 😐
  • Dann bin ich gleich mal auf der DB Seite im Setup Wizard eingefahren (cannot verify account oder so) – der Service Account den man angibt muss auf allen (dritter Start :-D) Clusternodes Admin sein.
  • Den vierten Versuch hab ich gebraucht für die Erkenntnis dass fürs Setup die DB noch nicht in einer AlwaysOn Availability Group sein darf – als Fehler kommt irgendwas mit kann nicht auf DB zugreifen, im Log (C:\ProgramData\VMMLogs\SetupWizard.log) steht dann die InnerException mit der tatsächlichen Ursache.
  • Der fünfte Versuch ging dafür drauf dass der Service Account zumindestens die SQL Server Rollen “dbcreator”, “processadmin” und “securityadmin” benötigt (db_owner auf DB ist eh klar) – als Fehler kommt hier irgendwas mit man solle doch MSSQL$ starten (das Service)….wiederum hilft das VMMLog weiter.
  • Dann sind die Setups zumindestens durchgelaufen, da der SPN von der alten Installation noch vorhanden war ist er beim Erzeugen gleich mal drüber gestolpert und hat mich mit Infos was ich denn alles jetzt manuell machen muss (setspn -S und C:\Program Files\Microsoft System Center 2012 R2\Virtual Machine Manager\setup\ConfigureSCPTool.exe -install) eingedeckt.
  • Clusterresource startet trotzdem nicht – im EventLog (System) findet sich der obligatorische Eintrag dass das Clusterkonto das Rechnerkonto mangels Rechten nicht erzeugen kann – also “leer” angelegt und Clusterkonto berechtigt und siehe da – ES TUT 😀

VMM Fuckup #27428998: Boot Order

 

 

Wollte grad Windows Server 2016 TP3 in einer bestehenden Gen2 VM installieren, brav über VMM – natürlich hat die Gurke immer in das schon installierte OS gebootet (TP2). Also geht der brave User in VMM Konsole und will Bootreihenfolge auf gemountetes ISO umstellen. Was findet er im Firmware Punkt vor? Richtig. Nix:

Firmware_Gen2

Doch da war doch was, schnell auf einer Gen1 VM nachgesehen, richtig:

Firmware_Gen1

 

Schnell $Suchmaschine befragt und was kommt raus? Ja das geht mit VMM nicht, nur mit PowerShell – und da auch nur das erste Boot-Device (!!!) mit Set-SCVirtualMachine -FirstBootDevice und da muss man auch noch die Notation lernen (Beispiel: “SCSI,0,1” für DVD) –  oder mit Hyper-V Manager (ja, echt). Und das mit SCVMM UR6. 2015. Wo Gen2 VMs seit Jahren verfügbar sind. Unpackbar. *dauerheaddesk*

Referenz: http://blogs.technet.com/b/scvmm/archive/2014/03/05/details-on-generation-2-virtual-machines-and-using-them-in-vmm-2012-r2.aspx   (ja 2014….)

P.S.: EFI-Standardbootdevice ist “File,bootmgfw.efi”, ganz klar oder? *weiterheaddesk*

VMM und die Netzwerke

Wer so wie ich zwei Typen von Hyper-V Hosts hat (einerseits Clusterknoten mit converged 10G Team (=tagged VLANs) und andererseits Terminalserverhosts mit 4x1G (untagged, je ein Team für Management und VM-Traffic)) hat mit VMM in der aktuellen Reinkarnation verloren – man kann tagged und untagged VLANs nur extrem schwer mit Logical Networks abbilden – es bleibt die Auswahl zwischen Pech (2 Logical Networks mit je einer Network Site) und Schwefel (1 Logical Network mit 2 Network Sites). Beides führt in weiterer Folge nicht nur zu Problemen bei den IP-Pools (sofern man automatisch Adressen vergibt) und VM-Networks (doppelte Anzahl) und im Endeffekt ist das alles nicht mehr wirklich benutzbar (wenn auch lt. MS supported so betreibbar).

Bleibt nur auf den Terminalserver Hosts Trunks mit einem VLAN zu bauen….

Statische DNS A-Records mit IPAM synchronisieren

IPAM in Windows Server 2012 R2 synced ja nur DHCP Scopes und dort die Reservierungen, wer sein IP Adressmanagement bisher quasi mit der DNS Konsole gemacht hat (=statische A Records) muss seine Daten irgendwie in IPAM bekommen und (sofern IPAM nicht die alleinige Quelle der Wahrheit wird was vermutlich so lange es DNS Konsole gibt niemals passieren wird) aktuell halten – MS bietet da aus mir unerfindlichen Gründen nichts an, für DHCP Leases (die mich wiederum nicht wirklich interessieren da ja sowieso dynamisch) gibt’s in irgendeiner Gallery Scripts für 2012 und 2012 R2 aber nix für DNS – also hab ich selbst was gebastelt (Vorsicht bei den Reverse Lookup Zonen gehe ich davon aus dass die Adressen nur aus dem 10.* Raum kommen und für jedes Class B Netz eine Reverse Lookup Zone existiert!):

$DNSServer="mydnsserver"

$Zones = Get-DnsServerZone -ComputerName $DNSServer | Where {$_.ZoneType -eq "Primary" -and $_.IsReverseLookupZone -eq $false}
ForEach ($Zone in $Zones)
{
   Write-Host $Zone.ZoneName

   # get records from DNS for current zone
   $DNSIP = get-dnsserverresourcerecord -ComputerName $DNSServer -ZoneName $Zone.ZoneName | WHERE {$_.RecordType -eq "A" -and $_.HostName -notmatch "@|\._" -and $_.Timestamp -eq $null} 
   $DNSIPs = $DNSIP|select-object -expandproperty RecordData|select-object -expandproperty IPv4Address|select-object -expandproperty IPAddressToString|sort-object

   # get addresses for this zone from IPAM and crosscheck with DNS records
   $IPAMIPs = get-ipamaddress -managedbyservice IPAM -serviceinstance localhost -addressfamily ipv4 | ? { $_.ForwardLookupZone -eq $Zone.ZoneName -and $_.ForwardLookupPrimaryServer -eq $DNSServer }
   $IPAMIPs=$IPAMIPs|select-object -expandproperty IPAddress|select-object -expandproperty IPAddressToString|sort-object
   $IPAMRemove=@()
   $IPAMIPs|% { if ($DNSIPs -notcontains $_) { $IPAMRemove = $IPAMRemove + $_ } }
   foreach ($IP in $IPAMRemove)
   {
      $IPAMIP = Get-IpamAddress -ManagedByService IPAM -ServiceInstance localhost -IpAddress $IP
      Write-Host "   $($IPAMIP.DeviceName)/$($IPAMIP.Address) removed from DNS, deleting in IPAM too"
      Remove-IpamAddress -ManagedByService IPAM -ServiceInstance localhost -IpAddress $IP -Force -ErrorAction SilentlyContinue
      if ($error.Count > 0)
      {
         Write-Host "      ==> ERROR ($($error[0].Exception.Message))"
      }
      else
      {
         Write-Host "      ==> SUCCESS"
      }
   }

   if ($DNSIP -eq $null -or $DNSIP.Count -eq 0)
   {
       Write-Host "   nothing to import"
   }
   else
   {
       Write-Host "   importing $($DNSIP.Count) records"
       $DNSIP = $DNSIP | Select-Object @{Name="IPAddress";Expression={$_.RecordData.IPv4Address}}, 
                                       @{Name="DeviceName";Expression={$_.HostName}}, 
                                       @{Name="ForwardLookupZone";Expression={$Zone.ZoneName}}, 
                                       @{Name="ForwardLookupPrimaryServer";Expression={ $DNSServer}},
                                       @{Name="ReverseLookupZone";Expression={if ($_.RecordData.IPv4Address.IPAddressToString.StartsWith("10.")) 
                                                                              {
                                                                                 $_.RecordData.IPv4Address.IPAddressToString.Split('.')[1]+"."+$_.RecordData.IPv4Address.IPAddressToString.Split('.')[0]+".in-addr.arpa"
                                                                              }
                                                                              else
                                                                              {
                                                                                 ""
                                                                              }
                                                                             }}, 
                                       @{Name="ReverseLookupPrimaryServer";Expression={ if ($_.RecordData.IPv4Address.IPAddressToString.StartsWith("10.")) { $DNSServer } else { "" }}}
       $DataFile="$([Environment]::ExpandEnvironmentVariables('%TEMP%'))\DNS_$($Zone.ZoneName).csv"
       $DNSIP |  Export-Csv -Path $DataFile -force -NoTypeInformation
       $ImportStatus = Import-IPAMAddress -Path $DataFile -AddressFamily IPv4 -force -ErrorAction SilentlyContinue
       if ($error.Count > 0)
       {
          Write-Host "      ==> ERROR ($($error[0].Exception.Message))"
       }
      else
      {
         Write-Host "      ==> SUCCESS ($($ImportStatus))"
      }
   }
}