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! 🙂

VMM Fehler bei Erstellung File Share (New-SCStorageFileShare)

Weil mir das jetzt gefühlte 10 Stunden gekostet hat muss ich das für mich und die Nachwelt festhalten.

Wollte über VMM Console auf einem File Server (Windows) ein Share erzeugen – Wizard durchgeklickt, dieses Command kommt am Ende raus

New-SCStorageFileShare -StorageFileServer (Get-SCStorageFileServer -Name Server.mein.at) -Name "Share`$" -Description "Some share" -LocalPath "X:\Pfad" -StorageClassification (Get-SCStorageClassification -Name "whatever")

Abgesetzt hat das immer folgende dezente Meldung geworfen:


New-SCStorageFileShare : VMM does not have appropriate permissions to access the resource C:\Windows\system32\qmgr.dll on the Server.mein.at server. (Error ID: 2910, Detailed Error: Access is denied (0x80070005))

Irgendwann wars mir dann zu blöd und ich hab Tracing gemäß 2913445 angeworfen und folgende Perle gefunden:


[Microsoft-VirtualMachineManager-Debug]19,2,NewStorageFileShareSubtask.cs,207,Found WindowsNonClustered FileServer Server.mein.at,{00000000-0000-0000-0000-000000000000}
[Microsoft-VirtualMachineManager-Debug]9,2,SmbOperationsHelper.cs,818,InvokePowerShellCommand: Connecting to Server.mein.at with Mein\User,{00000000-0000-0000-0000-000000000000}
[Microsoft-VirtualMachineManager-Debug]9,2,SmbOperationsHelper.cs,832,Errors while invoking PS command New-Item -Path "X:\Pfad" -ItemType directory,{00000000-0000-0000-0000-000000000000}
[Microsoft-VirtualMachineManager-Debug]9,1,SmbOperationsHelper.cs,837,Following exception while invoking PS command.,{00000000-0000-0000-0000-000000000000}
[Microsoft-VirtualMachineManager-Debug]9,1,SmbOperationsHelper.cs,837,System.Management.Automation.RemoteException: An item with the specified name X:\Pfad already exists.,{00000000-0000-0000-0000-000000000000}

D.h. das Teil versucht das Directory anzulegen (von mir aus), scheitert aber weils (in meinem Fall) schon vorhanden war und läuft in weiterer Folge komplett Amok und liefert den vollkommenen Schwachfug zurück an den aufrufenden, dann ratlosen, User….

Lync 2013 – Cumulative Update – CERT_E_UNTRUSTEDROOT

Lync 2013, Cumulative Update 7 – nach Reboot noch alles klar, nach einem späteren Frontend Servicerestart plötzlich Event ID 12303/LS Server (The protocol stack reported a critical error: code 800B0109 (CERT_E_UNTRUSTEDROOT). The service has to stop.) und 14649/LS Protocol Stack

A serious problem related to certificates is preventing Lync Server from functioning.

Unable to use the default outgoing certificate.
Error 0x800B0109(CERT_E_UNTRUSTEDROOT).
The certificate may have been deleted or may be invalid, or permissions are not set correctly.
Ensure that a valid certificate is present in the local computer certificate store. Also ensure that the server has sufficient privileges to access the store.

Cause: The Lync Server failed to initialize with the configured certificate.
Resolution:
Review and correct the certificate configuration, then start the service again.

  • Certificates Snap In meint es ist alle da – Root Zert, Intermediate Zert, Zert an sich – alles in den korrekten Stores
  • certutil -verify -urlfetch liefert keinerlei Fehler, CRL Prüfung also auch ok
  • Rechte auf private Keys passen (NETWORK SERVICE)
  • Assign mit Lync Deployment hilft auch nicht

Erst nachdem ich alle Zertifikate außer dem Root CA Zert (das „eigentliche“ und alle Intermediates) neu importiert hatte ist das Gewerk plötzlich fehlerfrei los gelaufen….

App-V Totalreset/cleanup ohne Neuinstallation

App-V ist relative empfindlich was Dateisystem, ACLs und Registry angeht – es passiert leider viel zu oft dass gar nix mehr geht und die spannendsten Fehlermeldung und vor allem Codes (App-V hat ja seine eigenen Regeln (und ist sehr eigen dabei…)).

Folgende Vorgangsweise hat sich für einen Totalreset ohne Neuinstallation recht gut bewährt:

MACHINE

Get-appvclientpackage -all|remove-appvclientpackage
Stop-Service appvclient

handle | find "C:\ProgramData\App-V" => kill process
Gardelete /dir:c:\programdata\app-v /subdirectories

Registry:
HKLM\SOFTWARE\Microsoft\AppV\Client\Packages\*
HKLM\SOFTWARE\Microsoft\AppV\Client\Streaming\Packages\*
HKLM\SOFTWARE\Microsoft\AppV\Client\Virtualization\LocalVFSSecuredUsers\* (ohne S-1-5-18)
HKLM\SOFTWARE\Microsoft\AppV\MAV\Packages\*

Usercleanup (s.u.)

Start-Service appvclient

USER

gardelete /dir:c:\users\akhedvgar\appdata\roaming\microsoft\appv /subdirectories
gardelete /dir:c:\users\akhedvgar\appdata\local\microsoft\appv /subdirectories

HKCU\SOFTWARE\Microsoft\AppV (komplett)
HKCU\SOFTWARE\Classes\AppV (komplett)

Shortcuts löschen
	• %USERPROFILE%\Desktop
	• %USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu

.NET TcpClient() und DirectAccess

Die .NET Klasse TcpClient() kann scheinbar nur IPv4 oder IPv6 – nicht beides. Und wenn man nichts dazu sagt wird defaultmäßig IPv4 genommen. Sitzt man aber auf einem DirectAccess Client werden die Unternehmensresourcen auf IPv6 Adressen aufgelöst und das was im Unternehmen einwandfrei pfeift (weil IPv4) funktioniert von außen (DirectAccess) überhaupt nicht, TcpClient.Connect() wirft eine nette Exception:

System.Net.Sockets.SocketException (0x80004005): A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) no address was supplied

Der richtige Weg (zumindestens funktioniert er) ist sich je nach Sachlage anzupassen:

IPHostEntry oHost = null;
TcpClient oClient = null;
string sHost = "host.company.com";
int nPort = 4711;

oHost = Dns.GetHostEntry(sHost);
if (oHost == null || oHost.AddressList == null || oHost.AddressList.Length == 0)
      throw new Exception("DNS resolution for '" + sHost + "' failed");

oClient = new TcpClient(oHost.AddressList[0].AddressFamily);
oClient.Connect(oHost.AddressList[0], nPort);

Super Micro IPMI Zertifikat

Da Super Micro (oder wer für das IPMI auch immer verantwortlich ist) die übergebenen Files nicht wirklich prüft und dann einfach weder HTTP noch HTTPS hoch bekommt hier die 2 Befehle die man von einem PFX weg braucht um das Cert und das Private Key File zu bekommen:

openssl pkcs12 -in my.pfx -nokeys -out my_cert.pem
openssl pkcs12 -in my.pfx -nocerts -nodes -out my_key.pem

Wenn mans doch verkackt hat kann man mit IPMITOOL von jedem Linux weg die Config (seltsamerweise aber nicht die LAN-Config) auf Factory Settings zurück setzen:

ipmitool -H meinhost -U meinuser -P meinpasswort raw 0x3c 0x40