Kategorien
CRM Windows

Dynamics CRM / 365 Performance-Messung (ab 2013 SP1)

Falls Sie Perfomance-Probleme mit Ihrer Dynamics CRM / 365-Instanz haben, können Sie mit den folgenden Schritten etwas mehr ins Detail gehen, um zu sehen, an welcher Stelle es tatsächlich hängt.

Rufen Sie als erstes bitte ein Formular auf, von dem Sie denken, dass es wirklich langsam lädt. In unserem Beispiel verwenden wir das Firmenformular:

Der nächste Schritt ist Browserabhängig:
Internet Explorer: Drücken Sie [Strg] + [Shift] + [Q] zum Aufruf des Performance Centers
Chrome: Drücken Sie [Strg] + [D] und drücken Sie dann auf [Mehr …]. Als URL geben Sie folgende Zeichenfolge ein (ohne Anführungszeichen): „javascript:Mscrm.Performance.PerformanceCenter.get_instance().TogglePerformanceResultsVisibility()“ und als Namen beispielsweise „Performance Center“. Dadurch haben Sie oben nun einen Knopf in der Lesezeichenleiste, den Sie nun drücken um das Performance Center aufzurufen.
Firefox: Drücken Sie [Strg] + [B] um die Lesezeichenleiste aufzurufen. Fügen Sie hier ein neues Lesezeichen mit der URL „javascript:Mscrm.Performance.PerformanceCenter.get_instance().TogglePerformanceResultsVisibility()“ (ohne Anführungszeichen) ein und benennen Sie es treffend. Klicken Sie dieses danach an, während Sie das betroffene Formular im aktiven Tab geöffnet haben.

In allen Fällen sollten Sie nun ein Performance Center sehen. Hier drücken Sie nun nacheinander [Enable] (1) und dann [Close] (2):

Lösen Sie nun einen Reload der Seite aus. Dies kann durch drücken von [F5] oder des „Aktualisieren“-Knopfes erfolgen.

Rufen Sie anschließend wieder das Performance Center auf. Sie sehen nun den Ablauf des Seitenaufbaus (3). Mit dem Knopf [Copy All] (4) können Sie nun die Wartezeiten auch nochmal als Text herauskopieren.

Sollten Sie für unser Hosted Dynamics 365 einen Performance-Auszug machen, so würden wir Sie zum einen um den Text bitten, den Sie über den [Copy All]-Knopf heraus bekommen und zum anderen könnten Sie uns noch einen Screenshot von der Balkendiagramm-Darstellung schicken.

Kategorien
Linux

Spickzettel: Netplan-Beispiel mit IPv4- und IPv6-Konfiguration

Dies ist ein Beispiel für einen Netplan mit IPv4- und IPv6-Konfiguration. Dabei wurden die IP-Adressen durch allgemein gültige ersetzt.

# Diese Datei beschreibt die verfügbaren Netzadapter in Ihrem System 
# Für mehr Informationen netplan(5) aufrufen. 

network: 
  version: 2 
  renderer: networkd 
  ethernets: 
    eth0: 
      # DHCP wird deaktiviert 
      dhcp4: no 
      dhcp6: no 
      # Konfiguration der Adressen, pro Adresse eine Zeile. 
      addresses: 
        - 192.168.1.123/24 
        - 123:4567:ab12:3:192:168:1:123/64 
      # Gateways (eventuell depreciated)
      gateway4: 192.168.1.1
      gateway6: 123:4567:ab12:3::1
      # Konfiguration der DNS-Server, auch hier mehrere Server respektive Zeilen möglich. 
      nameservers: 
        addresses: 
          - 192.168.1.1 
          - 192.168.1.2 
          - 123:4567:ab12:3:192:168:1:1 
          - 123:4567:ab12:3:192:168:1:2
      routes:
        # Ersetzt gateway4-Option
        - to: default
          via: 192.168.1.1
        # Ersetzt gateway6-Option
        - to: ::/0
          via: 123:4567:ab12:3::1
        # Sonstige Routen
        - to: 10.1.0.0/24
          via: 192.168.1.2

