Fehlermeldung mit „perf-ReportServer-rsctr.dll“ beim Update von Microsoft SQL Server 2008 R2

Beim Update von Microsoft SQL Server 2008 R2 kam während des Setuplaufs folgender Fehler:

Der Prozess kann nicht auf die Datei „C:\WINDOWS\system32\perf-ReportServer-rsctr.dll“ zugreifen, da sie von einem anderen Prozess verwendet wird.

TITEL: Microsoft SQL Server 2008 R2-Setup
——————————

Fehler:

Der Prozess kann nicht auf die Datei „C:\WINDOWS\system32\perf-ReportServer-rsctr.dll“ zugreifen, da sie von einem anderen Prozess verwendet wird.

Klicken Sie auf ‚Wiederholen‘, um die fehlgeschlagene Aktion zu wiederholen, oder auf ‚Abbrechen‘, um diese Aktion abzubrechen und Setup fortzusetzen.

Hilfe erhalten Sie durch Klicken auf: http://go.microsoft.com/fwlink?LinkID=20476&ProdName=Microsoft+SQL+Server&EvtSrc=setup.rll&EvtID=50000&ProdVer=10.50.1600.1&EvtType=0x24776C0D

——————————
SCHALTFLÄCHEN:

&Wiederholen
Abbrechen
——————————

Ursache

Die Ursache war dann nach langem Recherchieren trivial: Es lief Process Explorer von SysInternals, der die DLL gesperrt hatte.

Lösung

Die Lösung ist ebenso trivial gewesen: Ich habe Process Explorer dann komplett abgeschossen und konnte das Setup erfolgreich abschließen.

Praxistipps für den Umgang mit einem Content Management System (CMS)

Auf der Website für unseren Hompage-Generator Zeta Producer habe ich vor einiger Zeit versucht, ganz viele nützliche Tipps aufzuschreiben, unabhängig von unserem Produkt, für den Umgang mit einer Website und allem was dazu gehört:

CMS-Praxistipps für Einsteiger

CMS-Praxistipps für Profis

Häufige Fragen

Ggf. ist das ja für den einen oder anderen nützlich.

Repair broken TortoiseSVN Explorer Overlay Icons on Windows 7 64-bit

Symptom

The cute litte Windows Explorer Shell Overlay Icons of TortoiseSVN (you know those red, green, blue, etc. icons) that indicate the SVN state of your files or folders are missing.

Your are using a 64-bit version of Microsoft Windows 7.

Cause

The 64-bit versions of Windows 7 can only handle a total of 15 overlay icon handler.

Resolution

The resolution to edit the registry, as described in this article on Stack Overflow did not work on my machine.

What actually helped was that I updated to the latest version of TortoiseSVN and then used Autoruns from Sysinternals to remove all the Shell overlay icon identifiers except those of TortoiseSVN:

In my case there were lots of those ugly Groove entries (installed by Microsoft Office 2010) and some Dropbox entries.

After unchecking and rebooting my machine, the TortoiseSVN icons appeared again.

You can get Autoruns directly from the URL http://live.sysinternals.com/autoruns.exe without the need to install anything.

Verhalten von BOF und EOF in ADO

Zurzeit habe ich die Aufgabe ein Microsoft-Access-VBScript-Projekt in eine moderne Ajax-ASP.NET-4.0-C#-Anwendung zu migrieren.

Dabei stoße ich auf zahlreiche „seltsame“ Sachen die mit VBScript so möglich sind.

Recordset.BOF und Recordset.EOF

Eines davon ist die Logik der Eigenschaften „BOF“ und „EOF“ eines Recordsets.

Laut Dokumentation gilt:

BOF: Indicates that the current record position is before the first record in a Recordset object.
EOF: Indicates that the current record position is after the last record in a Recordset object.

Der Programmcode durch den ich mich arbeite verwendet die BOF-Eigenschaft häufig zum Prüfen ob Datensätze vorhanden sind oder nicht.

Selbsttest

Leider widersprechen sich Programmlogik und Kommentare manchmal, deshalb habe ich eine kleine Access-Datenbank mit einem Modul erstellt, das die verschiedenen Fälle durchspielt.

Das Ergebnis ist wie folgt:

=========================
Test-Beginn

—————
SQL-Abfrage die einen Datensatz liefert (Count: 1)
BOF: Falsch
EOF: Falsch

