Probleme mit Visual Studio Formular Designer

11. Januar 2014 Keine Kommentare

Beim Öffnen großer Formulare in Visual Studio Formular Designer (WinForms) tritt teilweise das Problem auf, dass Visual Studio 2012/2013 wegen eines Problems beendet wird. In der Ereignisanzeige wird dabei ein Problem in der KERNELBASE.dll vermerkt.

Die Lösung ist dann eigentlich trivial: Es muss der Dienst Performance Logs & Alerts (pla) gestartet werden.

Es besteht nun die Vermutung, dass der Formulardesigner einfach eine Performance-Warnung melden wollte und das nicht konnte, weil der Dienst nicht aktiv war.

SQL Deadlock durch Autoclose

9. Januar 2014 Keine Kommentare

Seit einigen Monaten nervte in einer Microsoft SQL 2008 Datenbank ein Problem, welches gelegentlich auftrat. Auf die betreffende Datenbank waren ab einem scheinbar zufälligen Zeitpunkt keine schreibenden Zugriffe mehr möglich, lesende Zugriffe aber schon. Ein einfacher Blick nach der Verfügbarkeit reichte also nicht, um die Lauffähigkeit der Datenbank zu testen.

Ein Blick in die Log-Dateien brachte die Erkenntnis, dass diese Datenbank ziemlich oft gestartet wurde (im Gegensatz zu den anderen Datenbanken) und plötzlich ein Fehler 1205 auftrat:

Transaction (Process ID …) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

Danach war die Datenbank schreibend nicht mehr verfügbar, der Fehler 9001 trat auf:

The log for database ‚…‘ is not available. Check the event log for related error messages. Resolve any errors and restart the database.

Select – Abfragen waren davon aber nicht betroffen, da diese ja keine Log-Einträge erzeugen.

Die Lösung wurde in SQL ServerCentral.com beschrieben: Abschalten der Option AutoClose in den Eigenschaften der Datenbank! Da diese Eigenschaft weder bewußt gesetzt worden war, noch benötigt wurde, konnte das Problem so einfach gelöst werden.

KategorienDatenbank Tags: ,

ASP.NET MVC und Login Cookie

26. Dezember 2013 Keine Kommentare

Vor kurzem wurde ich von einer Anfrage eines Kunden überrascht. Eingaben auf meiner MVC Seite nach einer längeren Wartepause, die durchaus im Bereich von Stunden liegen kann, führten wieder zum Login. Da wir keine Daten in Sessions gespeichert haben, konnte ich mir das Verhalten erst nicht erklären. Ich bin immer davon ausgegangen, dass ein POST alle notwendigen Daten überträgt. Bei den Login-Informationen passte hier wohl etwas nicht wie erwartet. Also habe ich das ganze analysiert:

Bei einer MVC 3 oder 4 Webseite mit Formular-Authentifizierung wird folgender Code zum Setzen der Authentifizierungsinformationen aufgerufen:

FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);

Wählt der Anwender nun die Option Speichern nicht aus, so wird beim Authentifizierungscookie automatisch die Verfallsinformation auf Session gesetzt. Da Sessions in der Standardeinstellung nach 20 Minuten Inaktivität verfallen, erklärt es auch, warum nach längerer Pause die Anmeldung ungültig wurde:

FormsAuthentication.SetAuthCookie(model.UserName, false);

Cookie ohne Speichern

Besser sieht es jedoch auch, wenn die Anmeldeinformationen gespeichert werden dürfen:

FormsAuthentication.SetAuthCookie(model.UserName, true);

Dann wird das Authentifizierungscookie automatisch mit dem Verfallsdatum des Timeouts der Web.config gesetzt, hier 2880 Minuten => 2 Tage.

  <system.web>
    <authentication mode="Forms">
      <forms loginUrl="~/Account/Login" timeout="2880" />
    </authentication>
  </system.web>

Cookie mit Speichern

Mir persönlich fehlt jetzt noch die Option, dass Authentifizierungscookie bis zum Ende der Browsersitzung behalten zu können, aber man kann scheinbar nicht alles haben.

KategorienMicrosoft .NET Tags: ,

Fehler bei Windows Software RAID Wiederherstellung

16. Oktober 2013 Keine Kommentare

Gestern stand ich vor dem Problem, dass nach einem Festplattenfehler an einem Windows Server 2012 mit dem Tausch einer Festplatte, Windows keinen Spiegel mehr aufbauen konnte. Es kam zu einer klaren Fehlermeldung:

Error – All disks holding extents for a given volume must have the same sector size, and the sector size must be valid.