Angewendet wird der Netplan dann über folgenden Befehl:

sudo netplan apply

Kategorien
Linux

Neue Partition mittels LVM erstellen (nicht erweitern)

Zuerst lassen wir uns die verfügbaren Disks anzeigen, um herauszufinden, auf welcher Disk wir die neue Partition erstellen:

fdisk -l

In unserem Beispiel gehen wir nun von der 2. Disk aus, die über /dev/sdb adressiert wird. Auf dieser Disk erstellen wir nun als erstes ein sogenanntes Physical Volume. Dazu gehen wir zuerst in die LVM-Befehlszeile:

sudo lvm

Anschließend können wir das Physical Volume erstellen:

pvcreate /dev/sdb

Sie können an dieser Stelle auch mehrere Physical Volumes erstellen, die Sie dann im nächsten Schritt zusammenfassen. Wenn Sie mehrere Volumes anlegen wollen, können Sie diese entweder mittels Leerzeichen getrennt an obigen Befehl ranhängen, oder aber den Befehl für jedes Volume entsprechend ausführen.

Das Ergebnis können wir folgendermaßen anzeigen:

pvdisplay /dev/sdb

Nun können wir die zuvor angelegten Physical Volumes zu einer Volume Group zusammenfassen. Dazu geben wir zuerst den Namen an und anschließend die Physical Volumes – wieder durch Leerzeichen getrennt. In unserem Fall haben wir nur eines:

vgcreate sql-vg /dev/sdb

Das Resultat können wir über folgenden Befehl abrufen:

vgdisplay sql-vg

Innerhalb der Volume Group können wir nun endlich die Logical Volumes erstellen – Unsere nachher in Unix sichtbaren Partitionen. Dabei geben wir die Größe der Partition, den Namen und die Volume Group an:

lvcreate -L 199.996G -n sqldata sql-vg

Die Größe wurde übrigens genommen, weil ursprünglich 200G (volle Größe der Volume Group) geplant waren, das aber als „zu groß“ vom System abgelehnt wurde. Deswegen hab ich dann immer 1MB abgezogen und nochmal versucht. Bei 199.996G ging es dann und wurde auch aufgerundet vom System.

Das Resultat können wir wieder mit folgendem Befehl betrachten:

lvdisplay /dev/sql-vg/sqldata

Nun sind wir in der LVM-Befehlszeile fertig und können diese verlassen:

exit

Anschließend formatieren wir unsere neue logische Partition noch mittels folgendem Befehl (ext3):

mke2fs -j /dev/sql-vg/sqldata

Jetzt können wir die neue Partition noch mounten. In unserem Fall wollten wir die Partition direkt unter Root mounten. Dazu erstellen wir ein Verzeichnis am Zielort und mounten die Partition dann:

mkdir /sqldata
mount /dev/sql-vg/sqldata /sqldata

Damit wird die Partition nutzbar. In unserem Fall war es das Datenverzeichnis für unsere ersten Gehversuche mit MSSQL unter Linux.

Kategorien
Exchange Server Windows

Terminüberschneidungen in Ressourcen-Postfächern

Ressourcen-Postfächer kann man so konfigurieren, dass Sie Termine automatisch annehmen. Geschieht die Konfiguration über das ECP oder über den simplen

Get-CalendarProcessing [Identity] | Set-CalendarProcessing -AutomateProcessing AutoAccept

-Befehl, so klappt die automatische Annahme solange, bis ein Terminkonflikt entsteht. In einer Terminserie ist das dann besonders ärgerlich, da alle Serienelemente abgelehnt werden, sobald sich ein Element mit einem vorhanden Termin überschneidet. Dies kann man umgehen, in dem man weitere Parameter anpasst. Grundsätzlich zu klären wäre dabei folgende Frage: Sind Überschneidungen erlaubt?

Wenn Überschneidungen erlaubt sind, kann man die Einstellungen wie folgt überschreiben:

Get-CalendarProcessing [Identity] | Set-CalendarProcessing -AutomateProcessing AutoAccept -AllowConflicts $true

