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))"
      }
   }
}

Offline Domain Join für DirectAccess

Auf einem Rechner im Unternehmensnetzwerk:
djoin /provision /Domain mydomain.com /machine mymachine /machineou "ou=myou,dc=mydomain,dc=com" /reuse /savefile c:\temp\mymachine.txt /policynames "DirectAccess Client Settings" /policypaths "\\mydomain.com\sysvol\mydomain.com\Policies\{policy-guid}\machine\Registry.pol" /certtemplate Machine /rootcacerts

mymachine.txt auf den Zielclient transportieren

Am Zielclient:
djoin /requestODJ /loadfile mymachine.txt /windowspath %SystemRoot% /localos

Hinweise:

  • User am Rechner im Unternehmensnetzwerk braucht natürlich das Recht für Domäne um Rechnerkonto zu erstellen und Zertifikat zu requesten.
  • Das /policypaths ist vermutlich nicht notwendig aber sicher ist sicher 🙂
  • Bei /certtemplate das Template angeben welches intern für Clients verwendet wird (der interne Name, nicht der Displayname des Templates, der ohne Blanks).
  • Beim Transport auf den Zielrechner aufpassen dass durch Mailsysteme oder ähnlichem nicht da Encoding des Files verändert wird – am einfachsten via ZIP transportieren.
  • User am Zielrechner muss natürlich lokaler Administrator sein.
  • Die Zeit sollte habwegs richtig bzw. ident mit der Zeit am DA Server sein (Kerberos).
  • Falls das Rechnerkonto schon existiert und reused wird muss es vorher resetiert (=Passwort gelöscht) warden.
  • DirectAccess funktioniert nicht instant, Reboot oder Netz disable/enable hilft.

VMM Fuckup #89027: Fileserver Shares

Wieder ein paar Stunden sinnlos verbraten und wieder im VMM Debuglog gelandet weil das Produkt sonst keine vernünftigen Logs hat.

Szenario: VM (DPM in dem Fall), liegt auf Cluster, soll externe Disken auf einem Fileserver bekommen.

Also Fileserver in VMM registrieren, Share im VMM erzeugen (managed), am Cluster registrieren und das erste Mal ärgern weil man offenbar im VMM keine VHDX auf einem UNC Pfad eintragen kann.

Also im Cluster Admin eintragen. Wieder ärgern weil die Share Permission die VMM anlegt für ihn reicht aber nicht für Cluster Admin weil da der eintragende User auch Rechte haben muss.

Schaut man nach einiger Zeit auf die VM steht da plötzlich “unsupported cluster configuration” und die VM ist nicht mehr konfigurierbar über VMM. Horray. Fehlermeldung: Die VM verwendet Disken auf Shares die im Cluster nicht registriert sind.

Nachgeschaut. Stimmt. Share ist weg. Komplett (Config, nicht am Fileserver).

Stundenlange Suche, im Debuglog findet sich bei einem Refresh des Fileservers folgende Information:


WindowsFileStorageService.cs,439,Found 9 MSFT_SmbShare!,{00000000-0000-0000-0000-000000000000}
WindowsFileStorageService.cs,461,Skipping share name: ADMIN$ (C:\Windows). We filter out IPC$, ADMIN$ and drive letter share like C$, D$.

WindowsFileStorageService.cs,461,Skipping share name: C$ (C:\). We filter out IPC$, ADMIN$ and drive letter share like C$, D$.

WindowsFileStorageService.cs,461,Skipping share name: DPM$ (X:\Hyper-V\DPM). We filter out IPC$, ADMIN$ and drive letter share like C$, D$.

WindowsFileStorageService.cs,461,Skipping share name: HVData$ (X:\Hyper-V\HVData). We filter out IPC$, ADMIN$ and drive letter share like C$, D$.
WindowsFileStorageService.cs,461,Skipping share name: IPC$ (). We filter out IPC$, ADMIN$ and drive letter share like C$, D$

WindowsFileStorageService.cs,461,Skipping share name: print$ (C:\Windows\system32\spool\drivers). We filter out IPC$, ADMIN$ and drive letter share like C$, D$.

WindowsFileStorageService.cs,461,Skipping share name: Test$ (X:\Hyper-V\Test). We filter out IPC$, ADMIN$ and drive letter share like C$, D$.

WindowsFileStorageService.cs,461,Skipping share name: X$ (X:\). We filter out IPC$, ADMIN$ and drive letter share like C$, D$.

WindowsFileStorageService.cs,461,Skipping share name: Y$ (Y:\). We filter out IPC$, ADMIN$ and drive letter share like C$, D$. 

Wir erkennen: VMM skipped (und löscht in weiterer Folge aus der VMM Config und damit von den Cluster wo das Share registriert war) nicht nur ADMIN$, IPC$ und Laufwerk$ sondern alles mit $ – dabei kann man in der VMM Console ganz locker und ohne jegliche Hinweise Shares mit $ erfolgreich anlagen!

Bravo! 🙂