zu der es auch viele interessante Frage und Antwort Threads gab. Leider brachte mich anfangs kein Tipp wirklich weiter, also hieß es: Ursache suchen und verstehen.

Dabei hat mir das Tool smartctl geholfen. Damit kann man die technischen Daten der Festplatten anzeigen lassen.

Hier die alte Festplatte:

C:\Program Files (x86)\smartmontools\bin>smartctl -x sda
smartctl 6.2 2013-07-26 r3841 [i686-w64-mingw32-2012(64)] (sf-6.2-1)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Model Family: Seagate Barracuda LP
Device Model: ST31000520AS
Serial Number: 5VX0WWJD
LU WWN Device Id: 5 000c50 02511506c
Firmware Version: CC32
User Capacity: 1.000.204.886.016 bytes [1,00 TB]
Sector Size: 512 bytes logical/physical
Rotation Rate: 5900 rpm
Device is: In smartctl database [for details use: -P show]
ATA Version is: ATA8-ACS T13/1699-D revision 4
SATA Version is: SATA 2.6, 3.0 Gb/s

und hier die neue Ersatzfestplatte:

C:\Program Files (x86)\smartmontools\bin>smartctl -x sdb
smartctl 6.2 2013-07-26 r3841 [i686-w64-mingw32-2012(64)] (sf-6.2-1)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Model Family: Seagate Barracuda 7200.14 (AF)
Device Model: ST1000DM003-1CH162
Serial Number: Z1D4RCQ0
LU WWN Device Id: 5 000c50 063a48af4
Firmware Version: CC47
User Capacity: 1.000.204.886.016 bytes [1,00 TB]
Sector Sizes: 512 bytes logical, 4096 bytes physical
Rotation Rate: 7200 rpm
Device is: In smartctl database [for details use: -P show]
ATA Version is: ACS-2, ACS-3 T13/2161-D revision 3b
SATA Version is: SATA 3.1, 6.0 Gb/s (current: 3.0 Gb/s)

Hier wurde sofort klar, dass die Fehlermeldung das Problem sehr genau beschrieb, die physikalischen Sektorgrößen waren unterschiedlich, genauer gesagt kann ich keine Partition, die auf einer 512’er Sektor-Größe liegt, auf eine 4096’er Sektor-Größe spiegeln, weil das Raster passen kann, aber nicht muss. Ein Anruf beim Support mit der Bitte um Ersatz gegen eine neue Austaschplatte mit 512er Sektoren war dann einfach und löste das Problem.

Und hier noch eine Übersicht über die gefundenen Ratschläge, die auf zu finden waren:

Man kann nur identische Festplatten spiegeln, also beide Platten tauschen

Absoluter Quatsch ohne jede Basis. Identische Platten reduzieren nur die Stolperfallen, machen aber eine Clonen oder Neuaufsetzen vom System erforderlich! Man muss nur darauf achten, dass die Kapazität bis auf das Byte genau ausreichend ist, da die normalen Dialoge meist nur MB anzeigen.

Alles Partitionen löschen und gleich neu als Mirror anlegen

Das funktioniert natürlich, aber löst das Problem sehr aufwendig. In dem Falle geht es dann nur, weil das RAID über den kleinsten Nenner geht (Basis auf 4096’er Sektor) und der 512’er Sektor alle Bedingungen erfüllt. Ein Vermeiden der Mischung 4096er/512er Sektoren ist natürlich sinnvoller.

Administratorzugriff auf SQL Server wiederherstellen

18. September 2013 Keine Kommentare

Manchmal ist man in der Situation, dass man keinen Zugriff mehr auf einen SQL Server mehr hat, obwohl man selbst Administrator der darunter liegenden Windows-Version ist. In diesem Fall hat Microsoft dafür gesorgt, dass man recht einfach die Administrationsrechte für den SQL Server erlangen kann. Der meiner Meinung nach einfachste Weg geht so:

SQL-Server-KonfigurationsmanagerMan startet den SQL-Server-Konfigurationsmanager und öffnet die Eigenschaften des gewünschten SQL-Dienstes. Bei aktuellen Version hat man nun die Möglichkeit, direkt den Parameter -m hinzuzufügen. Dieser Parameter startet den SQL-Server Einzelbenutzermodus und gibt allen lokalen Administratoren Zugriff. Alternativ muss man bei älteren Versionen auf der Seite erweitert den Parameter direkt in der Auflistung angeben. Aber Achtung, dort werden die Parameter mit ; getrennt. Es muss dann also lauten:

-m;--dC:\Program Files\Microsoft S...