Damit werden die Termine einfach parallel zu eventuell bereits bestehenden Terminen eingetragen. Das macht dann Sinn, wenn ein Raum beispielsweise doppelt belegbar ist.

Wenn man Überschneidungen vermeiden will und stattdessen wünscht, dass sich überschneidende Termine einfach abgelehnt werden ohne die ganze Serie abzulehnen, so ist folgender Befehl zu verwenden:

Get-CalendarProcessing [Identity] | Set-CalendarProcessing -AutomateProcessing AutoAccept -AllowConflicts $false -ConflictPercentageAllowed 50 -MaximumConflictInstances 15

Der Parameter –ConflictPercentageAllowed gibt hierbei an, welcher Anteil an Serienelementen auf Grund von Überschneidungen abgelehnt werden darf (in Prozent, aber anzugeben ohne ‚%‘-Zeichen), während -MaximumConflictInstances angibt, wie viele Serienelemente wegen Überschneidungen abgelehnt werden dürfen. Beide Werte kann man dabei natürlich utopisch hochsetzen um zu garantieren, dass jede Serie angenommen wird. Dennoch sind sicher an der ein oder anderen Stelle sinnvoll gewählte Grenzwerte nützlich.

Achtung: Solange -AllowConflicts auf $true steht, haben die für –ConflictPercentageAllowed und -MaximumConflictInstances gesetzten Werte keinen Einfluss, sie werden ignoriert.

Kategorien
Linux

OneLiner: Dateien im Unix-Betriebssystem finden

Um das zu erreichen, können Sie folgenden Befehl eingeben:

find / -iname "file.example" 2>/dev/null

Erkärung:
Einsprungsort
Dateinamen
Unterdrückung von „Access denied“-Fehlern

Kategorien
Exchange Server Windows

Exchange-Server schließt IMAP- oder POP3-Verbindungen sofort wieder (Aktualisiert)

Szenario:
IMAP- oder POP3-Verbindungen mittels Email-Clients funktionieren einfach nicht mehr, die Verbindungen werden vom Server sofort wieder geschlossen. Bei der weiteren Recherche stellt sich raus, das man mittels Telnet auf dem Exchange-Server selbst unter Verwendung von 127.0.0.1 die Dienste noch abfragen kann. Führt man jedoch Telnet von einer anderen Maschine remote aus, so wird die Verbindung sofort wieder getrennt. Die jeweiligen Dienste sind jedoch auf dem Server aktiv.

Problem:
Wenn oben beschriebenes teilweise oder gar komplett auf Sie zutrifft, liegt es vermutlich daran, dass die Proxy-Komponente des jeweiligen Dienstes inaktiv ist. Prüfen können Sie das, indem Sie eine PowerShell-Eingabeaufforderung starten, und folgende Zeile eingeben:

Get-ServerComponentState -Identity [Servername]

Folgendes könnten Sie als Ausgabe zurückbekommen:

Server Component State
-------
[...]
[Servername] ImapProxy Inactive
[...]
[Servername] PopProxy Active
[...]

Die Ausgabe ist selbstverständlich nicht eingefärbt, dies dient nur der Veranschaulichung.

Behebung:
Sollte nun eine oder gar mehrere Komponenten als Inactive angezeigt werden, müssen wir selbige wieder aktivieren. Dies erfolgt durch folgenden PowerShell-Befehl:

Set-ServerComponentState -Identity [Servername] -Component [Komponente] -Requester HealthAPI -State Active

In unserem Beispiel würde der Befehl wie folgt aussehen:

Set-ServerComponentState -Identity SRV-EXCHANGE -Component ImapProxy -Requester HealthAPI -State Active

Damit sollten die Verbindungen wieder möglich sein. Eventuell müssen die jeweiligen Dienste noch neugestartet werden.

Ursache:
Auch nach weiterer Recherche konnte nicht herausgefunden werden, was den Server dazu trieb, die Komponente auf inaktiv zu setzen. Zwar sieht man im Eventlog, dass er es tat, aber keinen tieferen Grund. Sollte sich hier noch etwas ergeben, werde ich den Blogeintrag entsprechend erweitern.