—————
SQL-Abfrage die mehrere Datensätze liefert (Count: 2)
BOF: Falsch
EOF: Falsch

—————
SQL-Abfrage die keine Datensätze liefert (Count: 0)
BOF: Wahr
EOF: Wahr

Test-Ende
=========================

D.h. sobald ein Datensatz vorhanden ist, sind sowohl BOF als auch EOF „false“, sonst jeweils „true“.

Somit bedeuten folgende Prüfungen:

If Recordset.BOF = False then –> Daten sind vorhanden
If Recordset.BOF = True then –> Daten sind nicht vorhanden

Download

Damit Ihr es bei Interesse selbst mal ausprobieren könnt, gibt es hier die Access-Datei zum Download.

Doppelte Zeilen in Excel finden

Dieser Artikel ist primär als Erinnerung für mich selber gedacht.

Um in Microsoft Office Excel mehrfache (doppelte) Zeilen zu erkennen und markieren, gibt es folgende kleine Formel:

=WENN(ZÄHLENWENN(A$2:A2;A2)>1;“Doppelt“;““)

Dies einfach in die Spalte rechts daneben schreiben und mit der Maus dann den Bereich nach unten ziehen.

Beispiel

Um das zu verdeutlichen, hier eine kleine Tabelle (Download):

Bildschirmfoto einer Tabelle in Microsoft Office Excel 2010

Die Spalte „Doppelt?“ enthält überall dort Einträge „Doppelt“ wenn der Datensatz bereits vorhanden ist.

Diese Zeilen könntet Ihr dann z.B. löschen oder herausfiltern.

Alternative mit Excel 2010 und neuer (2013, 2016)

Unter Microsoft Office Excel 2010, 2013, 2016 und neuer gibt es die Option „Bedingte Formatierung“ und darin die Option „Regeln zum Hervorheben von Zellen“ sowie die untergeordnete Option „Doppelte Werte“.

Wenn Ihr zuvor eine ganze Spalte markiert und dann diese Bedingte Formatierung auf die Spalte anwendet, bekommt Ihr eine gleichwertige Lösung.

XML-Fehlermeldung „Hexadezimaler Wert ist ein ungültiges Zeichen“

Fehlerbeschreibung

Beim Lesen von XML-Dokumenten in .NET mit dem XmlDocument oder dem XmlReader oder XmlTextReader kommt eine Fehlermeldung in der Form:

System.Xml.XmlException

—————-

‚‘, hexidezimaler Wert 0x1F, ist ein ungültiges Zeichen. Zeile 10, Position 13.

—————-

bei System.Xml.XmlTextReaderImpl.Throw(Exception e)
bei System.Xml.XmlTextReaderImpl.Throw(String res, String[] args)
bei System.Xml.XmlTextReaderImpl.Throw(Int32 pos, String res, String[] args)
bei System.Xml.XmlTextReaderImpl.ThrowInvalidChar(Int32 pos, Char invChar)
bei System.Xml.XmlTextReaderImpl.ParseCDataOrComment(XmlNodeType type, Int32& outStartPos, Int32& outEndPos)
bei System.Xml.XmlTextReaderImpl.ParseCDataOrComment(XmlNodeType type)
bei System.Xml.XmlTextReaderImpl.ParseElementContent()
bei System.Xml.XmlTextReaderImpl.Read()
bei System.Xml.XmlLoader.LoadNode(Boolean skipOverWhitespace)
bei System.Xml.XmlLoader.LoadDocSequence(XmlDocument parentDoc)
bei System.Xml.XmlLoader.Load(XmlDocument doc, XmlReader reader, Boolean preserveWhitespace)
bei System.Xml.XmlDocument.Load(XmlReader reader)
bei System.Xml.XmlDocument.LoadXml(String xml)

Bzw. in Englisch:

System.Xml.XmlException

—————–

“, hexadecimal value 0x02, is an invalid character. Line 19, position 5.

—————–

at System.Xml.XmlTextReaderImpl.Throw(Exception e)
at System.Xml.XmlTextReaderImpl.Throw(String res, String[] args)
at System.Xml.XmlTextReaderImpl.ThrowInvalidChar(Int32 pos, Char invChar)
at System.Xml.XmlTextReaderImpl.ParseCDataOrComment(XmlNodeType type, Int32& outStartPos, Int32& outEndPos)
at System.Xml.XmlTextReaderImpl.ParseCDataOrComment(XmlNodeType type)
at System.Xml.XmlTextReaderImpl.ParseElementContent()
at System.Xml.XmlTextReaderImpl.Read()
at System.Xml.XmlLoader.LoadNode(Boolean skipOverWhitespace)
at System.Xml.XmlLoader.LoadDocSequence(XmlDocument parentDoc)
at System.Xml.XmlLoader.Load(XmlDocument doc, XmlReader reader, Boolean preserveWhitespace)
at System.Xml.XmlDocument.Load(XmlReader reader)
at System.Xml.XmlDocument.LoadXml(String xml)

Ursache

Es ist wohl tatsächlich ein für den XML-Parser ungültiges Zeichen enthalten.

Wie das Zeichen jeweils herein kam ist mir unbekannt. Da ich den XML-Text jeweils selbst auch wegschreibe (basierend auf einem gehosteten Internet Explorer im Design-Modus), gehe ich davon aus, dass aus dem Internet Explorer ungültige Zeichen „durchrutschen“.

Eigentlich hätte ich erwartet dass beim Generieren des XML-Dokuments die .NET-XML-Routinen ungültige Zeichen bereits herausfiltern bzw. korrekt escapen.

Lösung

Auf dieser Website wird als Lösung beschrieben, die ungültigen Zeichen zu entfernen.

Mithilfe eines Regulären Ausdrucks habe ich das dann gemacht. Hier ist ein Code-Ausschnitt:

private static Regex _rx;

public static string CleanInvalidXmlCharacters(
string xml)
{
if (string.IsNullOrEmpty(xml))
{
return xml;
}
else
{
if (_rx == null)
{
//
http://www.discogs.com/help/forums/topic/189304
//
http://meinews.niuz.biz/regex-t248608.html?s=3e8c40fe6d48a1a36e66437f3a3ec944&
_rx = new Regex(@“[\x01-\x08\x0B\x0C\x0E-\x1F]“, RegexOptions.Compiled);
}

return _rx.Replace(xml, string.Empty);
}
}

Diese Funktion rufe ich jeweils auf, bevor ich eine Zeichenfolge an die XmlDocument.Load( string xml )-Methode übergebe.

Ich bin mir unsicher ob das die perfekte Lösung ist; sie funktioniert (übrigens in dem Programm hier) und scheint keine Seiteneffekte zu haben.

Andere Meinungen dazu?

Check whether Browsable attribute is set to TRUE

To check, whether an element in .NET has set the browsable attribute, use the following code:

public static bool HasBrowsableAttributeTrue(
    object o )
{
    if ( o==null )
    {
        return false;
    }
    else
    {
        var fi = o.GetType().GetField( o.ToString() );

        var attributes =
            (BrowsableAttribute[])fi.GetCustomAttributes(
                typeof( BrowsableAttribute ),
                false );

        if ( attributes != null && attributes.Length > 0 )
        {
            return attributes[0].Browsable;
        }
        else
        {
            return false;
        }
    }
}

This works even if the object is null.

Webbasierter-FTP-Client

Wenn Ihr spontan einen FTP-Client benötigt, also eine Anwendung mit der Ihr über das FTP-Protokoll Daten an einen Server übertragen wollt, habe ich hier einen Tipp für Euch:

net2ftp.com

Bildschirmfoto der Website www.net2ftp.com

Das ist eine kostenlose Webanwendung die als FTP-Client fungiert. Ihr gebt die Zugangsdaten ein und könnt dann fast wie mit einer lokalen FTP-Anwendung Daten auf Eurem Server manipulieren (Upload, Download, verschieben, bearbeiten, Ordner anlegen, usw.).

Die Webanwendung fungiert dann quasi als Proxy zwischen Euch und dem FTP-Server, Ihr benötigt lokal also keinen offenen FTP-Port.

Nachteil ist, dass Ihr einer anderen Anwendung Eure FTP-Zugangsdaten anvertraut. Aber hey, woher weiß ich, dass z.B. FileZilla, WS_FTP oder FireFTP da sensibler mit den Daten umgehen? Nur weil sie lokal installierte Anwendungen sind, könnten sie trotzdem die Zugangsdaten heimlich „nach Hause“ senden.

Ggf. ist die net2ftp-Anwendung auch geringfügig langsamer, da alle Kommunikation über den Webserver geht.

Ich mag die Anwendung sehr; sie ist auch gut für den Ad-hoc-Zugriff mal eben an einem Kundenrechner, wenn Ihr gerade unterwegs seit. Quasi ein „TeamViewer für FTP“. 😉

Update: Karsten schreibt mir gerade, dass es auch www2ftp.de gibt. Danke!

System.Security.SecurityException für System.Web.AspNetHostingPermission

Fehlermeldung

Heute habe ich nach dem Aktualisieren einer ASP.NET-3.5-Anwendung auf einem IIS7-Server folgende Fehlermeldung im Browser erhalten:

Serverfehler in der Anwendung /MyApplication.

Sicherheitsausnahme

Beschreibung: Die Anwendung hat versucht, einen Vorgang auszuführen, der von der Sicherheitsrichtlinie nicht zugelassen ist. Um der Anwendung die erforderliche Berechtigung zu erteilen, wenden Sie sich an den Systemadministrator oder ändern Sie die Vertrauensebene für die Anwendung in der Konfigurationsdatei.

Ausnahmedetails: System.Security.SecurityException: Fehler bei der Anforderung des Berechtigungstyps „System.Web.AspNetHostingPermission, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089“.

Quellfehler:

Beim Ausführen der aktuellen Webanforderung wurde einen unbehandelte Ausnahme generiert. Informationen über den Ursprung und die Position der Ausnahme können mit der Ausnahmestapelüberwachung angezeigt werden.

Stapelüberwachung:

[SecurityException: Fehler bei der Anforderung des Berechtigungstyps „System.Web.AspNetHostingPermission, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089″.]
System.Reflection.Assembly._GetExportedTypes() +0
System.Reflection.Assembly.GetExportedTypes() +16
System.Web.Compilation.BuildResultMainCodeAssembly.FindAppInitializeMethod() +26
System.Web.Compilation.CodeDirectoryCompiler.GetCodeDirectoryAssembly(VirtualPath virtualDir, CodeDirectoryType dirType, String assemblyName, StringSet excludedSubdirectories, Boolean isDirectoryAllowed) +882
System.Web.Compilation.BuildManager.CompileCodeDirectory(VirtualPath virtualDir, CodeDirectoryType dirType, String assemblyName, StringSet excludedSubdirectories) +125
System.Web.Compilation.BuildManager.CompileCodeDirectories() +265
System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled() +320

Versionsinformationen: Microsoft .NET Framework-Version:2.0.50727.4927; ASP.NET-Version:2.0.50727.4927

Das war ein Schock!

Und auch noch auf einem Produktivserver eines Kunden. Fuck!

Workaround

Also gleich die zuvor gemachte Sicherheitskopie zurückgespielt, dann lief alles wieder.

Damit erst mal genug, während der Hauptnutzungszeit der Kunden keine weitere Experimente.

Analyse und Lösung

Heute Abend habe ich dann nach Gesprächen mit einem Kollegen eine Idee gehabt:

Es könnte ja sein, dass es beim Entpacken der neuen Dateien aus dem ZIP-Archiv mit dem ich diese auf den Server übertragen habe, ggf. die NTFS-Berechtigungen zerschossen/verbogen wurden.

Also habe ich nochmals die neuen Dateien in den Zielordner des Webserver kopiert und via Rechtsklick auf den Ordner, alle Sicherheitsberechtigungen auf die neu hineinkopierten Dateien und Ordner vererben lassen, besehende Berechtigungen ersetzen lassen.

Und siehe da: Die Anwendung funktioniert wieder wie gewünscht!

Using UrlRewriter.NET in IIS7

When migrating an IIS6 website to IIS7 you probably want to keep an existing UrlRewriter.NET configuration and migrate to the official Microsoft URL Rewriter Module for IIS 7 later on.

Here is the important excerpt from „Web.config“:

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
        <add name="UrlRewriter"
            type="Intelligencia.UrlRewriter.RewriterHttpModule" />
    </modules>
</system.webServer>

Thanks to Rainer who figured this out from this posting.

Another good discussion can be found in the article „Wildcard script mapping and IIS 7 integrated pipeline“ on the IIS website and the article „Use a Single Web.Config for IIS6 and IIS7„.