Anschließend muss der Dienst neu gestartet werden. Nun kann man sich mit dem SQL Server Managementstudio direkt verbinden. Aber auch hier Achtung: Das Programm muss dazu unbedingt als Administrator gestartet werden, selbst wenn unter Windows als Admin angemeldet ist! Nun kann man seinen Admin-Login hinzufügen und mit den notwendigen Rechten versehen. Zum Abschluss nicht vergessen, den Parameter -m wieder zu entfernen, damit der Server normal zur Verfügung steht.

KategorienDatenbank Tags: ,

Genaues Erstellungsdatum mit DIR anzeigen

2. August 2013 Keine Kommentare

Ich benötigte für eine Überprüfung von Dateien auf einem Server das exakte Datum der Erstellung. Ein Blick in die Optionen von DIR oder die Eigenschaften der Datei zeigte aber immer nur Informationen auf die Minute genau an, ich brauchte aber zur sinnvollen vergleichenden Bewertung der Performance die Sekunden-Bruchteile.

Nach etwas erfolgloser Suche habe ich mir das in der Powershell selbst zusammengebastelt:

Get-ChildItem | Sort-Object CreationTime |
 Format-Table Name,@{Expression={$_.CreationTime};FormatString="mm/ss/ff"}

Damit bekommt man wie bei Dir auch alle Dateien in einem Verzeichnis angezeigt, dass ganze wird nach dem Erstelldatum sortiert und mit dem Erstelldatum in Minuten/Sekunden/Sekundenbruchteilen ausgegeben. Bei der Formatierung der Uhrzeit hat man so natürlich viele Möglichkeiten.

KategorienAllgemein, Toolbox Tags:

Von Mozilla Thunderbird nach Office365 wechseln, Teil 3

26. Januar 2013 Keine Kommentare

Nachdem ich in den letzten beiden Teilen bereits von den Problemen bei der Migration von Mozilla Thunderbird nach Office365 berichtet haben, konnte ich nun einen Durchbruch erzielen. Dazu habe ich einen alten virtuellen PC genutzt, in dem noch Office 2003 installiert war (Office 2013 funktioniert im Moment im ersten Schritt noch nicht!). Dort habe ich MailStore Home installiert. Diese Software ist eigentlich dazu da, Emailprogramme zu sichern und bei Bedarf auch wiederherzustellen. Ich habe als ein MailStore-Backup von Thunderbird (diese Software lässt sich problemlos auf einem USB-Stick betreiben) in den alten Rechner mit Outlook 2003 übertragen. Danach war nur noch die pst-Datei in mein reales Outlook 2013 zu übertragen und Outlook mit Office365 zu verbinden. Office365 läuft für Outlook wie ein Exchange und auch die Übertragung großer Ordnerstrukturen ist so kein Problem.

KategorienAllgemein Tags:

Von Mozilla Thunderbird nach Office365 wechseln, Teil 2

6. Januar 2013 2 Kommentare

Wie ich im letzten Beitrag bereits geschrieben habe, versuche ich gerade meine Emails in die Office365 Cloud umzuziehen. Leider ist die Thunderbird-IMAP-Schnittstelle zur Office365-IMAP-Schnittstelle nur bedingt kompatibel. Konkret äußert sich das so:

Problem 1: Kopiert man einen Ordner, der Unterordner enthält, in Richtung Office365, so wird erst der Hauptordner ordentlich angelegt, dann werden dessen Emails übertragen. Der erste Unterordner wird ebenfalls angelegt. Danach erfolgt leider ein Abbruch mit der Servermeldung, dass der Ordner in Office365 nicht vorhanden sei. Im Nachgang lassen sich die Dateien aber problemlos in den Ordner kopieren. Im Endeffekt bedeutet das aber, dass ich alle Ordner einzeln transferieren muss.

Problem 2: Enthält ein Ordner Zeichen wie beispielsweise einen Slash: „12/2012“, so hat man ein echtes Problem: In Office365 wird nur der Ordner 12 angelegt und unterhalb der Ordner 2012 angezeigt. Scheinbar wird der Slash als Trennzeichen gewertet. Auf dem Server landet also erst einmal nur die 12. Löschen lässt sich der Ordner nicht mehr, es kommt ein Fehler. Die einzige Hilfe ist hier, den übergeordneten (!) Ordner zu löschen, was aber auch nur geht, wenn der Papierkorb nicht bereits vom ersten Versuch einen gleichnamigen Ordner enthält.