Nachtrag:
Scheinbar führt irgendein Softwarefehler beim Exchange Server 2013 regelmäßig zum Absturz solcher Komponenten. Aus diesem Grund wurde ein Script angefertigt, das dieses Problem automatisiert behebt, falls es existent sein sollte. Dieses ist auch TaskScheduler-kompatibel, kann hier also ganz einfach eingesetzt und alle 5 Minuten gestartet werden:

#Ausführung des Remoting-Scripts, der Pfad muss bei anderen Server-Versionen abgeändert werden
. "C:\Program Files\Microsoft\Exchange Server\V15\bin\RemoteExchange.ps1" | Out-NULL
Connect-ExchangeServer -auto | Out-NULL

$LocalHost = $env:computername

Write-Host "Checking IMAP4: " -NoNewline
$ImapState = (Get-ServerComponentState -Identity $LocalHost -Component ImapProxy).State
if($ImapState -eq "Active")
{
   Write-Host "$ImapState" -ForegroundColor Green
}
else
{
   Write-Host "$ImapState" -ForegroundColor Red
   Write-Host "Enabling Component ImapProxy: " -NoNewline
   Set-ServerComponentState -Identity $LocalHost -Component ImapProxy -Requester HealthAPI -State Active
   Write-Host "done." -ForegroundColor Green
   Write-Host "Restarting IMAP4 Backend Service: " -NoNewline
   Restart-Service "MSExchangeIMAP4BE"
   Write-Host "done." -ForegroundColor Green
   Write-Host "Restarting IMAP4 Service: " -NoNewline
   Restart-Service "MSExchangeImap4"
   Write-Host "done." -ForegroundColor Green
}
Write-Host ""

Write-Host "Checking POP3: " -NoNewline
$PopState = (Get-ServerComponentState -Identity $LocalHost -Component PopProxy).State
if($PopState -eq "Active")
{
   Write-Host "$PopState" -ForegroundColor Green
}
else
{
   Write-Host "$PopState" -ForegroundColor Red
   Write-Host "Enabling Component PopProxy: " -NoNewline
   Set-ServerComponentState -Identity $LocalHost -Component PopProxy -Requester HealthAPI -State Active
   Write-Host "done." -ForegroundColor Green
   Write-Host "Restarting POP3 Backend Service: " -NoNewline
   Restart-Service "MSExchangePOP3BE"
   Write-Host "done." -ForegroundColor Green
   Write-Host "Restarting POP3 Service: " -NoNewline
   Restart-Service "MSExchangePop3"
   Write-Host "done." -ForegroundColor Green
}
Write-Host ""

Zur besseren Veranschaulichung der Ausgabe besitzt dieses Script einige Zeilen, die im Taskscheduler natürlich unnötig sind. Diese habe ich violett markiert.

Kategorien
Allgemein

AutoMapping bei Postfachvollzugriffen nachträglich entfernen

Wird über das ECP ein Postfachvollzugriff gewährt, so wird im Hintergrund automatisch der Parameter -AutoMapping auf $true gesetzt. Da dies immer wieder zu Problemen mit den Outlook-Clients führt, möchte man dieses Verhalten eventuell unterbinden.

Nun ist es so, dass man diesen Parameter nicht in bestehenden Regelsätzen verändern kann. Man kann ihn ohne weiteres nicht einmal anzeigen. Daher kann es bei etwas umfangreicheren Berechtigungen durchaus passieren, dass die Änderung mit hohem Aufwand verbunden ist, muss man doch jeden Regelsatz einmal löschen und neu anlegen.

Folgender Code-Schnipsel schafft hier Abhilfe (Erfordert die geladenen Exchange CmdLets):

$Mailbox = "[Name des Postfachs]"
$Permissions = Get-MailboxPermission $Mailbox | Where {$_.User -LIKE "[Optionaler Filter, ansonsten Where-Clause weglassen]"}
foreach ($Permission in $Permissions){
  $PerIdent = $Permission.User
  $PerAccessRights = $Permission.AccessRights
  Remove-MailboxPermission -Identity $Mailbox -User $PerIdent -AccessRights $PerAccessRights -InheritanceType All -Confirm:$false
  Add-MailboxPermission -Identity $Mailbox -User $PerIdent -AccessRights $PerAccessRights -InheritanceType All -AutoMapping $false
}

Dadurch ersetzen Sie die alten Regelsätze durch neue mit deaktiviertem -AutoMapping-Parameter

Kategorien
Allgemein

SharePoint Bibliothek – Passwortabfrage bei „Mit Explorer öffnen“

Wir hatten vor einiger Zeit das Problem, dass Anwender immer nochmals eine Passwortabfrage bekamen, wenn Sie eine Bibliothek aus der SharePoint-Weboberfläche heraus im Explorer öffnen wollten. Dies geschah, obwohl sich die SharePoint-Adresse in der Liste der „Vertrauenswürdigen Seiten“ befindet.

Der Grund für dieses Verhalten lässt sich bei dem Dienst „WebClient“ suchen. Dieser Dienst ist für den Aufruf der Bibliothek im Explorer zuständig und ignoriert die Vertrauenswürdigen Seiten, sobald sich in der SharePoint-URL ein Punkt befindet. Ist dies der Fall, so geht er automatisch von einer externen Seite aus.

Um dies zu umgehen, müssen wir einen Registry-Eintrag erstellen, der dem WebClient-Dienst vorschreibt, bei genannten Seiten die Authentifizierung durchzureichen:

  1. Rufen Sie den Registry-Editor auf ([Windows-Taste] + [R] → regedit → [OK])
  2. Navigieren Sie zu folgendem Pfad:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WebClient\Parameters
  3. Rechtsklicken Sie in den freien Bereich und wählen Sie Neu → Wert der mehrteiligen Zeichenfolge. Benennen Sie den Schlüssel wie folgt:
    AuthForwardServerList

    … und tragen Sie darin Ihre SharePoint-URL ein. Beispiel: „https://sharepoint.domain.tld“ (ohne Anführungszeichen).

  4. Starten Sie im letzten Schritt den WebClient-Dienst neu. (Start Windows-Verwaltungsprogramme → Dienste Rechtsklick auf WebClient → Neu starten)

Dies sollte helfen, um künftig ohne Passwortabfrage Ihre Bibliotheken im Explorer öffnen zu können.

Um eine solche Konfiguration für ein ganzes Unternehmen zu übernehmen, empfiehlt sich der Einsatz einer GPO, die den Registry-Eintrag setzt:

Kategorien
CRM Server Windows

Dynamics CRM / 365 – Migration (Aktualisierung) einer Instanz und mögliche Probleme

Möchte man eine Instanz in eine andere Infrastruktur migrieren (möglicherweise aufgrund einer Aktualisierung), sollten folgende Schritte beachtet werden.

  • Bevor die Instanz in der „alten Umgebung“ abgeschaltet wird, sollte der aktuelle Schlüssel für die Datenverschlüsselung kopiert werden. Diesen finden Sie ab Dynamics CRM 2011 unter Einstellungen > Datenverwaltung > Datenverschlüsselung > [X] Schlüssel anzeigen. Sie benötigen diesen nach der Migration, um die Datenverschlüsselung wieder zu aktivieren.
  • Stellen Sie zudem sicher, dass es einen CRM-User gibt, der alle der folgenden Eigenschaften besitzt.
    • Zugriffsmodus: Lesen-Schreiben (NICHT Administrator und erst recht nicht Lesezugriff)
    • Rolle: Mindestens Systemadministrator
  • Anschließend können Sie auf dem Anwendungsserver die Instanz deaktivieren und löschen. Hierbei wird die Datenbank nicht gelöscht.
  • Besagte Datenbank können Sie anschließend auf dem SQL-Server entweder im Rahmen eines Backups sichern, oder aber die Datenbank einfach aushängen.
  • In beiden Fällen können Sie die Datenbank entweder durch simples Wiedereinhängen oder durch das Wiederherstellen der Sicherung im neuen SQL-Server einhängen.
  • Auf dem neuen CRM- / Dynamics 365-Server können Sie dann die Organisation importieren. Nach der erneuten Eingabe der Namen sowie der Auswahl des Report-Servers kommen wir hier zum Benutzermapping. Dies können Sie automatisiert durchlaufen lassen, sofern die Domäne gleich bleibt. Anderenfalls müssen Sie die CRM-Benutzer manuell den AD-Benutzern zuweisen.
  • Im Falle des Fehlers „You must map your Active Directory user account to at least one enabled Microsoft Dynamics CRM user who has the System Administrator role before the organization can be imported“ sind folgende Ursachen möglich:
    • Sie führen den Import mit einem Benutzer durch, den Sie nicht gemappt haben > Sie müssen sich entweder den Import mit dem Benutzer durchführen, auf den die Anforderungen aus Schritt 2 passen, oder Ihren aktuellen Benutzer auf den besagten CRM-User mappen.
    • Sie führen den Import mit einem Benutzer durch, dessen CRM-User nur administrativen Zugriff auf das CRM hat > Führen Sie folgende Query in der Datenbank Ihrer Instanz aus:
      UPDATE SystemUserBase
      SET AccessMode = 0
      WHERE DomainName = 'DOMAIN\User'
    • Sie führen den Import mit einem Benutzer durch, dessen CRM-User deaktiviert ist > Führen Sie folgende Query in der Datenbank Ihrer Instanz aus:
      UPDATE SystemUserBase
      SET IsDisabled = 0
      WHERE DomainName = 'DOMAIN\User'

      Es kann sein, dass Sie davor einen anderen Benutzer deaktivieren müssen, um die maximale Anzahl von Benutzern nicht zu überschreiten:

      UPDATE SystemUserBase
      SET IsDisabled = 1
      WHERE DomainName = 'DOMAIN\OtherUser'
  • Danach wird der Import durchgeführt. Dies lief bei uns fehlerfrei durch. Sollten uns bei kommenden Migrationen noch gängige Fehler auffallen, werden wir diese an der Stelle ebenfalls festhalten.
  • Nach dem erfolgreichen Umzug müssen Sie bei der Verwendung von ADFS spätestens jetzt die alte Instanz löschen. Aktualisieren Sie anschließend beide Relying Party Trusts (mangels deutscher Server fehlt mir hier die Übersetzung) – die der alten Instanz und die der neuen.
  • Der A-Record muss ebenfalls auf die neue Infrastruktur zeigen.
  • Tragen Sie nach dem erfolgten Zugriff auf das neue CRM den in Schritt 1 gespeicherten Verschlüsselungskey wieder unter Einstellungen > Datenverwaltung > Datenverschlüsselung ein. Danach ist das CRM / Dynamics 365 wieder voll benutzbar.
Kategorien
Linux

/boot Partition läuft voll

Wenn die /boot Partition nur noch über wenig freien Speicher verfügt, reicht es meistens aus, die alten Kernel Versionen zu löschen.

Gehen Sie hiebei wie folgt vor:

Mit folgendem Befehl kann man sich alle installierten – jedoch nicht verwendeten – Kernel anzeigen lassen:

kernelver=$(uname -r | sed -r 's/-[a-z]+//')
dpkg -l linux-{image,headers}-"[0-9]*" | awk '/ii/{print $2}' | grep -ve $kernelver

Alle in dieser nun angezeigten Liste können gelöscht werden. Um Diese zu löschen, muss folgender Befehl verwendet werden (Hier am Beispiel mit linux-image-4.4.0-104-generic):

sudo apt-get purge linux-image-4.4.0-104-generic

Man kann sich wenn man die letzten 2 Kernel behalten möchte, jedoch nicht sicher ist ob schon genug Speicher freigegeben wurde, mit folgendem Befehl die aktuellen Daten für die /boot Partition ausgeben lassen:

df -h /boot