Zwischenstand: Ich werde den Transfer direkt mit Mozilla Thunderbird erst einmal abbrechen. Wenn ich jeden Ordner einzeln übertragen muss, werde ich noch Wochen beschäftigt sein, da man mit einer weiteren Aktion immer erst den Abschluss der vorangegangenen Aktion abwarten muss. Wenn ich an die vielfältigen Email-Konfigurationen von Kunden denke, würde ich momentan sicher erst einmal vor einem Wechsel in Office365 warnen, wenn man keinen erprobten Migrationspfad hat. Vielleicht ist ja aber auch Outlook wirklich das Mittel der Wahl. Ich werde meinen Test darum darauf verlagern.

KategorienAllgemein Tags:

Von Mozilla Thunderbird nach Office365 wechseln

28. Dezember 2012 Keine Kommentare

Eigentlich ist es ja schön: Ich habe viele mobile Geräte und kann überall meine Emails abrufen, nur liegen die meisten lokal auf dem Rechner. Das möchte ich gern ändern und mache darum gerade einen Test mit Office 365.

Vom Prinzip her stellt das kleine Paket einen IMAP-Webspace von 25GB zur Verfügung und ermöglicht mir (und hier unterscheidet es sich deutlich von Mitbewerbern), mit Outlook Web Access bequem darauf zuzugreifen. Je nach Paket ist auch noch ein Office-Speicherplatz dabei. Der Komfort einer solchen Lösung ist hoch und meine Endgeräte, im speziellen das WindowsPhone sollten davon profitieren.

Leider steht da noch die Frage im Raum: was mache ich mit meinen lokalen Mails in Thunderbird. Ich habe einige Lösungen gefunden, die alle grob wie folgt gingen: Nutze ein Tool und exportiere oder archiviere Thunderbird. Importiere alles in Outlook und schiebe es dann in die Cloud. Nur leider habe ich kein Outlook installiert und wollte auch nicht erst alle Daten übernehmen. Dann kam mir eine andere Idee: Office 365 stellt mir auch eine IMAP-Schnittstelle zur Verfügung. Diese soll beispielsweise mit Thunderbird genutzt werden. Und somit ist die Lösung extrem einfach:

Ich habe meinen Office 365 Account in Thunderbird angelegt. Nun kann ich alle Ordner (auch mehrere und rekursiv) per Drag&Drop nach Office 365 schieben und muss nur noch warten. Zur Sicherheit schiebe ich mit gedrückter Strg/Ctrl-Taste, somit kann ich nach dem Test entscheiden, welchen Baum ich löschen werden.

KategorienAllgemein Tags:

Fehlermeldung beim Einbinden SqlExpr.pas

5. November 2012 Keine Kommentare

Der Versuch, eine alte Anwendung auf einer frischen Delphi 7 Installation zu erstellen, brachte sofort beim Einbinden der Unit SqlExpr eine Fehlermeldung:

Unit SqlExpr wurde mit einer unterschiedlichen Version von SqlConst.SNOERROR compiliert

Leider haben mir der Tipp auf Delphipraxis nur bedingt weitergeholfen. Dazu soll folgender Code:

SNOERROR ='';
SWARNING ='';
SCONNECTIONFAILED ='';
SDRIVERINITFAILED ='';
SOPTLOCKFAILED ='';
SINVALIDREF ='';
SNOTABLE ='';
SDBXError ='';
SNODATA ='';
SSQLERROR ='';
SSQLServerError'';

in der SqlConst.pas im Source\VCL Ordner eingefügt werden und das ganze erzeugt und nach {Delphi}\Lib und {Delphi}\Lib\Debug verteilt werden. Wie man diese Unit aber erzeugt, stand leider nicht dabei und es ist mir auch nicht gelungen, den Code habe ich trotzdem eingefügt, da diese pas-Datei im Suchpfad ist.

In der Entwickler Ecke habe ich dann den nächsten Tipp gefunden:

Das nächste Problem scheint DBExpress zu sein, einige Projekte konnten nicht kompiliert werden, da SqlExpr.dcu mit einer anderen Version kompiliert wurde. Den Fehler konnte ich mittlerweile beheben, das Update hat im Verzeichnis $(DELPHI)\lib\ eine Datei SqlConst.dcu.de angelegt. Ich habe die Datei SqlConst.dcu dann nach SqlConst.dcu.org umbenannt und SqlConst.dcu.de nach SqlConst.dcu. Das gleiche auch nochmal im Verzeichnis $(DELPHI)/lib/debug.

Nachdem ich auch diese Umbenennung durchgeführt habe, klappte es wieder wunderbar. Der Fehler scheint übrigens irgendwie mit der deutschen Lokalisierung vom ServicePack 1 für Delphi 7 im Zusammenhang zu stehen.

KategorienDelphi Win32 Tags: