 TechNet Magazine March 2007
TechNet Magazine March 2007
MARCH 2007
SQL Server

SQL SERVER OPTIMIERT

SQL Server ist Thema des Monats hier im TechNet Magazin. In dieser Ausgabe erfahren Sie mehr darüber, wie SQL Server auf Touren zu bringen ist. Sie erfahren, wie saubere, gesunde Indexe zu erzielen sind, sodass SQL Server schnelle Abfragen durchführen und Ihnen alle Informationen, die Sie benötigen, direkt an die Hand geben kann.

Es wird gezeigt, wie die Clusterbildung in SQL Server Redundanz liefert und die Betriebszeit steigert. Sie erfahren auch, was hohe Verfügbarkeit in Ihrer Umgebung bedeutet, und wie Sie sie erreichen können. Schließlich wird gezeigt, wie Sie Problemen mit Tabellenpartition ein für alle Mal ein Ende setzen können.

Windows-Verwaltung

Und nicht vergessen: Auch diesen Monat ist Mark Russinovich wieder mit weiteren Einblicken in den Windows Vista-Kernel zur Stelle.
FUNKTIONEN
SQL Server Neue Tools zur Diagnose des Indexzustands

Um die bestmögliche Leistung aus SQL Server herauszuholen, müssen die Indizes überwacht und ihr fehlerfreier Zustand sichergestellt werden. Neue dynamische Verwaltungsansichten und Funktionen bieten Ihnen Einblick in SQL Server, sodass Sie die Funktion Ihrer Indizes besser verstehen und mögliche Leistungsprobleme erkennen können.

Randy Dyess Hohe Verfügbarkeit für SQL Server

SQL Server 2005 bietet eine Anzahl von Optionen, mit denen die Datenbankverfügbarkeit verbessert werden kann. Diese reichen von der Replikation über die Clusterbildung bis hin zum Protokollversand. Im Folgenden werden die verschiedenen Möglichkeiten zum Konfigurieren von SQL Server erläutert. Darüber hinaus erhalten Sie Hilfe bei der Entscheidung, welche der Möglichkeiten für Ihre Umgebung am besten geeignet sind.

Zach Nichter Vereinfachen der Datenbankwartung mit Tabellenpartitionen

In der Vergangenheit war die Arbeit mit Partitionen und sehr großen Tabellen eine aufwändige und mühsame Aufgabe, doch mit SQL Server 2005 wurde die Tabellenpartitionierung stark vereinfacht. Jetzt können Sie leicht mehrere Partitionen erstellen, diese Partitionen verschieben, alte Partitionen löschen und sogar die Art und Weise ändern, wie Daten partitioniert werden.

Noah Gomez Die besten Tipps für die SQL Server-Clusterbildung

Ein Servercluster bietet Failoverfunktionen und stellt mehr Betriebszeit für Ihre unverzichtbaren Vorgänge bereit. Doch damit ein Cluster wirksam sein kann, muss er richtig implementiert werden. Hier finden Sie ein paar wichtige Tipps, mit denen Sie Ihren Cluster schneller einrichten und sein zuverlässiges Funktionieren sicherstellen können.

Tom Moreau, PhD Windows-Verwaltung Einblick in den Windows Vista-Kernel: Teil 2

Diesen Monat setzen wir unsere detaillierte Diskussion über das fort, was neu im Windows Vista-Kernel ist. In dieser Ausgabe werden einige Verbesserungen in der Speicherverwaltung von Windows Vista besprochen und die Bereiche Systemstart, Herunterfahren und Energieverwaltung erkundet.

Mark Russinovich
SPALTEN
Mitteilung der Redaktion

Auszeichnungen

Joshua Trupin Toolbox

Neue Produkte für IT-Profis

Greg Steen Schwerpunkt Dienstprogramme

SyncToy

Jay Munro SQL – Fragen und Antworten

Sommerzeit, Serverspeicher und mehr

Herausgegeben von Nancy Michell The Cable Guy

Das DHCPv6-Protokoll

Joseph Davies Windows PowerShell

Die Kraft der Variablen

Don Jones 		Hey, Scripting Guy!

Antwort auf Ihre Fragen zur Organisationseinheit...für nur 5 Cent

Die Scripting Guys von Microsoft Exchange Fragen & Antworten

Transaktionsprotokolle, Cmdlets, Remotemanagement und mehr

KC Lemson und Nino Bilic Sicherheit auf dem Prüfstand

Bereitstellen von EFS: Teil 2

John Morello Die Desktopdateien

Einstieg in PsTools

Wes Miller Inside Microsoft.com

Erste Schritte mit der Datenbankspiegelung

Saleem Hakani Berichte aus der Praxis

Der IT-Spezialist als Arzt?

Matt Hester Windows Confidential

Durch Dummheit klug aussehen

Raymond Chen


 SQL Server: Neue Tools zur Diagnose des Indexzustands
SQL Server Randy Dyess

Neue Tools zur Diagnose des Indexzustands
Kurz zusammengefasst:
  • Indexfragmentierung
  • Indexnutzung
  • Indexbetriebsabläufe
Laden Sie den Code für diesen Artikel herunter: DyessSQLIndex2007_03.exe (151KB)

Eins der wichtigsten Elemente einer Prüfliste für die Leistungsoptimierung von SQL Server ist das Optimieren der Indizes in einer Datenbank. Die Fähigkeit des SQL Server-Abfrageoptimierers zur richtigen Verwendung der Indizes während der Ausführung einer Abfrage hängt nicht nur von der Erstellung wirksamer Indizes ab,
sondern auch von ihrem fehlerfreien Zustand. Eine Reihe von dynamischen Verwaltungsansichten (DMVs – Dynamic Management Views) und Funktionen (DMFs – Dynamic Management Functions), die bei SQL Server™ 2005 eingeführt wurden, kann Datenbankadministratoren helfen, die Wirksamkeit ihrer Indizes zu bestimmen und Leistungsprobleme zu erkennen.
DMVs und DMFs ermöglichen die Überprüfung eines Servers und geben Informationen über den Serverzustand zurück, die bei der Überwachung von Zustand und Leistung der Serverinstanz und bei der Diagnose von Problemen helfen. Datenbankadministratoren, die mit früheren Versionen von SQL Server vertraut sind, werden feststellen, dass mit diesen DMVs und DMFs die Verwendung von DBCC-Befehlen ersetzt wird, indem sie bestimmte gespeicherte Verfahren ausführen, viele Systemtabellen abfragen und Ereignisse mit SQL Profiler aufzeichnen.
Drei Schlüsselfunktionen und Ansichten (sys.dm_db_index_physical_stats, sys.dm_db_index_usage_stats und sys.dm_db_index_operational_stats) stehen zur Verfügung, um festzustellen, ob die Indizes wie erwartet funktionieren. Mit ihrer Hilfe können Sie die E/A- und Sperrmuster Ihrer Indizes überprüfen und feststellen, ob sie vom Abfrageoptimierer so genutzt werden, dass es in der Datenbank nicht zu unnötigen Konflikten kommt.

Indexfragmentierung
Die DMF sys.dm_db_index_physical_stats wurde als Ersatz für DBCC SHOWCONTIG erstellt und zeigt die Fragmentierung eines Index an. Im Gegensatz zu der Anweisung DBCC SHOWCONTIG, die in der Tabelle, die den Index enthält, eine freigegebene Sperre (S) implementiert, ist es bei sys.dm_db_index_physical_stats nur eine beabsichtigte freigegebene Sperre (IS), die die Sperrung der Tabelle während der Ausführung der Funktion stark verringert.
Um die Fragmentierung eines Index bei Verwendung von sys.dm_db_index_physical_stats festzulegen, untersuchen Sie eine Kombination aus drei Spalten in der Ausgabe der Funktion. Die logische Fragmentierung von Indizes (Blockfragmentierung von Heaps) kann durch Betrachten des in der Spalte avg_fragmentation_in_percent zurückgegebenen Werts festgelegt werden. Die logische Fragmentierung ist der Prozentsatz der Seiten, die auf der Blattebene eines Index nicht planmäßig sind, während es sich bei der Blockfragmentierung um den Prozentsatz von nicht planmäßigen Blöcken auf der Blattebene eines Index handelt. Die logische Fragmentierung und Blockfragmentierung können sich auf die Leistung eines Index auswirken, wenn zusätzliche E/A- und Datenträgerkopfbewegung angefordert wird, da sich der Datenträgerkopf herumbewegen muss, um Seiten der Reihe nach zu lesen. Sie sollten bestrebt sein, sowohl die logische Fragmentierung als auch die Blockfragmentierung möglichst nahe null zu halten.
Die interne Fragmentierung eines Index ist der Prozentsatz der Seitenauslastung. Natürlich soll die Indexseite so voll wie möglich sein, aber gleichzeitig muss die Auslastung gegenüber der Anzahl von Einfügungen in Indexseiten ausgewogen sein, um die Anzahl von Seitenteilungen möglichst gering zu halten.
Das Argument avg_page_space_used_in_percent von sys.dm_db_index_physical_stats sollte untersucht werden, um die Indexseitenauslastung zu bestimmen. Um richtig zu konfigurieren, wie nah diese Zahl bei 100 Prozent liegt, passen Sie den Füllfaktor eines Index an, während Sie die Anzahl von Seitenteilungen beobachten, die eintreten. An einem gewissen Punkt erhöht sich die Anzahl von Seitenteilungen deutlich, was darauf hinweist, dass Sie den Füllfaktor des Index höher eingestellt haben als er sein sollte. Das Einstellen des Füllfaktors eines Index erfordert Zeit und Tests und sollte nicht ohne die entsprechende Planung durchgeführt werden. (Bei Indizes, die keine zufälligen Einfügungen in einem Index haben, kann der Füllfaktor auf 100 eingestellt werden, ohne dass dadurch die Seitenteilungen erhöht würden).
Um die Fragmentierungsebenen aller Indizes in der Tabelle AdventureWorks.HumanResources.Employee zu ermitteln, könnten Sie eine Anweisung wie diese verwenden:
SELECT *
FROM sys.dm_db_index_physical_stats (DB_ID('AdventureWorks')
,OBJECT_ID('HumanResources.Employee')
,NULL
-- NULL to view all indexes;
-- otherwise, input index number
,NULL -- NULL to view all partitions of an index
,'DETAILED') -- We want all information
Nutzen Sie diese DMF, um automatisch zu bestimmen, welche Indizes neu aufgebaut, welche neu organisiert und welche nicht gewartet werden müssen. Durch Untersuchung der Werte der Spalten avg_page_space_used_in_percent und avg_fragmentation_in_percent dieser DMF zur Indexfragmentierung, die außerhalb eines akzeptierten logischen und Dichtheitsschwellenwerts liegt, können Sie den Vorgang bestimmen, der auf dem Index durchgeführt werden soll.
Abhängig vom Zustand Ihrer Indizes gibt das Beispiel in Abbildung 1 möglicherweise keine Daten in Ihrer Kopie der AdventureWorks-Beispieldatenbank zurück, aber es kann leicht für andere Datenbanken angepasst werden.
Figure 1 Untersuchung der Seitenauslastung und Fragmentierung (Close Figure 1)
--Reorganize the following indexes in the AdventureWorks database
USE AdventureWorks
GO

SELECT OBJECT_NAME([object_id]) AS 'Table Name',
index_id AS 'Index ID'
FROM sys.dm_db_index_physical_stats (DB_ID('AdventureWorks')
,NULL -- NULL to view all tables
,NULL -- NULL to view all indexes; otherwise, input index number
,NULL -- NULL to view all partitions of an index
,'DETAILED') --We want all information
WHERE ((avg_fragmentation_in_percent > 10
AND avg_fragmentation_in_percent < 15) -- Logical fragmentation
OR (avg_page_space_used_in_percent < 75
AND avg_page_space_used_in_percent > 60)) --Page density
AND page_count > 8 -- We do not want indexes less than 1 extent in size
AND index_id NOT IN (0) --Only clustered and nonclustered indexes

--Rebuild the following indexes in the AdventureWorks database
USE AdventureWorks
GO

SELECT OBJECT_NAME([object_id]) AS 'Table Name',
index_id AS 'Index ID'
FROM sys.dm_db_index_physical_stats (DB_ID('AdventureWorks')
,NULL -- NULL to view all tables
,NULL -- NULL to view all indexes; otherwise, input index number
,NULL -- NULL to view all partitions of an index
,'DETAILED') --We want all information
WHERE ((avg_fragmentation_in_percent > 15) -- Logical fragmentation
OR (avg_page_space_used_in_percent < 60)) --Page density
AND page_count > 8 -- We do not want indexes less than 1 extent in size
AND index_id NOT IN (0) --Only clustered and nonclustered indexes
Es wäre einfach, die Ergebnisse der Abfragen in einer Tabellenvariablen zu speichern und dann die Tabellenvariable zu durchlaufen, um eine dynamische Zeichenfolge für die richtige ALTER INDEX-Anweisung zu erstellen (siehe Abbildung 2).
Figure 2 Erstellen einer dynamischen ALTER INDEX-Zeichenfolge (Close Figure 2)
--Rebuild the following indexes in the AdventureWorks database
USE AdventureWorks
GO

--Table to hold results
DECLARE @tablevar TABLE(lngid INT IDENTITY(1,1), objectid INT,
index_id INT)

INSERT INTO @tablevar (objectid, index_id)
SELECT [object_id],index_id
FROM sys.dm_db_index_physical_stats (DB_ID('AdventureWorks')
,NULL -- NULL to view all tables
,NULL -- NULL to view all indexes; otherwise, input index number
,NULL -- NULL to view all partitions of an index
,'DETAILED') --We want all information
WHERE ((avg_fragmentation_in_percent > 15) -- Logical fragmentation
OR (avg_page_space_used_in_percent < 60)) --Page density
AND page_count > 8 -- We do not want indexes less than 1 extent in size
AND index_id NOT IN (0) --Only clustered and nonclustered indexes

SELECT 'ALTER INDEX ' + ind.[name] + ' ON ' + sc.[name] + '.'
+ OBJECT_NAME(objectid) + ' REBUILD'
FROM @tablevar tv
INNER JOIN sys.indexes ind
ON tv.objectid = ind.[object_id]
AND tv.index_id = ind.index_id
INNER JOIN sys.objects ob
ON tv.objectid = ob.[object_id]
INNER JOIN sys.schemas sc
ON sc.schema_id = ob.schema_id

Indexnutzung
Während sys.dm_db_index_physical_stats ein leistungsfähiger Ersatz für DBCC SHOWCONTIG ist und helfen kann, den Zustand eines Index zu offenbaren, werden Sie häufig mit einem komplexeren Problem konfrontiert, wenn bestimmt werden soll, welche Indizes nützlich für Abfragen sind, die für eine Tabelle ausgeführt werden sollen. Oft erstellen Datenbankentwickler oder Administratoren Indizes für eine Tabelle, die ihrer Meinung nach vom Abfrageoptimierer während der Ausführung einer Abfrage verwendet werden. Bei früheren Veröffentlichungen von SQL Server war es viel schwieriger zu wissen, ob diese Indizes tatsächlich verwendet wurden. Man musste den Index entweder löschen, um zu sehen, ob sich dies auf die Leistung der Abfragen auswirkte, oder die Ausführungspläne der Abfragen aufzeichnen und die Nutzung des Index überprüfen.
Es gibt eine neue dynamische Verwaltungsansicht (sys.dm_db_index_usage_stats), mit deren Hilfe man leicht erkennen kann, wie Indizes vom Abfrageoptimierer genutzt werden und welche Abfragen für die Tabelle ausgeführt werden. Diese Ansicht kann untersucht werden, um die Nützlichkeit eines Index zu bestimmen, sodass Sie Indizes löschen können, die vom Abfrageoptimierer nicht verwendet werden. Sie müssen sich keine Gedanken mehr machen, dass ein Index einfach Speicherplatz verschwendet oder dass die Wartung unbenutzter Indizes die Datenbankleistung einschränkt.
Durch Untersuchen der Ausgabe dieser DMV für Indizes mit null Suchvorgängen und Scans können Sie bestimmen, ob ein Index verwendet wurde, seit SQL Server das letzte Mal gestartet wurde. Doch bedenken Sie, dass viele DMVs und DMFs nicht beibehalten werden und sich selbst auf Null zurücksetzen, wenn SQL Server neu gestartet wird. Ziehen Sie dies bei der Verwendung einer DMV oder DMF in Betracht, um die Nutzung eines Index zu ermitteln. Der Index wurde seit dem letzten Neustart des Diensts möglicherweise nicht gebraucht, ist jedoch für Berichtsabfragen am Wochen-, Monats- oder Quartalsende erforderlich.
Um alle Indizes in einer Instanz anzuzeigen, die seit dem letzten Neustart des SQL Server-Diensts nicht verwendet wurden, können Sie folgende Anweisung verwenden:
SELECT DB_NAME(database_id),OBJECT_NAME([object_id])
FROM sys.dm_db_index_usage_stats
WHERE user_seeks = 0
AND user_scans = 0
AND user_lookups = 0
AND system_seeks = 0
AND system_scans = 0
AND system_lookups = 0

Indexbetriebsabläufe
Wenn Sie die Betriebsabläufe Ihrer Indizes verstehen wollen, ist die DMF sys.dm_db_index_operational_stats sehr nützlich. Sie können sie zur Anzeige der E/A-, Sperr-, Latch- und Zugriffsmethodenaktivität eines jeden Index in einer Datenbank verwenden, sodass Sie besser verstehen, wie Ihre Indizes verwendet werden, und Indexsperrprobleme aufgrund umfangreicher E/A-Aktivität oder das Vorhandensein eines „Gefahrenherds“ im Index diagnostiziert werden können.
Verwenden Sie die Latchwartezeitspalten dieser DMF zum Bestimmen der Zeit, die READ- und WRITE-Vorgänge brauchen, um Zugang zu den Ressourcen eines Index zu erhalten. Damit lässt sich einfacher bestimmen, ob das zum Speichern des Index verwendete Datenträgersubsystem für die E/A-Aktivitäten des Index ausreicht. Dies kann auch anzeigen, ob durch Entwurf und Nutzung des Index ein Gefahrenherd eingeführt wurde, sodass es durch umfangreiche Aktivitäten auf einer oder mehreren Seiten eines Index zu Konflikten für die auf diesen Seiten enthaltenen Daten kommt. Solche Konflikte führen oft zu übermäßigen Blockierungen der READ- oder WRITE-Vorgänge in diesem Bereich.
Abbildung 3 stellt dar, wie Sie die Sperr- und E/A-Muster für alle Indizes in der Tabelle AdventureWorks.HumanResources.Employee bestimmen können.
Figure 3 Bestimmen von Sperr- und E/A-Mustern (Close Figure 3)
SELECT page_latch_wait_count --page latch counts
,page_latch_wait_in_ms --page latch wait times
,row_lock_wait_in_ms --row lock wait times
,page_lock_wait_in_ms --page lock wait times
,row_lock_count --row lock counts
,page_lock_count --page lock counts
,page_io_latch_wait_count --I/O wait counts
,page_io_latch_wait_in_ms --I/O wait times
FROM sys.dm_db_index_operational_stats (DB_ID('AdventureWorks')
,OBJECT_ID('HumanResources.Employee')
,NULL -- NULL to view all indexes; otherwise, input index number
,NULL -- NULL to view all partitions of an index
)

Weitere Informationen
Die in diesem Artikel vorgestellten DMVs und DMFs können neben den hier beschriebenen zu vielen Zwecken eingesetzt werden. Nehmen Sie sich die Zeit, die SQL Server-Onlinedokumentation zu lesen, die die in der Randleiste „Weitere Ressourcen“ aufgeführten Funktionen und Ansichten beschreibt, um die Bandbreite der Informationen kennen zu lernen, die mit ihnen zurückgegeben und untersucht werden können.
Informationen zu zusätzlichen Index-DMFs und -DMVs, die in diesem Artikel nicht erörtert werden, finden Sie im Blog des SQL Server-Teams für die Abfrageoptimierung unter blogs.msdn.com/queryoptteam/570176.aspx.
Weitere Ressourcen
  • sys.dm_db_index_physical_stats
  • sys.dm_db_index_usage_stats
  • sys.dm_db_index_operational_stats

Randy Dyess ist Mentor bei Solid Quality Learning, wo er sich auf SQL Server OLTP-Systeme spezialisiert hat. Randy ist Autor zahlreicher Bücher und Artikel über SQL Server. Er ist Gründer und Hauptautor von www.TransactSQL.Com und www.Database-Security.Info.
© 2007 Microsoft Corporation und CMP Media, LLC. Alle Rechte vorbehalten. Die nicht genehmigte teilweise oder vollständige Vervielfältigung ist nicht zulässig.


 SQL Server: Hohe Verf&#252;gbarkeit f&#252;r SQL&#160;Server
SQL Server Zach Nichter

Hohe Verfügbarkeit für SQL Server
Kurz zusammengefasst:
  • Spiegelung
  • Datenbanksnapshots
  • Protokollversand
  • Clusterbildung
  • Replikation
Laden Sie den Code für diesen Artikel herunter: NichterHA2007_03.exe (151KB)

Hohe Verfügbarkeit ist ein Begriff, den jeder Datenbankadministrator verstehen sollte. Er bezieht sich auf die Reaktionsfähigkeit und die Verfügbarkeit eines Systems. Hohe Verfügbarkeit kann in einigen Situationen eine in Sekunden gemessene Antwortzeit bezeichnen, in anderen Situationen ist jedoch die Angabe einer Antwortzeit in

Bruchteilen einer Sekunde erforderlich. Während meiner Beratertätigkeit in einem Unternehmen war die Angabe von Roundtrip-Antwortzeiten für SQL-Abfragen in Millisekunden erforderlich. Wenn die Antwort diese Beschränkung überschritt, wurde das Datenbanksystem als inaktiv betrachtet, und der Webserver stellte eine Verbindung zum nächsten verfügbaren Datenbankserver her.
Heutzutage werden immer schnellere Anwendungen gefordert. Wenn Sie über ein umfangreiches Wissen über hohe Verfügbarkeit und schnelle Antwortzeiten verfügen, werden Sie auch in Zukunft in der Lage sein, datenabhängige Anwendungen genau zu planen.
Glücklicherweise besitzt SQL Server™ 2005 eine Anzahl von Optionen, mit denen die Verfügbarkeit, einschließlich Replikation, Clusterbildung, Datenbankspiegelungen, Datenbanksnapshots und Datenbankprotokollversand, verbessert werden kann. In den folgenden Ausführungen werden diese Features genauer betrachtet. Darüber hinaus erhalten Sie Entscheidungshilfen, mit denen Sie die für Ihre Umgebung geeigneten Features auswählen können. Betrachten Sie Abbildung 1. Hier werden die Verfügbarkeitsoptionen in SQL Server 2005 beschrieben.
Figure 1 Optionen für hohe Verfügbarkeit (Close Figure 1)

Technologieattribute | Replikation | Datenbankspiegelung | Clusterbildung | Datenbanksnapshots | Protokollversand
Option für hohe Verfügbarkeit |  |  |  |  |
Tolerieren hoher Transaktionsanforderungen |  |  |  |  |
Datenverfügbarkeit in Echtzeit |  |  |  |  |
Schreibgeschütztes Datenabbild |  |  |  |  |
Eindeutige Hardwarekonfiguration |  |  |  |  |
Geringe Kosten |  |  |  |  |
Datenwiederherstellung möglich |  |  |  |  |
Automatisches Failover |  |  |  |  |
Möglicherweise komplexe Implementierung/Verwaltung |  |  |  |  |
Mögliche Leistungseinschränkungen |  |  |  |  |

Definieren hoher Verfügbarkeit
Eines Ihrer ersten Ziele beim Planen einer Anwendung mit hoher Verfügbarkeit besteht darin, zu definieren, was dies für Ihre spezielle Umgebung bedeutet. Für einige Organisationen bedeutet hohe Verfügbarkeit das Vorhandensein von mit der Produktionshardware vergleichbarer redundanter Hardware. Dabei müssen die Daten sowie die Hardware eine Betriebszeit und Verfügbarkeit von 99,995 Prozent oder mehr haben. Andere Organisationen beziehen den Begriff möglicherweise nur auf die hohe Verfügbarkeit von Daten. Für sie steht die Leistung auf Produktionsebene im Falle eines erforderlichen Failovers im Hintergrund. Wenn Sie die richtige Lösung für Ihre Situation bestimmen möchten, müssen Sie den Begriff der hohen Verfügbarkeit definieren.
Darüber hinaus ist es erforderlich, dass Sie die Arten möglicherweise eintretender Ausfälle identifizieren und deren Auswirkungen auf Ihre Vereinbarungen zum Servicelevel (Service Level Agreement, SLA) angeben. Zu den Ausfällen, die Ihre Verfügbarkeit betreffen können, gehören geplante und nicht geplante Ausfälle sowie eine herabgesetzte Leistung.
Bei einem geplanten Ausfall handelt es sich in der Regel um ein geplantes Wartungsfenster, über das die Benutzer im Voraus informiert werden. Ein ungeplanter Ausfall ist normalerweise das Ergebnis eines Hardware- oder Softwarefehlers, infolge dessen auf Ihre Daten nicht mehr zugegriffen werden kann. Eine Leistungsbeeinträchtigung kann ebenso Ausfälle verursachen und wird häufig in Endbenutzerantwortzeit gemessen. Diese wird gewöhnlich im Voraus vom Unternehmen sowie von der IT-Organisation in einer bestimmten Form des SLA festgelegt.
Neben dem Identifizieren von potenziellen Quellen für Ausfälle müssen Sie die Aktivitätsstufe Ihrer Daten bestimmen. Legen Sie dabei fest, ob sie immer online sein müssen oder gelegentlich z. B. auch offline sein können. Darüber hinaus muss die Entscheidung gefällt werden, ob die Verfügbarkeitsoption den gleichen geografischen Ort oder einen Remotestandort betreffen. Budgeteinschränkungen spielen wahrscheinlich für Ihre Entscheidung auch eine Rolle. Im Folgenden wird jede Verfügbarkeitsoption erläutert.

Datenbankspiegelung
Bevor die Datenbankspiegelung eingehend besprochen wird, sollen einige Begriffe definiert werden.
Der Prinzipal ist der primäre Produktionsserver, auf dem die Datenbank untergebracht ist, die die Transaktionsprotokolle kontinuierlich an den Spiegelserver und die Datenbank sendet.
Der Spiegel ist der sekundäre Server, auf dem die Sicherungskopie der Datenbank gespeichert ist. Die Spiegelkopie wird mit der Prinzipaldatenbank einheitlich synchronisiert.
Die Rolle gibt den Zweck des bestimmten Servers an, d. h. ob er als Prinzipal oder Spiegel dient.
Der Zeuge stellt die Instanz dar, die den Prinzipal und die Spiegelserver überwacht, während sie ihre Aufgaben durchführen. Er kann ein automatisches Failover initiieren.
Ein Partner kann entweder der Prinzipalserver oder der Spiegelserver sein.
In einer typischen Umgebung wird die Prinzipaldatenbank auf der Prinzipalinstanz gesichert, und die Sicherung wird auf der Spiegelinstanz wiederhergestellt (siehe Abbildung 2). Nachdem die Datenbank wiederhergestellt wurde, muss die Spiegelung auf dem Prinzipalserver entweder mithilfe des Eigenschaftenfensters der Prinzipaldatenbank in SQL Server Management Studio (SMSS) oder mithilfe von T-SQL-Skripts eingerichtet werden.
Abbildung 2 Datenbankspiegelungsarchitektur
Abbildung 2 Datenbankspiegelungsarchitektur (Klicken Sie zum Verkleinern auf das Bild)
Abbildung 2 Datenbankspiegelungsarchitektur
Abbildung 2 Datenbankspiegelungsarchitektur (Klicken Sie zum Vergrößern auf das Bild)
Nachdem die Spiegelung konfiguriert und die Spiegelungssitzung eingerichtet wurde, werden der Prinzipal und die gespiegelten Datenbanken synchronisiert. Die Prinzipaldatenbank sendet anschließend ihr Transaktionsprotokoll der Ereignisse, die seit der letzten Anwendung der Sicherung auf den Spiegel aufgetreten sind. Der Spiegel erhält das Protokoll und versucht, es so schnell wie möglich anzuwenden. Wenn Sie SQL Server 2005 Enterprise Edition verwenden, handelt es sich um einen Multithreadprozess, ansonsten ist es ein Singlethreadvorgang. Sobald diese Protokolle auf den Spiegel angewendet wurden, werden die Datenbanken als synchronisiert betrachtet und bleiben synchronisiert, bis die gespiegelte Sitzung unterbrochen wird.
Während Clients neue Transaktionen ausführen, führt der Prinzipalserver die Transaktionen anhand der Prinzipaldatenbank aus. Dabei sendet er die Transaktionsprotokolldatensätze aus der Prinzipaldatenbank an das Wiederherstellungsprotokoll (bzw. an die Protokollwarteschlangen) der gespiegelten Datenbank. Hier wird es übernommen und auf die gespiegelte Datenbank angewendet. Nachdem die Transaktion angewendet und auf die Spiegeldatenbank übertragen wurde, wird an den Prinzipal eine Antwort mit der Nachricht gesendet, dass die Transaktion auf den Spiegel übertragen wurde. Der Prinzipal bestätigt erst weitere Transaktionen, die möglicherweise im System ankommen, wenn die Bestätigung vom Spiegel eingegangen ist.
Falls ein Fehler auftritt, kann der Spiegel einen Autofehler initiieren. Der Zeuge unterstützt dabei den Prozess, indem er bestimmt, ob die Prinzipaldatenbank verfügbar ist. Sobald ein Fehler auftritt, muss der aktuelle Spiegelpartner definiert werden, bevor er wieder Prinzipalpartner werden kann. Nachdem die Probleme mit dem Spiegelpartner gelöst wurden, wird die Verschiebung zurück auf den Spiegelpartnerserver initiiert, und die Datenbanken werden wieder synchronisiert. Sobald sie synchronisiert sind, kann die Spiegelungssitzung erneut beginnen.
Dieser spezielle Spiegelungsmodus ist ein Hochsicherheitsmodus, der synchrone Transaktionsvorgänge bietet, indem Transaktionssicherheit aktiviert wird. Es ist jedoch kein Zeuge erforderlich, weil das automatische Failover nicht genutzt wird. Alle Failovers werden manuell initiiert. Ein weiterer Spiegelungsmodus bietet synchrone Transaktionsvorgänge: der Modus für hohe Verfügbarkeit. Er erfordert nicht nur eine aktivierte Transaktionssicherheit, sondern auch, dass im Fall eines Fehlers ein Zeuge für das automatische Failover verwendet wird.
Der dritte und letzte für die Spiegelung verfügbare Modus ist der Modus für hohe Leistung. Im diesem Modus muss die Transaktionssicherheit deaktiviert werden, wodurch die asynchrone Betriebsunterstützung zugelassen wird. Dies wiederum ermöglicht die Übertragung der Transaktionen auf den Prinzipalpartner, ohne dass darauf gewartet werden muss, bis der Transaktionsdatensatz auf den Spiegel geschrieben wurde. Der Modus für hohe Leistung benötigt in der Konfiguration keinen Zeugen.
Beachten Sie, dass die Spiegelung die gleiche Version von SQL Server auf dem Prinzipal und auf dem Spiegel benötigt. Für den Zeugen kann jedoch SQL Server Express Edition verwendet werden. Darüber hinaus ist es wichtig, dass sich die Prinzipaldatenbank im vollständigen Wiederherstellungsmodus befindet.
ADO.NET 2.0 ist in SQL Server 2005 integriert und enthält Unterstützung für die Datenbankspiegelung. Des Weiteren wird ein transparentes Failover für die Anwendung zur gespiegelten Umgebung zur Verfügung gestellt. Dadurch erhält die ADO.NET-Anwendung eine Methode für ein automatisches Failover ohne zusätzliche Codierung oder Konfiguration, wenn eine Verbindung zur Prinzipaldatenbank nicht hergestellt werden kann. Die Konfiguration ist so einfach wie die Angabe eines gemeinsamen Benutzers für die beiden Umgebungen und des Failoverpartners in der Verbindungszeichenfolge. Hier sehen Sie ein Beispiel für eine ADO.NET-Verbindungszeichenfolge, die den Failoverpartner für die gespiegelte Datenbankumgebung identifiziert:
"Provider=SQLNCLI.1;Data Source=MirrorDB;Failover Partner=SQL03;
 Initial Catalog=AdventureWorks;
Persist Security Info=True;User ID=TestUser; Password=TestPswd; Pooling=True;
Connect Timeout=5;Application Name=ADOMirrorTest"
Die Datenbankspiegelung kann je nach Anwendung und Datenanforderungen für Ihr Unternehmen eine geeignete Option sein. Sie sollten jedoch ein paar Dinge beachten, um eine optimale Leistung sicherzustellen. Sie sollten zum Beispiel überlegen, wie hoch die Transaktionsrate des Systems oder die Menge der Datenänderung ist. Wenn Sie Datenbankspiegelungen einsetzen möchten, muss eine ausreichende Bandbreite und Netzwerkgeschwindigkeit gewährleistet sein, um die Datenmengen und die Transaktionsverarbeitungsrate bewältigen zu können. Bedenken Sie auch die Sättigung der Verbindung. Dies ist besonders wichtig, wenn sich der Spiegel an einem anderen geografischen Ort befindet. Darüber hinaus ist es wichtig, Ihr System im Voraus zu überwachen, um festzustellen, ob Einschränkungen in der Umgebung eine effiziente Spiegelung verhindern könnten.
Eine Datenbankspiegelung ist besonders geeignet, wenn es darum geht, die Kosten gering zu halten. Die Datenbankspiegelungsarchitektur benötigt für die Ausführung der Umgebung weder freigegebene Datenträger noch erweiterte oder spezielle Fähigkeiten. Im Gegensatz zur Clusterbildung ist es für die Datenbankspiegelung nicht erforderlich, dass die beiden Partner die gleiche Hardware besitzen. Des Weiteren gestaltet sich die Überwachung mithilfe des Setup-Assistenten als überaus einfach. Sie können darauf im Eigenschaftenfenster der Datenbank auf der Spiegelungsregisterkarte zugreifen (siehe Abbildung 3). Das Whitepaper „Database Mirroring Best Practices and Performance Considerations“ (auf Englisch) unter go.microsoft.com/fwlink/?LinkId=80897 enthält weitere nützliche Informationen.
Abbildung 3 Setup-Assistent für die Spiegelung
Abbildung 3 Setup-Assistent für die Spiegelung (Klicken Sie zum Verkleinern auf das Bild)
Abbildung 3 Setup-Assistent für die Spiegelung
Abbildung 3 Setup-Assistent für die Spiegelung (Klicken Sie zum Vergrößern auf das Bild)

Datenbanksnapshots
Bei den Datenbanksnapshots handelt es sich um eine in SQL Server 2005 Enterprise Edition integrierte neue Technologie, die jedoch nicht als Option für hohe Verfügbarkeit betrachtet wird. Datenbanksnapshots sollten als Wiederherstellungsoption oder in Kombination mit anderen Technologien als geeignete Berichtsoption verwendet werden. Ein Snapshot ist einfach eine schreibgeschützte Ansicht einer Datenbank zu einem bestimmten Zeitpunkt.
Ein Snapshot wird mithilfe eines CREATE DATABASE-Befehls folgendermaßen erstellt:
CREATE DATABASE SnapDB_20061028_2030 ON
(NAME = SnapDB_Data, FILENAME =
    'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\SnapDB_20061028_2030.snp')
AS SNAPSHOT OF SnapDB;
GO
Wenn der Datenbanksnapshot erstellt ist, verwendet er eine oder mehrere Dateien mit geringer Dichte anstelle der in einer Datenbank gewöhnlich verwendeten Datendateien. Diese Dateien mit geringer Dichte sind hauptsächlich virtuelle Speicherorte, die anfänglich keine Daten verbrauchen. Sie werden nur zum Speichern von Daten verwendet, wenn die Daten in der Quelldatenbank geändert oder gelöscht wurden. Die Daten werden in die Dateien mit geringer Dichte seitenweise geschrieben. Der tatsächliche Datenbanksnapshot zeigt dabei nur die Daten an, die seit dem Erstellen des Snapshots geändert wurden. Die restlichen Daten werden aus den Datenseiten der Quelldatenbank abgerufen.
Den Datenbanksnapshotdateien wird die Datenbankgröße zugeordnet, wenn der Snapshot erstellt wird. Die zugeordnete Größe sagt nicht viel über die tatsächlich enthaltene Datenmenge aus. Um diese Informationen abzurufen, führen Sie eine T-SQL-Anweisung wie die folgende aus:
SELECT *
FROM fn_virtualfilestats(DB_ID(N'SnapDB_20061028_
    2030'), 1);
GO

Aufgrund der Methode, mit der Daten beim Zugriff auf den Datenbanksnapshot in den Dateien mit geringer Dichte sowie in der Datenbank gespeichert werden, werden die Datenseiten in den ursprünglichen Datenbankdatendateien und -datenseiten aus den Dateien mit geringer Dichte des Snapshots wiederhergestellt. Snapshots können nur auf dem Server mit der Quelldatenbank existieren, aus der der Snapshot entnommen wurde, da Datenseiten gemeinsam verwendet werden müssen. Snapshots stellen keine gültige sinnvolle Berichtsoption dar, da diese Architektur keine E/A-Vorgänge in der Quelldatenbank verhindert und somit nicht der korrekte Status der Datenbank dargestellt wird.
Stellen Sie sich ein Szenario vor, in dem die Datenbankspiegelung zusammen mit Snapshots verwendet wird. Dadurch können die Berichtsdaten, der Spiegel und die Snapshotdatenbanken physisch von der Prinzipaldatenbank getrennt werden. Der Datenbanksnapshot wird mithilfe von SQL Server Agent und eines benutzerdefinierten Skripts geplant, um aktualisierte Snapshots in regelmäßigen Abständen bereitzustellen. Das Beispielskript in Abbildung 4 zeigt die gespeicherte Prozedur, die hierfür verwendet wird. Sie wird in einem Job verwendet, um das Erstellen und Löschen von Snapshots für eine bestimmte Datenbank in Ihrer Umgebung zu verwalten. Dies würde eine akzeptable Lösung für die Berichterstellung ermöglichen, weil die Berichtsdaten von den Produktionsdaten getrennt würden.
Figure 4 Gespeicherte Prozeduren zum Planen von Snapshots (Close Figure 4)
use msdb;
GO
set nocount on
GO

CREATE PROCEDURE usp_snaprefresh
     @database    sysname = NULL    --name of the database to snapshot
    ,@keepsnap    int        = 24   --# of hours to keep a snapshot
                                    --after it was created
                                    --use a value of '0' to keep all
                                    --existing snapshots
    ,@fileloc    sysname            --location for snapshot
        = 'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\'
AS

DECLARE
     @dt            datetime        ,@cnt          int
    ,@databaseid    int             ,@snap         sysname
    ,@sql           nvarchar(1000)  ,@yy           varchar(4)
    ,@mm            varchar(2)      ,@dd           varchar(2)
    ,@h             varchar(2)      ,@m            varchar(2)
    ,@lname         sysname         ,@pname        sysname
    ,@file          sysname         ,@pos1         int
    ,@pos2          int

-- initialize variables
SELECT
     @dt = getdate()
    ,@cnt = 0, @pos1 = 0, @pos2 = 0
    ,@databaseid = db_id(@database)

-- check if valid database was provided
IF @databaseid IS NULL
BEGIN
    RAISERROR ('Missing database name. Rerun the procedure specifying a
       valid database name.',16,1)
    RETURN (0)
END

--determine if snapshots should be kept
IF @keepsnap <> 0
BEGIN
    -- determine if other snapshots exist for this server older than @
    -- keepsnap value hrs
    SELECT ROW_NUMBER() OVER(ORDER BY name DESC) AS [RowNum],
        name INTO #t1
    FROM master.sys.databases
    WHERE source_database_id = @databaseid
        AND create_date < dateadd(hh,-(@keepsnap),getdate())

    IF (SELECT max(RowNum) FROM #t1 where name is not null) > 0
    BEGIN
        WHILE @cnt <= (SELECT max(RowNum) FROM #t1)
        BEGIN
            SELECT @snap = name FROM #t1 WHERE RowNum = @cnt

            PRINT 'Dropping snapshot ''' + @snap + ''''

            SET @sql = 'DROP DATABASE ' + @snap

            EXEC(@sql)
            SELECT @cnt = @cnt + 1
        END
    END
END

-- break apart point in time date time information for file name
SELECT @yy = convert(varchar(4),year(@dt)),@mm = convert(varchar(2),
   month(@dt))
    ,@dd = convert(varchar(2), day(@dt)),@h = convert(varchar(2),
         datepart(hh,@dt))
    ,@m = convert(varchar(2), datepart(mi,@dt))

-- piece together the database snapshot name and the file name
SELECT @file = @database + '_' + @yy + @mm + @dd + '_' + @h + @m

-- identify logical file name of primary data file
SET @sql = 'SELECT name INTO tempdb..t1
FROM ' + @database + '.sys.database_files
WHERE file_id = 1'

EXEC(@sql)

--setting logical filename for the snap
SELECT @lname = name FROM tempdb..t1

-- making sure the file location ends with '\'
IF substring(@fileloc, len(@fileloc), 1) <> '\'
BEGIN
    SET @fileloc = @fileloc + '\'
END

-- build sql statement to be run
SET @sql = N'CREATE DATABASE ' + @file + ' ON
(NAME = ' + @lname + ', FILENAME = ''' + @fileloc + @file + '.snp'')
AS SNAPSHOT OF ' + @database

EXEC(@sql)

-- cleanup
DROP TABLE tempdb..t1;
GO
Beachten Sie jedoch, dass die Datenbanksnapshots als temporär betrachtet werden, da Snapshots weder gesichert werden können noch ohne ihre Quelldatenbank existieren können. Wenn einer Datei mit geringer Dichte nicht genügend Speicherplatz zur Verfügung steht, wird der Snapshot als beschädigt betrachtet und muss gelöscht werden.
Außerdem kann die Systemleistung durch Datenbanksnapshots während der Durchführung von Datenänderungsvorgängen in der Quelldatenbank herabgesetzt werden, weil die Datenseiten für jeden Snapshot aus den Quelldatenbankdateien in die Datei mit geringer Dichte geschrieben werden. Dadurch wird die Anzahl der Schreibvorgänge um die Anzahl der in der Datenbank vorhandenen Snapshots vervielfacht.
Leseberechtigungen werden von der Quelldatenbank zum Zeitpunkt des Snapshots definiert und können nicht geändert werden. Der Snapshot muss sich in der gleichen Instanz wie die Quelldatenbank befinden, weil sie dieselben Datenseiten sowie denselben Puffercache verwenden.
Es empfiehlt sich, Snapshots nur dann als Berichterstellungslösung zu verwenden, wenn Sie auch eine Spiegelung verwenden. Andernfalls kann Ihre Umgebung nicht von einer Leistungssteigerung profitieren. Datenbanksnapshots stellen möglicherweise die schnellste Methode dar, Daten vor der Ausführung eines fragwürdigen Vorgangs auf einem System beizubehalten. Eine Datenbank kann im ursprünglichen Zustand des Snapshots wiederhergestellt werden, oder die Daten können dem Snapshot entnommen werden, um die Daten in der Quelldatenbank zu ersetzen.
Sie müssen einen Benennungsstandard für die Snapshotdatenbanken festlegen. Der hier verwendete Standard lautet „ursprünglicherDatenbankname_Datum_Zeit.snp“. Zuerst wird die Quelldatenbank angegeben, dann der Tag und die Zeit (im 24-Stundenformat) der Snapshotaufnahme.

Protokollversand
Der Protokollversand stellt eine beschränkte Option für hohe Verfügbarkeit dar, die Sicherungen und Wiederherstellungen verwendet, um eine kostengünstige Lösung einzurichten. Der Protokollversand nutzt Transaktionsprotokollsicherungen in geplanten Intervallen, um die Aktualität einer sekundären Datenbank zu gewährleisten.
In SQL Server 2005 verwendet der Protokollversand Assistenten, die durch den Prozess des Setups, der Planung, der Initialisierung und der Überwachung führen (siehe Abbildung 5). Der Prozess ist einfach und kann in wenigen Minuten abgeschlossen werden.
Abbildung 5 Protokollversand-Setup-Assistent
Abbildung 5 Protokollversand-Setup-Assistent (Klicken Sie zum Verkleinern auf das Bild)
Abbildung 5 Protokollversand-Setup-Assistent
Abbildung 5 Protokollversand-Setup-Assistent (Klicken Sie zum Vergrößern auf das Bild)

Nachdem die primäre Datenbank identifiziert wurde, werden ein Zeitplan erstellt und das Dateialter für Sicherungsdateien festgelegt. Als Nächstes müssen die Dateifreigaben für die Sicherungsdateien eingerichtet werden. Nachdem die Dateifreigaben eingerichtet wurden, muss der sekundäre Speicherort der Datenbank eingerichtet werden. Darüber hinaus ist die Datenbank durch Abschließen einer Wiederherstellung der primären Datenbank zu initialisieren. Schließlich müssen Sie die Zeitpläne für die Sicherungsdateikopien und die Wiederherstellungen der Transaktionsprotokollsicherungen zusammen mit allen Warnungen oder Verzögerungen festlegen, die für jeden Schritt benötigt werden.
Sobald das Setup abgeschlossen wurde, sichert der Protokollversand regelmäßig das Transaktionsprotokoll einer Datenbank auf einem freigegebenen Netzwerkspeicherort. Nachdem die Dateien an die Freigabe gesendet wurden, wird die Sicherung nach einem festen Zeitplan auf die sekundäre Datenbank angewendet.
Der Protokollversand funktioniert wegen seiner Einfachheit in vielen Situationen. Er stellt eine gute Option für hohe Verfügbarkeit dar, die preiswert ist und für ein System mit hoher Transaktion geeignet ist. Die beim Protokollversand eingesetzte sekundäre Datenbank kann nur im schreibgeschützten Modus verwendet werden. Dadurch ist sie für eine Berichtsdatenbank nützlich. Der Protokollversand benötigt nur einen minimalen Mehraufwand. Er braucht jedoch eine Warnungsrichtlinie, falls Behandlungsfehler auftreten.
Falls Sie den Protokollversand für Ihre Umgebung in Betracht ziehen, denken Sie an die Vorteile wie einfaches Setup und einfache Verwaltung. Beachten Sie auch, dass wenige oder keine speziellen Fähigkeiten erforderlich sind. Der Protokollversand stellt keine Echtzeitlösung für hohe Verfügbarkeit dar, auch wenn er zu diesem Zweck mit der Datenbankspiegelung kombiniert werden kann. Er wird von Zeitplänen sowie von Vorgängen wie Sicherungen, Dateikopien und Wiederherstellungen begrenzt. Er erfordert zudem ein manuelles Failover. Aus diesen Gründen stellt der Protokollversand eine einfache Lösung für Umgebungen bereit, in denen keine hohen Zeitanforderungen bestehen.

SQL Server-Clusterbildung
Serverclusterbildung funktioniert auf Betriebssystemebene und beinhaltet Hardwareduplikate sowie freigegebene Datenträgerressourcen, auf die der Cluster zugreifen kann. Die Clusterbildung beeinträchtigt das Verhalten der Endbenutzer möglicherweise am wenigsten, ist jedoch wahrscheinlich auch die teuerste Methode. Es benötigt mindestens die doppelte Menge an Hardware im Vergleich zu einer nicht gruppierten Instanz.
Das Thema Clusterbildung ist sehr umfangreich. Deshalb soll im Folgenden auf eine Erläuterung aller Einzelheiten verzichtet und eine allgemeine Übersicht vermittelt werden. Die Clusterbildung benötigt zwei oder mehr Server, die unter der gleichen Version von Windows® 2000 Advanced Edition oder Datacenter Edition bzw. unter Windows Server® 2003 Enterprise Edition oder Datacenter Edition installiert werden müssen. Darüber hinaus ist die Installation von Microsoft® Cluster Services (MSCS) erforderlich. Diese Dienste regeln die Besitzrechte freigegebener Ressourcen zwischen Servern und verwalten IP-Adressen, freigegebene Datenträger sowie Netzwerknamen. Die Clusterbildung benötigt zudem eine freigegebene Datenträgerressource, gewöhnlich in Form eines Storage Area Network (SAN) oder eines SCSI-angeschlossenen Speichers.
Eine SQL Server-Instanz wird auch als Ressource betrachtet, und sowohl Standard Edition als auch Enterprise Edition von SQL Server 2005 können in einer Clusterkonfiguration installiert werden. Unter „Feature Comparison Chart for SQL Server 2005“ (auf Englisch) (microsoft.com/sql/prodinfo/features/compare-features.mspx) finden Sie eine Liste der von beiden Versionen von SQL Server 2005 unterstützten Features.
Sobald die Ressourcen auf dem Cluster eingerichtet wurden, kommuniziert der sekundäre Knoten des Clusters regelmäßig mit dem primären Knoten des Clusters. Dies erfolgt über einen Takt, der in einem privaten Netzwerk zwischen den beiden Knoten des Clusters eingerichtet wurde. Der Takt ist ein Intervallprüfpunkt, mit dem bestimmt wird, ob der primäre Knoten Fehler enthält.
Falls der primäre Knoten fehlerhaft ist, werden die Ressourcen auf den sekundären Knoten verschoben, während der Status des logischen Servers nicht verändert wird. Dadurch können die Clients ihre Arbeit nur mit einer Pause in der Interaktion fortsetzen. Der ganze Failoverprozess kann zwischen 5 Sekunden und 30 Sekunden lang sein, in einigen Fällen noch länger. Die Dauer hängt von der Hardware, der Software und den am Cluster beteiligten Netzwerkkomponenten ab.
Die Clusterbildung kann eine teure und komplexe Technologie darstellen, deren Fehler im System nur unter Zuhilfenahme spezieller Fähigkeiten aufgelöst werden können. Es stellt jedoch von allen automatischen Failoveroptionen für Endnutzer das reibungsloseste Failover zur Verfügung. Jede Anwendung ist anders. Einige sind möglicherweise nicht für Cluster geeignet, was im schlimmsten Fall dazu führen kann, dass die Anwendung eine neue Verbindung herstellen muss.

Replikation
Eine SQL Server 2005-Replikation kann ebenfalls in Architekturen für hohe Verfügbarkeit verwendet werden. Es stehen vier Replikationstypen zur Verfügung: Snapshot, Transaktion, Peer-to-Peer und Merge. Peer-to-Peer ist tatsächlich nur eine Form der Transaktionsreplikation. Aus diesem Grund soll an dieser Stelle nicht weiter darauf eingegangen werden.
Mithilfe der Replikation erhalten Sie die Möglichkeit, zum Zwecke der hohen Verfügbarkeit einen sekundären Standort und eine sekundäre Datenbank einzurichten, die die gleiche Funktionalität wie die primäre Datenbank besitzt. Hierfür können Sie die Mergereplikation verwenden. Sie entnimmt der primären sowie der sekundären Datenbank Transaktionen und führt die Änderungen aus beiden in einer dritten Datenbank zusammen. In dieser Konfiguration wird ein Konfliktauflösungsverfahren benötigt.
Die Transaktionsreplikation ist in ihrem logischen Entwurf mit einer Datenbankspiegelung vergleichbar. Auf die primäre Datenbank angewendete Transaktionen werden an die sekundäre Datenbank gesendet, um eine konsistente Umgebung sicherzustellen. Nach Eingang werden die Transaktionen auf die sekundäre Datenbank angewendet, die anschließend auf die nächste Transaktion wartet, die auf das System angewendet werden soll.
Die Snapshotreplikation ist insofern mit dem Protokollversand vergleichbar, als dass beide in geplanten Intervallen ausgeführt werden. Zudem wird die sekundäre Datenbank als Ganzes aktualisiert, statt dass jede Transaktion während der Übertragung auf beide Systeme angewendet wird. Beide Technologien werden mehr oder weniger auf die gleiche Art und Weise verwendet.
Die Replikation erfordert spezielle Kenntnisse. Dies stellt für Umgebungen, die über keinen engagierten DBA verfügen, ein Problem dar. Die Problembehandlung kann sich bei der Replikation als aufwändig erweisen. Zudem erfordert die Replikation ein umfassenderes Design, wenn sie als Option für hohe Verfügbarkeit eingesetzt werden soll.
Die Replikation kann die Anforderungen an eine Lösung mit hoher Verfügbarkeit angemessen erfüllen. Diese Technologie kann mithilfe der Transaktionsreplikation auf Datensatzebene die gleichen Aufgaben wie eine Datenbankspiegelung erfüllen, jedoch ohne Option für ein automatisches Failover. Wenn Sie über genügend Ressourcen und ein wenig Kreativität verfügen, sollte das Skripting einer Lösung für ein automatisches Failover kein allzu großes Problem sein.
Im Unterschied zur Datenbankspiegelung können Clientanwendungen aber vollständig sowohl auf die Quell- als auch auf die Zieldatenbanken zugreifen. Die Replikation stellt die gleiche Funktionalität wie der Protokollversand unter Verwendung der Snapshotreplikation bereit.
Beachten Sie jedoch, dass sich die Replikationstechnologie bewährt hat und gut dokumentiert ist. Es bestehen aber auch Nachteile in der Verwendung der Replikation für eine Lösung mit hoher Verfügbarkeit. Die Leistung kann ebenfalls ein Problem darstellen, jedoch nur in dem Umfang wie bei der Datenbankspiegelung. Jede Lösung mit hoher Verfügbarkeit, die Sie mithilfe der Replikation entwerfen, hat wahrscheinlich eine noch kompliziertere zu verwaltende Architektur. Diese ist nicht unbedingt weiter entwickelt, aber sicherlich komplexer. Darüber hinaus stellen Änderungen an der Datenbanktabellenstruktur oder das Hinzufügen einer zu replizierenden Tabelle eine der größten Hürden dar, die nicht außer Acht gelassen werden dürfen. Sie müssen hierfür die Veröffentlichung unterbrechen und hinsichtlich der Änderungen neu definieren, sodass sie in beiden Datenbanken vorhanden sind.

Zusammenfassung
Das Erstellen einer Lösung mit hoher Verfügbarkeit für Ihre Umgebung erfordert offensichtlich eine gewisse Kreativität. Jede SQL Server 2005-Technologie für hohe Verfügbarkeit hat Schwächen und Stärken, und jede ist für unterschiedliche Situationen geeignet.
Der Protokollversand, die Snapshotreplikation und sogar Datenbankspiegelungen im Modus für hohe Leistung wären geeignet, wenn eine primäre Internetdatenbank geografisch von den sekundären Datenbankumgebungen getrennt wird (insbesondere, wenn die sekundären Daten nicht in Echtzeit verfügbar sein müssen).
Wenn andererseits eine sekundäre Datenbank Echtzeitdaten benötigt, können die Transaktionsreplikation oder die Datenbankspiegelung die Last tragen, wenn die Transaktionsraten auf dem primären Server niedrig sind und die Verbindung zwischen den beiden Umgebungsstandorten schnell und nicht gesättigt ist.
Beachten Sie auch das Ausmaß der Benutzerfreundlichkeit dieser Technologien. Wenn Sie bereits über praktische Erfahrungen in einigen dieser Technologien besitzen, sollte es keine Probleme geben. Wenn Sie Manager sind und keinen engagierten DBA haben, sollten Sie sich von komplexen Technologien wie Replikation fernhalten, die aus vielen beweglichen Einzelteilen bestehen und deren Problembehandlung kompliziert sein kann. Es empfiehlt sich auch, über den Einsatz eines erfahrenen SQL Server-Beraters nachzudenken. Dieser kann Ihnen beim Entwerfen und Implementieren helfen und möglicherweise auch Ihr Personal schulen, sodass es in die Lage versetzt wird, neue, für Ihre Umgebung geeignete hohe Verfügbarkeit zu verwalten.
Wenn für Ihre Organisation hohe Verfügbarkeit lediglich bedeutet, dass die Daten zu einem hohen Prozentsatz der Zeit verfügbar sein sollen und Datenausfallzeiten ein ernst zu nehmendes Problem sind, stellt die Clusterbildung möglicherweise die beste Option für Sie dar.
Zusammenfassend lässt sich sagen, dass SQL Server 2005 eine Reihe neuer Optionen zum Implementieren von hoher Verfügbarkeit zur Verfügung stellt, die an unterschiedliche Umgebungen angepasst sind. Eine einzelne Verfügbarkeitsoption mag Ihren Bedürfnissen entsprechen, oder Sie können eine Kombination aus Technologien nutzen. Wählen Sie unter den unterschiedlichen Möglichkeiten die beste Lösung für Sie aus.

Zach Nichter ist SQL Server-Experte und verfügt über mehr als 10 Jahre Erfahrung in diesem Bereich. Er hat bereits mehrere SQL Server-Supportrollen innegehabt, einschließlich DBA, Teamleiter, Manager und Berater. Derzeit ist Zach bei Levi Strauss & Co. als DBA-Architekt tätig. Der Schwerpunkt seiner Tätigkeit liegt im Bereich der Leistung, Überwachung und Architektur von SQL Server und in anderen strategischen Initiativen.


 SQL Server: Vereinfachen der Datenbankwartung mit Tabellenpartitionen
SQL Server Noah Gomez

Vereinfachen der Datenbankwartung mit Tabellenpartitionen
Kurz zusammengefasst:
  • Erstellen partitionierter Tabellen
  • Hinzufügen und Zusammenführen von Tabellen
  • Erstellen und Verwalten partitionierter Indexe
Laden Sie den Code für diesen Artikel herunter: GomezPartitioning2007_03.exe (156KB)

In der Vergangenheit waren Datenbankadministratoren, die Tabellen mit Millionen von Datenzeilen verwalten, gezwungen, mehrere Tabellen zu erstellen. Nach dem Partitionieren dieser Tabellen musste der Administrator
die Tabellen während der Ausführung von vielen Abfragen wieder verknüpfen. Beim Verknüpfen von Partitionen musste eine partitionierte Ansicht oder ein in einem Wrapper gespeichertes Verfahren erstellt werden, das erkannte, wo sich die Daten befanden, und das ein weiteres gespeichertes Verfahren ausführte, das nur auf die zur Rückgabe des Dataset erforderlichen Partitionen abzielte.
Obwohl diese Methoden funktionierten, waren sie aufwändig. Die Verwaltung mehrerer Tabellen und ihrer Indexe sowie die Methoden zum erneuten Verknüpfen der Tabellen verursachten oft Verwaltungs- und Wartungsprobleme. Außerdem führte das Erstellen mehrerer Tabellen zum Partitionieren von Daten zu einer gewissen Inflexibilität, da die Art der Partitionierung für die gespeicherten Verfahren, Wartungsaufträge, DTS-Aufträge (Data Transformation Services), Anwendungscode und anderen Prozesse verständlich sein musste. Damit der Benutzer diese Quasipartitionen ohne Änderung des Codes hinzufügen oder löschen konnte, wurden diese Elemente in der Regel auf nicht dynamische Weise erstellt und waren daher ineffizient.
Mit den Enterprise- und Developer-Editionen von SQL Server™ 2005 können Sie große Datenmengen in einer einzelnen Tabelle in mehrere kleinere Partitionen partitionieren, die sich effektiver verwalten und warten lassen. Die Möglichkeit, Datensegmente zu erstellen, auf die über einen einzelnen Ausgangspunkt zugegriffen wird, verringert viele der früheren Verwaltungsprobleme. Die Verwendung eines einzelnen Ausgangspunkts (Tabellen- oder Indexname) verbirgt die Datensegmente vor dem Anwendungscode und ermöglicht es dem Administrator oder Entwickler, die Partitionen bei Bedarf zu ändern, ohne die Codebasis anzupassen.
Sie können also mehrere Partitionen erstellen, diese Partitionen verschieben, alte Partitionen löschen und sogar die Art und Weise ändern, wie Daten partitioniert werden, ohne den Code in Ihrer Anwendung anzupassen. Ihr Anwendungscode ruft einfach weiterhin dieselbe Basistabelle oder denselben Indexnamen auf. Sie können auch die in einzelnen Indexen enthaltenen Daten verringern, wodurch wiederum die Wartungszeiten für diese Indexe reduziert werden, und Sie können die Geschwindigkeit beim Laden von Daten erhöhen, indem Sie sie in leere Partitionen laden.
Technisch gesehen wird jede SQL Server 2005-Tabelle partitioniert, d. h. jede Tabelle hat mindestens eine Partition. SQL Server 2005 ermöglicht es Datenbankadministratoren, zusätzliche Partitionen in jeder Tabelle zu erstellen. Bei Tabellen- und Indexpartitionen handelt es sich um fest definierte Partitionen auf Zeilenebene (das Partitionieren nach Spalten ist nicht zulässig), die einen einzelnen Ausgangspunkt (Tabellen- oder Indexname) zulassen, ohne dass dem Anwendungscode die dem Ausgangspunkt zugrunde liegende Anzahl der Partitionen bekannt sein muss. Partitionen können in der Basistabelle sowie in den der betreffenden Tabelle zugeordneten Indexen vorhanden sein.

Erstellen partitionierter Tabellen
Partitionsfunktionen und Partitionsschemas werden zum Erstellen einer Tabelle verwendet, die über die einzelne Standardpartition hinauswachsen kann. Mithilfe dieser Objekte können Sie Daten in bestimmte Segmente unterteilen und steuern, wo sich diese Datensegmente in Ihrem Speicherentwurf befinden. Sie können Daten beispielsweise auf Grundlage ihres Alters oder mithilfe anderer gemeinsamer Unterscheidungsmerkmale über mehrere Laufwerkarrays verteilen. Beachten Sie, dass eine Tabelle auf der Grundlage einer Tabellenspalte partitioniert werden kann, und jede Partition muss Daten enthalten, die nicht in die anderen Partitionen gestellt werden können.
Partitionsfunktionen. Beim Partitionieren einer Tabelle müssen Sie als erstes entscheiden, wie Sie die Daten in verschiedene Segmente unterteilen wollen. Eine Partitionsfunktion dient zur Zuordnung der einzelnen Datenzeilen zu verschiedenen Partitionen. Die Zuordnung dieser einzelnen Datenzeilen kann über beliebige Spalten mit der Ausnahme von text, ntext, image, xml, timestamp, varchar(max), nvarchar(max), varbinary(max), Aliasdatentypen oder benutzerdefinierten CLR-Datentypen (Common Language Runtime) erfolgen. Die Partitionierungsfunktion muss jedoch in der Lage sein, eine Datenzeile in nur eine Tabellenpartition zu stellen. Es ist nicht zulässig, dass eine Datenzeile gleichzeitig zu mehreren Partitionen gehört.
Zum Partitionieren einer Tabelle müssen Sie die Partitionierungsspalte in der Zieltabelle erstellen. Diese Partitionierungsspalte kann im Tabellenschema vorhanden sein, wenn die Tabelle erstellt wird. Sie können die Tabelle auch ändern und die Spalte zu einem späteren Zeitpunkt hinzufügen. Die Spalte kann NULL-Werte annehmen, aber alle Zeilen, die NULL-Werte enthalten, werden standardmäßig ganz links in die Tabellenpartition gestellt. Dies lässt sich vermeiden, indem Sie angeben, dass NULL-Werte ganz rechts in die Tabellenpartition gestellt werden sollen, wenn Sie die Partitionierungsfunktion erstellen. Die Verwendung der linken oder rechten Partition ist eine wichtige Entwurfsentscheidung, wenn Sie Ihr Partitionierungsschema ändern und mehr Partitionen hinzufügen oder vorhandene Partitionen löschen.
Beim Erstellen einer Partitionierungsfunktion können Sie eine LEFT- oder RIGHT-Partitionsfunktion auswählen. Der Unterschied zwischen LEFT- und RIGHT-Partitionen besteht darin, wo die Begrenzungswerte in das Partitionierungsschema gestellt werden. LEFT-Partitionen (dies ist Standardpartition) umfassen den Begrenzungswert in der Partition, während RIGHT-Partitionen den Begrenzungswert in die nächste Partition stellen.
Sehen Sie sich zum besseren Verständnis dieses Konzepts diese einfachen LEFT- und RIGHT-Partitionen an:
CREATE PARTITION FUNCTION Left_Partition (int) AS RANGE LEFT
FOR VALUES (1,10,100)

CREATE PARTITION FUNCTION Right_Partition (int) AS RANGE RIGHT
FOR VALUES (1,10,100)
In der ersten Funktion (Left_Partition) werden die Werte 1, 10 und 100 in die erste, zweite beziehungsweise dritte Partition gestellt. In der zweiten Funktion (Right_Partition) werden die Werte in die zweite, dritte und vierte Partition gestellt.
Beim Erstellen einer partitionierten Tabelle ist es wichtig, die Partitionen möglichst gleichmäßig zu erstellen. Dadurch werden Sie besser verstehen, wie viel Platz für eine Partition erforderlich ist. Durch die Verwendung einer LEFT- und RIGHT-Partition wird festgelegt, wo Daten hingestellt werden, und dies legt wiederum die Größe der Partition und die Größe der Indexe fest, die in dieser Partition erstellt werden.
Sie können, wie hier dargestellt, mithilfe der $PARTITION-Funktion die Partitionsnummer festlegen, in die ein Datenwert gestellt wird:
SELECT $PARTITION.Left_Partition (10)
SELECT $PARTITION.Right_Partition (10)
In der ersten SELECT-Anweisung ist das Ergebnis 2. Die zweite SELECT-Anweisung gibt 3 zurück.
Partitionsschemas. Wenn Sie die Funktion erstellt und entschieden haben, wie Ihre Daten unterteilt werden, müssen Sie entscheiden, wo die einzelnen Partitionen auf Ihrem Datenträgersubsystem erstellt werden. Zum Erstellen dieses Datenträgerlayouts verwenden Sie Partitionsschemas. Partitionsschemas verwalten den Plattenspeicher einzelner Partitionen durch die Verwendung von Dateigruppen, um jede Partition an einen Speicherort des Datenträgersubsystems zu stellen. Sie können Partitionsschemas so konfigurieren, dass alle Partitionen in eine einzelne Dateigruppe oder alle Partitionen in verschiedene Dateigruppen gestellt werden oder Dateigruppen von mehreren Partitionen gemeinsam genutzt werden. Die letztgenannte Methode bietet dem Datenbankadministrator viel Flexibilität beim Verteilen der Datenträger-E/A-Vorgänge.
Abbildung 1 zeigt einige Möglichkeiten beim Zuweisen einer Dateigruppe oder mehrerer Dateigruppen zu einem Partitionsschema. Sie sollten beachten, dass die von Ihrem Partitionsschema verwendeten Dateigruppen bereits in der Datenbank vorhanden sein müssen, bevor Sie Ihr Partitionierungsschema erstellen.
Figure 1 Zuweisen von Dateigruppen zu einem Partitionsschema (Close Figure 1)
--Place all partitions into the PRIMARY filegroup
CREATE PARTITION SCHEME Primary_Left_Scheme
AS PARTITION Left_Partition
--Partition must currently exist in database
      ALL TO ([PRIMARY])

--Place all partitions into the different filegroups
CREATE PARTITION SCHEME Different_Left_Scheme
AS PARTITION Left_Partition
--Partition must currently exist in database
      TO (Filegroup1, Filegroup2, Filegroup3, Filegroup4)
--Filegroups must currently exist in database

--Place multiple partitions into the different filegroups
CREATE PARTITION SCHEME Multiple_Left_Scheme
AS PARTITION Left_Partition
--Partition must currently exist in database
      TO (Filegroup1, Filegroup2, Filegroup1, Filegroup2)
--Filegroups must currently exist in database
Wenn Sie die Beispielpartitionsfunktionen wie in Abbildung 1 dargestellt erstellen und das Partitionsschema zum Erstellen einer Tabelle verwenden, können Sie festlegen, wohin einzelne Datenzeilen in Ihren neu partitionierten Tabellen gestellt werden. Dann können Sie die Verteilung dieser Datenzeilen anzeigen, nachdem sie in Ihre partitionierte Tabelle eingefügt wurden. Der Code dazu sieht etwa wie der Code in Abbildung 2 aus.
Figure 2 Platzieren von Datenzeilen und Anzeigen der Verteilung (Close Figure 2)
--Prepare database
IF OBJECT_ID('Partitioned_Table') IS NOT NULL
DROP TABLE Partitioned_Table
GO

IF EXISTS(SELECT [name] FROM sys.partition_schemes
WHERE [name] = 'Primary_Left_Scheme')
DROP PARTITION SCHEME Primary_Left_Scheme
GO

IF EXISTS(SELECT [name] FROM sys.partition_functions
WHERE [name] = 'Left_Partition')
DROP PARTITION FUNCTION Left_Partition
GO

--Create partitioned table
CREATE PARTITION FUNCTION Left_Partition (int) AS RANGE LEFT
FOR VALUES (1,10,100)

--Place all partitions into the PRIMARY filegroup
CREATE PARTITION SCHEME Primary_Left_Scheme
AS PARTITION Left_Partition
      ALL TO ([PRIMARY])

CREATE TABLE Partitioned_Table
(
col1 INT
,col2 VARCHAR(15)
) ON Primary_Left_Scheme (col1)

--Determine where values will be placed (this is not required)
--You should try to do this before executing the code
SELECT $PARTITION.Left_Partition (1)
SELECT $PARTITION.Left_Partition (2)
SELECT $PARTITION.Left_Partition (3)
SELECT $PARTITION.Left_Partition (4)
SELECT $PARTITION.Left_Partition (10)
SELECT $PARTITION.Left_Partition (11)
SELECT $PARTITION.Left_Partition (12)
SELECT $PARTITION.Left_Partition (13)
SELECT $PARTITION.Left_Partition (14)
SELECT $PARTITION.Left_Partition (100)
SELECT $PARTITION.Left_Partition (101)
SELECT $PARTITION.Left_Partition (102)
SELECT $PARTITION.Left_Partition (103)
SELECT $PARTITION.Left_Partition (104)

--Insert data into partitioned table
INSERT INTO Partitioned_Table VALUES (1,'Description')
INSERT INTO Partitioned_Table VALUES (2,'Description')
INSERT INTO Partitioned_Table VALUES (3,'Description')
INSERT INTO Partitioned_Table VALUES (4,'Description')
INSERT INTO Partitioned_Table VALUES (10,'Description')
INSERT INTO Partitioned_Table VALUES (11,'Description')
INSERT INTO Partitioned_Table VALUES (12,'Description')
INSERT INTO Partitioned_Table VALUES (13,'Description')
INSERT INTO Partitioned_Table VALUES (14,'Description')
INSERT INTO Partitioned_Table VALUES (100,'Description')
INSERT INTO Partitioned_Table VALUES (101,'Description')
INSERT INTO Partitioned_Table VALUES (102,'Description')
INSERT INTO Partitioned_Table VALUES (103,'Description')
INSERT INTO Partitioned_Table VALUES (104,'Description')

--View the distribution of data in the partitions
SELECT ps.partition_number
,ps.row_count
FROM sys.dm_db_partition_stats ps
INNER JOIN sys.partitions p
ON ps.partition_id = p.partition_id
AND p.[object_id] = OBJECT_ID('Partitioned_Table')

Ändern partitionierter Tabellen
Trotz sorgfältiger Vorausplanung ist es manchmal erforderlich, Ihre partitionierten Tabellen anzupassen, nachdem sie erstellt und gefüllt wurden. Ihr Partitionsschema mag wie beabsichtigt funktionieren, doch möglicherweise müssen Sie neue Partitionen hinzufügen, wenn sich neue Daten ansammeln, oder vielleicht müssen Sie große Mengen partitionierter Daten gleichzeitig löschen. Glücklicherweise lassen partitionierte Tabellen und die zugrunde liegenden Partitionierungsstrukturen Änderungen zu, nachdem die Tabelle veröffentlicht und mit Daten gefüllt wurde.
Hinzufügen von Partitionen. Viele Partitionierungspläne bieten die Möglichkeit, in der Zukunft eine neue Partition hinzuzufügen. Dieser Zeitpunkt kann ein bestimmtes Datum sein oder von einem Wert in einer inkrementellen Identitätsspalte abhängen. Wenn Sie dies jedoch nicht im Voraus eingeplant haben, können Sie einer partitionierten Tabelle später immer noch neue Partitionen hinzufügen. Sehen Sie sich die in Abbildung 2 erstellte Tabelle an. Dieser Tabelle können Sie eine neue Partition, die höhere Werte als 500 enthalten soll, folgendermaßen hinzufügen:
--Determine where values live before new partition
SELECT $PARTITION.Left_Partition (501)  --should return a value of 4

--Create new partition
ALTER PARTITION FUNCTION Left_Partition ()
SPLIT RANGE(500)

--Determine where values live after new partition
SELECT $PARTITION.Left_Partition (501)  --should return a value of 5
Die Möglichkeit, Partitionen hinzuzufügen, bietet viel Flexibilität. Abbildung 3 zeigt, wie Sie links von der Funktion eine Partition hinzufügen können. In diesem Fall müssen Sie das Partitionierungsschema anweisen, wohin die neue Partition gestellt werden soll, da Sie alle Dateigruppen aufgebraucht haben, die Sie bei der ursprünglichen Erstellung des Partitionierungsschemas erstellt haben. Obwohl Sie die PRIMARY-Dateigruppe für alle Ihre Partitionen verwenden, müssen Sie das Partitionierungsschema dennoch anweisen, die PRIMARY-Dateigruppe für die neue Partition wiederzuverwenden.
Figure 3 Hinzufügen einer Partition zur linken Seite der Funktion (Close Figure 3)
--Determine where values live after new partition
SELECT $PARTITION.Left_Partition (5)   --should return a value of 2
SELECT $PARTITION.Left_Partition (1)   --should return a value of 1
SELECT $PARTITION.Left_Partition (10)  --should return a value of 2

--Add new filegroups to the partitioning scheme
ALTER PARTITION SCHEME Primary_Left_Scheme
NEXT USED [PRIMARY]

--Create new partition
ALTER PARTITION FUNCTION Left_Partition ()
SPLIT RANGE(5)

--Determine where values live after new partition
SELECT $PARTITION.Left_Partition (5)   --should return a value of 2
SELECT $PARTITION.Left_Partition (1)   --should return a value of 1
SELECT $PARTITION.Left_Partition (10)  --should return a value of 3
Zusammenführen zweier Partitionen. SQL Server ermöglicht das Löschen einzelner Partitionen aus einer Tabelle, wobei die Daten erhalten bleiben. Dies kann zum Zusammenführen älterer aktiver Daten in archivierten Daten oder zur Verringerung der Anzahl vorhandener Partitionen genutzt werden, sodass die Verwaltung der partitionierten Tabelle erleichtert wird. Sie können mit dieser Funktion auch Partitionen zusammenführen, indem Sie Daten von einer Dateigruppe in eine andere verschieben, sodass Speicherplatz auf bestimmtem Laufwerkarrays frei wird. Der Code in Abbildung 4 zeigt, wie Sie Daten von einer Partition in eine andere Partition in derselben Dateigruppe verschieben können.
Figure 4 Verschieben von Daten von einer Partition in eine andere (Close Figure 4)
--Prepare database
IF OBJECT_ID('multiple_partition') IS NOT NULL
DROP TABLE multiple_partition
GO

IF EXISTS(SELECT [name] FROM sys.partition_schemes
WHERE [name] = 'Primary_Left_Scheme')
DROP PARTITION SCHEME Primary_Left_Scheme
GO

IF EXISTS(SELECT [name] FROM sys.partition_functions
WHERE [name] = 'Left_Partition')
DROP PARTITION FUNCTION Left_Partition
GO

--Create partitioned table
CREATE PARTITION FUNCTION Left_Partition (int) AS RANGE LEFT
FOR VALUES (1,10,100)

--Place all partitions into the PRIMARY filegroup
CREATE PARTITION SCHEME Primary_Left_Scheme
AS PARTITION Left_Partition
--Partition must currently exist in database
      ALL TO ([PRIMARY])

CREATE TABLE multiple_partition
(
col1 INT PRIMARY KEY CLUSTERED
,col2 VARCHAR(15)
) ON Primary_Left_Scheme (col1)

INSERT INTO multiple_partition VALUES (1,'Description')
INSERT INTO multiple_partition VALUES (2,'Description')
INSERT INTO multiple_partition VALUES (3,'Description')
INSERT INTO multiple_partition VALUES (4,'Description')
INSERT INTO multiple_partition VALUES (10,'Description')
INSERT INTO multiple_partition VALUES (11,'Description')
INSERT INTO multiple_partition VALUES (12,'Description')
INSERT INTO multiple_partition VALUES (13,'Description')
INSERT INTO multiple_partition VALUES (14,'Description')
INSERT INTO multiple_partition VALUES (100,'Description')
INSERT INTO multiple_partition VALUES (101,'Description')
INSERT INTO multiple_partition VALUES (102,'Description')
INSERT INTO multiple_partition VALUES (103,'Description')
INSERT INTO multiple_partition VALUES (104,'Description')

--Verify partitions
SELECT OBJECT_NAME(ps.[object_id])
,ps.partition_number
,ps.row_count
FROM sys.dm_db_partition_stats ps
INNER JOIN sys.partitions p
ON ps.partition_id = p.partition_id
AND p.[object_id] = OBJECT_ID('multiple_partition')

--Check where data would be placed
SELECT $PARTITION.Left_Partition (1)
SELECT $PARTITION.Left_Partition (10)
SELECT $PARTITION.Left_Partition (100)
SELECT $PARTITION.Left_Partition (101)

--Merge two partitions
ALTER PARTITION FUNCTION Left_Partition()
MERGE RANGE (10)

--Verify partitions
SELECT OBJECT_NAME(ps.[object_id])
,ps.partition_number
,ps.row_count
FROM sys.dm_db_partition_stats ps
INNER JOIN sys.partitions p
ON ps.partition_id = p.partition_id
AND p.[object_id] = OBJECT_ID('multiple_partition')

--Check where data would be placed
SELECT $PARTITION.Left_Partition (1)
SELECT $PARTITION.Left_Partition (10)
SELECT $PARTITION.Left_Partition (100)
SELECT $PARTITION.Left_Partition (101)
Verschieben einer Einzelpartitionstabelle in eine partitionierte Tabelle. Bei Laderoutinen müssen oft große Datenmengen in die Datenbank geladen und dann geändert oder aggregiert werden, bevor sie in die eigentliche Datentabelle verschoben werden. Die Partitionsfunktionen von SQL Server 2005 ermöglichen das Verschieben einer Einzelpartitionstabelle in eine Tabelle mit mehreren Partitionen. So können Sie Daten in eine einzelne Ladetabelle laden, diese Daten ändern und dann die ganze Tabelle in eine vorhandene Tabelle verschieben, ohne jede einzelne Datenzeile verschieben zu müssen. Bei dieser Schicht der Partitionierung müssen die zugrunde liegenden Partitionierungsstrukturen nicht geändert werden. Vielmehr wird die partitionierte Tabelle geändert. Der Code in Abbildung 5 zeigt, wie es geht.
Figure 5 Verschieben einer ganzen Tabelle in eine vorhandene Tabelle (Close Figure 5)
--Prepare database
IF OBJECT_ID(‘multiple_partition’) IS NOT NULL
DROP TABLE multiple_partition
GO

IF OBJECT_ID(‘single_partition’) IS NOT NULL
DROP TABLE single_partition
GO

IF EXISTS(SELECT [name] FROM sys.partition_schemes
WHERE [name] = ‘Primary_Left_Scheme’)
DROP PARTITION SCHEME Primary_Left_Scheme
GO

IF EXISTS(SELECT [name] FROM sys.partition_functions
WHERE [name] = ‘Left_Partition’)
DROP PARTITION FUNCTION Left_Partition
GO

--Create single partition table
CREATE TABLE single_partition
(
col1 INT PRIMARY KEY CLUSTERED
,col2 VARCHAR(15)
)

--Table must have a CHECK Constraint
ALTER TABLE single_partition
WITH CHECK
ADD CONSTRAINT CK_single_partition
    CHECK (col1 > 100)

INSERT INTO single_partition VALUES (101,’Description’)
INSERT INTO single_partition VALUES (102,’Description’)
INSERT INTO single_partition VALUES (103,’Description’)
INSERT INTO single_partition VALUES (104,’Description’)

--Create partitioned table
CREATE PARTITION FUNCTION Left_Partition (int) AS RANGE LEFT
FOR VALUES (1,10,100)

--Place all partitions into the PRIMARY filegroup
CREATE PARTITION SCHEME Primary_Left_Scheme
AS PARTITION Left_Partition
--Partition must currently exist in database
      ALL TO ([PRIMARY])

CREATE TABLE multiple_partition
(
col1 INT PRIMARY KEY CLUSTERED
,col2 VARCHAR(15)
) ON Primary_Left_Scheme (col1)

INSERT INTO multiple_partition VALUES (1,’Description’)
INSERT INTO multiple_partition VALUES (2,’Description’)
INSERT INTO multiple_partition VALUES (3,’Description’)
INSERT INTO multiple_partition VALUES (4,’Description’)
INSERT INTO multiple_partition VALUES (10,’Description’)
INSERT INTO multiple_partition VALUES (11,’Description’)
INSERT INTO multiple_partition VALUES (12,’Description’)
INSERT INTO multiple_partition VALUES (13,’Description’)
INSERT INTO multiple_partition VALUES (14,’Description’)
INSERT INTO multiple_partition VALUES (100,’Description’)

--Verify partitions
SELECT OBJECT_NAME(ps.[object_id])
,ps.partition_number
,ps.row_count
FROM sys.dm_db_partition_stats ps
INNER JOIN sys.partitions p
ON ps.partition_id = p.partition_id
AND p.[object_id] IN (OBJECT_ID(‘multiple_partition’), OBJECT_
      ID(‘single_partition’))

--Move the single table into the partitioned table
ALTER TABLE single_partition SWITCH TO multiple_partition PARTITION 4

--Verify partitions
SELECT OBJECT_NAME(ps.[object_id])
,ps.partition_number
,ps.row_count
FROM sys.dm_db_partition_stats ps
INNER JOIN sys.partitions p
ON ps.partition_id = p.partition_id
AND p.[object_id] IN (OBJECT_ID(‘multiple_partition’), OBJECT_ID(‘single_partition’))
Verschieben einer Partition aus einer Tabelle in eine andere. Eine häufige administrative Aufgabe besteht im Verschieben älterer Daten in separate Archivtabellen. Beim Archivierungsprozess ist normalerweise eine Reihe von Anweisungen beteiligt, was zu zusätzlicher Ressourcennutzung in Ihren Transaktionsprotokollen führen kann. Den Besitz einer Partition von einer Tabelle auf eine andere umzustellen, ist jedoch eine einfach Möglichkeit, große Datenmengen ohne den üblichen Transaktionsprotokollaufwand zu archivieren. Dieses Feature ermöglicht es dem Datenbankadministrator, Segmente älterer Daten aus seinen aktiven Tabellen in archivierte Tabellen zu verschieben. Doch da die Daten nicht wirklich verschoben werden, kann der Zeitaufwand sehr viel geringer als beim Verschieben einzelner Datenzeilen sein. Abbildung 6 zeigt, wie es geht.
Figure 6 Verschieben älterer Daten in archivierte Tabellen (Close Figure 6)
--Prepare database
IF OBJECT_ID('active_data') IS NOT NULL
DROP TABLE active_data
GO

IF OBJECT_ID('archive_data') IS NOT NULL
DROP TABLE archive_data
GO

IF EXISTS(SELECT [name] FROM sys.partition_schemes
WHERE [name] = 'Active_Scheme')
DROP PARTITION SCHEME Active_Scheme
GO

IF EXISTS(SELECT [name] FROM sys.partition_functions
WHERE [name] = 'Active_Partition')
DROP PARTITION FUNCTION Active_Partition
GO

IF EXISTS(SELECT [name] FROM sys.partition_schemes
WHERE [name] = 'Archive_Scheme')
DROP PARTITION SCHEME Archive_Scheme
GO

IF EXISTS(SELECT [name] FROM sys.partition_functions
WHERE [name] = 'Archive_Partition')
DROP PARTITION FUNCTION Archive_Partition
GO

--Create active function
CREATE PARTITION FUNCTION Active_Partition (int) AS RANGE LEFT
FOR VALUES (1,10,100)

--Create archive function
CREATE PARTITION FUNCTION Archive_Partition (int) AS RANGE LEFT
FOR VALUES (100,200,300)

--Place all partitions into the PRIMARY filegroup
CREATE PARTITION SCHEME Active_Scheme
AS PARTITION Active_Partition
--Partition must currently exist in database
      ALL TO ([PRIMARY])

--Place all partitions into the PRIMARY filegroup
CREATE PARTITION SCHEME Archive_Scheme
AS PARTITION Archive_Partition
--Partition must currently exist in database
      ALL TO ([PRIMARY])

CREATE TABLE active_data
(
col1 INT PRIMARY KEY CLUSTERED
,col2 VARCHAR(15)
) ON Active_Scheme (col1)

CREATE TABLE archive_data
(
col1 INT PRIMARY KEY CLUSTERED
,col2 VARCHAR(15)
) ON Archive_Scheme (col1)

INSERT INTO active_data VALUES (1,'Description')
INSERT INTO active_data VALUES (2,'Description')
INSERT INTO active_data VALUES (3,'Description')
INSERT INTO active_data VALUES (4,'Description')
INSERT INTO active_data VALUES (10,'Description')
INSERT INTO active_data VALUES (11,'Description')
INSERT INTO active_data VALUES (12,'Description')
INSERT INTO active_data VALUES (13,'Description')
INSERT INTO active_data VALUES (14,'Description')
INSERT INTO active_data VALUES (100,'Description')

INSERT INTO archive_data VALUES (200,'Description')
INSERT INTO archive_data VALUES (300,'Description')
INSERT INTO archive_data VALUES (400,'Description')

--Verify partitions
SELECT OBJECT_NAME(ps.[object_id])
,ps.partition_number
,ps.row_count
FROM sys.dm_db_partition_stats ps
INNER JOIN sys.partitions p
ON ps.partition_id = p.partition_id
AND p.[object_id] IN (OBJECT_ID('active_data'),OBJECT_ID('archive_
      data'))

--Switch ownership of partition to another table
ALTER TABLE active_data SWITCH PARTITION 3 TO archive_data PARTITION 1

--Verify partitions
SELECT OBJECT_NAME(ps.[object_id])
,ps.partition_number
,ps.row_count
FROM sys.dm_db_partition_stats ps
INNER JOIN sys.partitions p
ON ps.partition_id = p.partition_id
AND p.[object_id] IN (OBJECT_ID('active_data'),OBJECT_ID('archive_
      data'))
Verwenden einer Einzelpartition zum Erstellen einer neuen Tabelle. Sie können eine Einzelpartition aus einer vorhandenen partitionierten Tabelle in eine leere, nicht partitionierte Tabelle verschieben. Auf diese Weise kann der Datenbankadministrator die Indexwartung auf der Einzelpartition durchführen oder leicht große Datenmengen löschen, ohne dass der Löschprozess protokolliert wird. Das Beispiel in Abbildung 7 zeigt, wie eine Partition in eine leere Tabelle verschoben und die neue Tabelle dann zum Löschen der Daten verwendet wird.
Figure 7 Verschieben und Löschen von Daten (Close Figure 7)
--Prepare database
IF OBJECT_ID('active_data') IS NOT NULL
DROP TABLE active_data
GO

IF OBJECT_ID('archive_data') IS NOT NULL
DROP TABLE archive_data
GO

IF EXISTS(SELECT [name] FROM sys.partition_schemes
WHERE [name] = 'Active_Scheme')
DROP PARTITION SCHEME Active_Scheme
GO

IF EXISTS(SELECT [name] FROM sys.partition_functions
WHERE [name] = 'Active_Partition')
DROP PARTITION FUNCTION Active_Partition
GO

--Create active function
CREATE PARTITION FUNCTION Active_Partition (int) AS RANGE LEFT
FOR VALUES (1,10,100)

--Place all partitions into the PRIMARY filegroup
CREATE PARTITION SCHEME Active_Scheme
AS PARTITION Active_Partition
--Partition must currently exist in database
      ALL TO ([PRIMARY])

CREATE TABLE active_data
(
col1 INT PRIMARY KEY CLUSTERED
,col2 VARCHAR(15)
) ON Active_Scheme (col1)

CREATE TABLE archive_data
(
col1 INT PRIMARY KEY CLUSTERED
,col2 VARCHAR(15)
)

INSERT INTO active_data VALUES (1,'Description')
INSERT INTO active_data VALUES (2,'Description')
INSERT INTO active_data VALUES (3,'Description')
INSERT INTO active_data VALUES (4,'Description')
INSERT INTO active_data VALUES (10,'Description')
INSERT INTO active_data VALUES (11,'Description')
INSERT INTO active_data VALUES (12,'Description')
INSERT INTO active_data VALUES (13,'Description')
INSERT INTO active_data VALUES (14,'Description')
INSERT INTO active_data VALUES (100,'Description')

--Verify partitions
SELECT OBJECT_NAME(ps.[object_id])
,ps.partition_number
,ps.row_count
FROM sys.dm_db_partition_stats ps
INNER JOIN sys.partitions p
ON ps.partition_id = p.partition_id
AND p.[object_id] IN (OBJECT_ID('active_data'),OBJECT_ID('archive_
      data'))

--Switch ownership of partition to another table
ALTER TABLE active_data SWITCH PARTITION 3 TO archive_data

--Verify partitions
SELECT OBJECT_NAME(ps.[object_id])
,ps.partition_number
,ps.row_count
FROM sys.dm_db_partition_stats ps
INNER JOIN sys.partitions p
ON ps.partition_id = p.partition_id
AND p.[object_id] IN (OBJECT_ID('active_data'),OBJECT_ID('archive_
      data'))

--Drop all archive data without logging
DROP TABLE archive_data
GO

--Verify partitions
SELECT OBJECT_NAME(ps.[object_id])
,ps.partition_number
,ps.row_count
FROM sys.dm_db_partition_stats ps
INNER JOIN sys.partitions p
ON ps.partition_id = p.partition_id
AND p.[object_id] IN (OBJECT_ID('active_data'),OBJECT_ID('archive_
      data'))

Partitionierte Indexe
Mit der Möglichkeit zum Partitionieren der Daten einer Tabelle bietet sich die Möglichkeit, partitionierte Indexe zu erstellen. So kann der Datenbankadministrator die Indexstruktur auf Grundlage der geteilten Daten statt auf Grundlage der Daten der gesamten Tabelle entwerfen. Das Erstellen partitionierter Indexe führt zu einzelnen B-Strukturen in den partitionierten Indexen. Durch das Teilen der Indexe entstehen kleinere Indexe, die beim Ändern, Hinzufügen und Löschen von Daten durch das Speichermodul leichter gewartet werden können. Diese kleineren Indexe können auch einzeln vom Datenbankadministrator verwaltet werden, was eine bessere Indexwartung bei großen Datasets ermöglicht.
Erstellen partitionierter Indexe. Beim Erstellen partitionierter Indexe können Sie ausgerichtete oder nicht ausgerichtete Indexe erstellen. Bei ausgerichteten Indexen erstellen Sie den Index mit einer direkten Beziehung zu den partitionierten Daten. (Bei nicht ausgerichteten Indexen wählen Sie ein anderes Partitionierungsschema.)
Ausgerichtete Indexe sind die bevorzugte Methode, die automatisch ausgeführt wird, wenn Sie die Partitionstabelle und dann die Indexe erstellen, ohne ein anderes Partitionierungsschema anzugeben. Die Verwendung ausgerichteter Indexe bietet Ihnen die Flexibilität zum Erstellen zusätzlicher Partitionen in der Tabelle und die Möglichkeit, den Besitz einer Partition auf eine andere Tabelle umzustellen. Diese Funktionen sind oft der Grund, warum Datenbankadministratoren überhaupt partitionierte Tabellen erstellen. Mit der Verwendung des Partitionierungsschemas der Tabelle für Ihre Indexe werden Sie Ihre Ziele bei der Partitionierung wahrscheinlich erreichen.
Sie können Indexe für Tabellen erstellen, bei denen die Daten im Index nicht an den Daten in der Tabelle ausgerichtet sind. Wenn sich die Daten in einer partitionierten Tabelle befinden, können Sie die Daten auf unterschiedliche Weise verknüpfen. (Partitionierte Daten können mithilfe des Abfrageoptimierers effizient mit anderen partitionierten Daten verknüpft werden.) Sie können dies auch mit einer nicht partitionierten Tabelle tun, sodass Sie einen partitionierten Index (für die Einzelpartitionstabelle) erstellen können, was die Indexwartung erleichtert.
Der Code in Abbildung 8 erstellt einen partitionierten, nicht gruppierten Index in einer partitionierten Tabelle. Der nicht gruppierte Index wird an der Tabelle ausgerichtet und nutzt die Partitionierungsspalte der Tabelle als nicht gruppierten Indexschlüssel.
Figure 8 Partitionierter, nicht gruppierter Index in einer partitionierten Tabelle (Close Figure 8)
--Prepare database
IF OBJECT_ID('multiple_partition') IS NOT NULL
DROP TABLE multiple_partition
GO

IF EXISTS(SELECT [name] FROM sys.partition_schemes
WHERE [name] = 'Primary_Left_Scheme')
DROP PARTITION SCHEME Primary_Left_Scheme
GO

IF EXISTS(SELECT [name] FROM sys.partition_functions
WHERE [name] = 'Left_Partition')
DROP PARTITION FUNCTION Left_Partition
GO

--Create partitioned table
CREATE PARTITION FUNCTION Left_Partition (int) AS RANGE LEFT
FOR VALUES (1,10,100)

--Place all partitions into the PRIMARY filegroup
CREATE PARTITION SCHEME Primary_Left_Scheme
AS PARTITION Left_Partition
--Partition must currently exist in database
    ALL TO ([PRIMARY])

CREATE TABLE multiple_partition
(
col1 INT
,col2 VARCHAR(15)
) ON Primary_Left_Scheme (col1)

--Create partitioned non-clustered index
CREATE NONCLUSTERED INDEX cl_multiple_partition ON multiple_
      partition(col1)

INSERT INTO multiple_partition VALUES (1,'Description')
INSERT INTO multiple_partition VALUES (2,'Description')
INSERT INTO multiple_partition VALUES (3,'Description')
INSERT INTO multiple_partition VALUES (4,'Description')
INSERT INTO multiple_partition VALUES (10,'Description')
INSERT INTO multiple_partition VALUES (11,'Description')
INSERT INTO multiple_partition VALUES (12,'Description')
INSERT INTO multiple_partition VALUES (13,'Description')
INSERT INTO multiple_partition VALUES (14,'Description')
INSERT INTO multiple_partition VALUES (100,'Description')
INSERT INTO multiple_partition VALUES (101,'Description')
INSERT INTO multiple_partition VALUES (102,'Description')
INSERT INTO multiple_partition VALUES (103,'Description')
INSERT INTO multiple_partition VALUES (104,'Description')

--Verify partitions
SELECT OBJECT_NAME(ps.[object_id])
,ps.partition_number
,ps.row_count
FROM sys.dm_db_partition_stats ps
INNER JOIN sys.partitions p
ON ps.partition_id = p.partition_id
AND p.[object_id] = OBJECT_ID('multiple_partition')

--Verify index partitions
SELECT partition_id, index_id FROM sys.partitions pt
WHERE pt.[object_id] = OBJECT_ID('multiple_partition')
Der Code in Abbildung 9 erstellt einen nicht ausgerichteten, nicht gruppierten Index in einer partitionierten Tabelle. Dieser nicht gruppierte Index verwendet andere Spalten für seinen Indexschlüssel, der in sortierten Verknüpfungen mit anderen partitionierten Tabellen verwendet werden kann.
Figure 9 Nicht ausgerichteter, nicht gruppierter Index in einer partitionierten Tabelle (Close Figure 9)
--Prepare database
IF OBJECT_ID('multiple_partition') IS NOT NULL
DROP TABLE multiple_partition
GO

IF EXISTS(SELECT [name] FROM sys.partition_schemes
WHERE [name] = 'Primary_Left_Scheme')
DROP PARTITION SCHEME Primary_Left_Scheme
GO

IF EXISTS(SELECT [name] FROM sys.partition_schemes
WHERE [name] = 'Index_primary_Left_Scheme')
DROP PARTITION SCHEME Index_primary_Left_Scheme
GO

IF EXISTS(SELECT [name] FROM sys.partition_functions
WHERE [name] = 'Left_Partition')
DROP PARTITION FUNCTION Left_Partition
GO

IF EXISTS(SELECT [name] FROM sys.partition_functions
WHERE [name] = 'Index_Left_Partition')
DROP PARTITION FUNCTION Index_Left_Partition
GO

--Create partitioned index function
CREATE PARTITION FUNCTION Index_Left_Partition (int) AS RANGE LEFT
FOR VALUES (10,50,100)

--Create partitioned table
CREATE PARTITION FUNCTION Left_Partition (int) AS RANGE LEFT
FOR VALUES (1,10,100)

--Place all index partitions into the PRIMARY filegroup
CREATE PARTITION SCHEME Index_primary_Left_Scheme
AS PARTITION Index_Left_Partition
--Partition must currently exist in database
      ALL TO ([PRIMARY])

--Place all partitions into the PRIMARY filegroup
CREATE PARTITION SCHEME Primary_Left_Scheme
AS PARTITION Left_Partition
--Partition must currently exist in database
      ALL TO ([PRIMARY])

CREATE TABLE multiple_partition
(
col1 INT
,col2 INT
) ON Primary_Left_Scheme (col1)

--Create non-aligned partitioned nonclustered index
CREATE NONCLUSTERED INDEX cl_multiple_partition ON multiple_
     partition(col2)
ON Index_primary_Left_Scheme (col2)

INSERT INTO multiple_partition VALUES (1,10)
INSERT INTO multiple_partition VALUES (2,10)
INSERT INTO multiple_partition VALUES (3,10)
INSERT INTO multiple_partition VALUES (4,10)
INSERT INTO multiple_partition VALUES (10,50)
INSERT INTO multiple_partition VALUES (11,50)
INSERT INTO multiple_partition VALUES (12,50)
INSERT INTO multiple_partition VALUES (13,50)
INSERT INTO multiple_partition VALUES (14,50)
INSERT INTO multiple_partition VALUES (100,100)
INSERT INTO multiple_partition VALUES (101,100)
INSERT INTO multiple_partition VALUES (102,100)
INSERT INTO multiple_partition VALUES (103,100)
INSERT INTO multiple_partition VALUES (104,100)

--Verify row count on partitioned data
SELECT OBJECT_NAME(ps.[object_id])
,ps.partition_number
,ps.row_count
FROM sys.dm_db_partition_stats ps
INNER JOIN sys.partitions p
ON ps.partition_id = p.partition_id
AND p.[object_id] = OBJECT_ID('multiple_partition')
AND p.index_id = 0

--Verify row count on partitioned index
--Row counts will not match those found in the data partitions
SELECT OBJECT_NAME(ps.[object_id])
,ps.partition_number
,ps.row_count
FROM sys.dm_db_partition_stats ps
INNER JOIN sys.partitions p
ON ps.partition_id = p.partition_id
AND p.[object_id] = OBJECT_ID('multiple_partition')
AND p.index_id <> 0
Verwalten partitionierter Indexe. In der Vergangenheit dauerte die Indexwartung bei großen Tabellen mit Millionen oder sogar Milliarden von Datenzeilen oft länger als den Datenbankadministratoren an Zeit zur Verfügung stand. Diese Wartung wurde oft nicht durchgeführt, da die Daten während der Erstellung des neuen Index gesperrt waren. Mit SQL Server 2005 kann der Datenbankadministrator die Indexwartung online durchführen, ohne die zugrunde liegende Tabelle über längere Zeit zu sperren. Doch selbst dieser Ansatz, bei dem Sie die Indexwartung durchführen, während Benutzer auf die Daten zugreifen, kann Ihr System aufgrund der Ressourcennutzung verlangsamen. Ein besserer Ansatz ist die Partitionierung von Indexen in kleinere Segmente und die anschließende Durchführung der Indexwartung für diese kleineren Partitionen. Um beispielsweise eine Indexwartung bei einer Indexpartition durchzuführen, könnten Sie einfach den nachstehenden Codeausschnitt an das Ende des in Abbildung 8 dargestellten Codes anfügen.
ALTER INDEX cl_multiple_partition
ON multiple_partition
REBUILD Partition = 2
Beachten Sie, dass die Indexwartung bei einzelnen Indexpartitionen offline durchgeführt werden muss und zu einer Sperrung der Tabelle während der Indexwartung führen kann. Um dies zu verhindern, können Sie die Einzelpartition in eine separate Partition verschieben, die Indexwartung durchführen und die Partition dann wieder in die Haupttabelle verschieben. Dieser Prozess verursacht einige Leistungsprobleme, wenn die Partition wieder in die Tabelle verschoben und der gruppierte Index aktualisiert wird, doch dies ist weniger problematisch als das Sperren der ganzen Tabelle. Zudem sind weniger Systemressourcen erforderlich.

Zusammenfassung
Wie Sie sehen, bietet die SQL Server 2005-Tabellenpartitionierung deutlich erhöhte Flexibilität beim Speichern und Warten von Daten in großen Tabellen, ohne den Anwendungscode oder SQL Server-Prozesse neu ausarbeiten zu müssen. Mit diesen Möglichkeiten erweist sich SQL Server als geeignete Plattform für wichtige Unternehmensdatenbanken.

Noah Gomez ist Senior SQL Server Development DBA für Verizon und hat sich auf VLDBs (Very Large Databases – sehr große Datenbanken) und große Anwendungen spezialisiert. Er ist Mitglied der Professional Association for SQL Server (PASS) und war Mitglied des DBA-Teams von Verizon, das an VLDBs mit mehreren Terabyte gearbeitet hat, die 2003 Top Ten Grand Prize-Auszeichnungen von Winter Corp. erhielten.


 SQL Server: Die besten Tipps f&#252;r die SQL&#160;Server-Clusterbildung
SQL Server Tom Moreau, PhD

Die besten Tipps für die SQL Server-Clusterbildung
Kurz zusammengefasst:
  • Ausführen von SQL Server auf einem Cluster
  • Hardware- und Softwareanforderungen
  • Clusterbildung für einen Knotens
  • Kostengünstige Optionen

Ein Servercluster ermöglicht Ihnen das Verbinden einer Reihe physischer Servern (oder Knoten), die einander als Failoverpartner dienen. Die von einem Cluster bereitgestellte Redundanz bedeutet mehr Betriebszeit für Ihre unverzichtbaren
Vorgänge. Ich habe bei meiner Arbeit mit SQL Server™ in den letzten 13 Jahren viele Cluster implementiert, bei denen es jeweils ganz spezielle Probleme gab. Diese Erfahrung hat zur Sammlung einer Reihe von Tipps geführt, mit deren Hilfe Sie die Clusterbildung erleichtern und erfolgreich gestalten können.
Servercluster nutzen die integrierten Clusterbildungsfunktionen der Enterprise-Editionen der Windows Server®-Produktfamilie. Tatsächlich ist Windows Server 2003 für die Clusterbildung wesentlich besser geeignet als Windows 2000 Advanced Server. Um die Vorteile der Clusterbildung zu maximieren, brauchen Sie die entsprechende Hardware, und das ist mit einigen Ausgaben verbunden. Es reicht nicht aus, ein paar Server mit einem freigegebenen Datenträger zusammenzufügen, und Sie können sich nicht auf die Tatsache verlassen, dass einzelne Hardwarekomponenten im Windows®-Katalog (früher als Hardwarekompatibilitätsliste bezeichnet) enthalten sind. Das System muss als Ganzes im Windows-Katalog enthalten sein. Doch keine Sorge – es gibt einige erprobte, kostengünstigere Clusterlösungen. Abbildung 1 zeigt eine typische Clusterkonfiguration.
Abbildung 1 Ein typischer Cluster
Abbildung 1 Ein typischer Cluster (Klicken Sie zum Verkleinern auf das Bild)
Abbildung 1 Ein typischer Cluster
Abbildung 1 Ein typischer Cluster (Klicken Sie zum Vergrößern auf das Bild)
Natürlich ist bei der Clusterbildung mehr als die Hardware zu beachten. So müssen Sie beispielsweise auch die richtige Edition von SQL Server 2005 auswählen. Die Enterprise Edition ermöglicht die Clusterbildung, verfügt aber auch über andere nützliche Features, wie z. B. die Möglichkeit, mehr CPUs wirksam einzusetzen, verteilte und aktualisierbare partitionierte Ansichten, den integrierten Protokollversand und die automatische Verwendung indizierter Ansichten. Wenn Sie bereits über eine Enterprise Edition-Lizenz verfügen, sollten Sie die Clusterbildung in Betracht ziehen, unabhängig davon, ob Sie die zwei bis acht Server haben, die für einen traditionellen Cluster erforderlich sind (auf Einzelknotencluster komme ich gleich zu sprechen). Wenn Sie die SQL Server 2005 Standard Edition haben, können Sie einen Cluster mit zwei Knoten installieren.
Bei der Windows Server 2003 Enterprise bzw. Datacenter Edition ist die Clusterbildung integriert. Sie müssen nur die Clusterverwaltung ausführen, um Ihren Cluster einzurichten. Sie können alle Knoten auf einmal oder nacheinander hinzufügen. Bei der Installation von SQL Server können Sie ebenfalls entscheiden, einen einzelnen, nicht gruppierten Server zu installieren, oder Sie können eine virtuelle Instanz in einem Cluster installieren. Wenn Sie sich für die Installation einer virtuellen Instanz entscheiden, können Sie diese auf allen Knoten des Clusters, nur einigen Knoten oder sogar nur auf einem Knoten installieren.
Um das wahre Ziel einer hochverfügbaren Clusterlösung zu erreichen, brauchen Sie auch qualifizierte Mitarbeiter und eingespielte Verfahren, die bei Problemen befolgt werden. Obwohl die Clusterbildung eine gute Absicherung gegen Hardwarefehler ist, verhindert es keine Benutzerfehler, wie z. B. das Löschen einer wichtigen Tabelle durch einen übermüdeten DBA mitten in der Nacht.

Einzelknotencluster
Selbst wenn Sie derzeit nur einen einzelnen Server brauchen, sollten Sie das Erstellen eines Einzelknotenclusters in Betracht ziehen. Dies bietet Ihnen die Möglichkeit, später auf einen Cluster zu aktualisieren, sodass eine Neuerstellung vermieden wird. Sie müssen nur darauf achten, dass die von Ihnen ausgewählte Hardware im Clusterteil des Windows-Katalogs enthalten ist.
Doch hohe Verfügbarkeit ist nicht der einzige Grund für die Option, zu einem späteren Zeitpunkt einen Knoten hinzuzufügen. Bedenken Sie, was geschieht, wenn Sie feststellen, dass Ihr Server nicht über die notwendige Kapazität verfügt. In diesem Fall wäre eine aufwändige Migration erforderlich. Wenn Sie einen Einzelknotencluster haben, lässt sich eine Migration leichter mit weitaus weniger Ausfallzeit bewältigen. Sie fügen dem Cluster den neuen Knoten und dem neuen Knoten die SQL Server-Binärdateien und Service Packs hinzu und führen dann das Failover zum neuen Knoten durch. Dann fügen Sie etwaige Updates der Service Packs hinzu und entfernen schließlich den alten Knoten. Die Ausfallzeit beträgt nur die Zeit, die für das Failover und das Hinzufügen etwaiger Updates erforderlich ist.

Hinzufügen von Knoten
Da alle Knoten in einem Cluster gleich sein müssen, werden Sie lieber früher als später aktiv werden wollen, um diesen zusätzlichen Knoten einzurichten. Wenn Sie zu lange warten, könnte der Knoten nicht mehr in Produktion sein. Bei einem Projekt musste ich einen Knoten in einem SQL Server 2000-Cluster neu erstellen. Ich überließ dem Betriebssystem-/Netzwerkadministrator die grundlegende Einrichtung und übernahm dann das Hinzufügen zum Cluster und die Vorbereitung auf den Dienst als SQL Server-Knoten. Alles ging gut, bis ich das Failover auf den neuen Knoten durchführte. Zu meiner Bestürzung musste ich feststellen, dass sofort ein Failback erfolgte. Um es kurz zu fassen: Obwohl ich ein ausführliches Dokument für das Einrichten eines neuen Clusters einschließlich Hinzufügen des Clusterdiensts und der SQL Server-Dienstkonten zu beiden Knoten erstellt hatte, wurde das Dokument nicht genau befolgt. Der Administrator hatte dem neu erstellten Knoten nicht die Dienstkonten hinzugefügt, sodass die Berechtigungen, die vor der Neuerstellung bestanden, nicht mehr vorhanden waren.
Es dauerte ziemlich lange, diesen Fehler zu finden. Mir kam die Idee, mir eine lokale Gruppenmitgliedschaft anzuschauen. Nachdem ich die beiden Konten hinzugefügt hatte, verlief das Failover reibungslos. Ich dachte weiter darüber nach. Ein Knoten wird nicht häufig neu erstellt, und wenn man es tut, ist es ein Notfall. Obwohl ich ein Dokument geschrieben hatte, wurde es nicht verwendet. Wir hätten den Sicherheitsteil durch Schreiben eines kurzen Skripts zum Hinzufügen der beiden Konten und für andere notwendige Anpassungen automatisieren können. Bei SQL Server 2005 wurde dies jedoch verbessert. Das Installationsprogramm fordert Sie auf, Gruppen auf Domänenebene für die SQL Server-Dienstkonten festzulegen.
Dies regte mich noch weiter zum Nachdenken an. Es ist möglich, Skripts zu erstellen, die CLUSTER.EXE aufrufen, um dem MSCS-Cluster (Microsoft® Cluster Server) den Knoten hinzuzufügen. Dazu muss der Benutzer dem Skript nur den Namen des Knotens hinzufügen, und der Rest geht wie von selbst. In einem Notfall ist die Automatisierung wirklich von Vorteil.

N+1-Cluster
Manchmal ist der Grund für das Hinzufügen eines Knotens zu einem Cluster nicht das Ersetzen eines Knotens. Sie könnten Ihrem Cluster beispielsweise mehr SQL Server-Instanzen hinzufügen, und jede Instanz braucht separate Datenträgerressourcen. Obwohl mehrere Instanzen auf einem Einzelknoten ausgeführt werden können, würden sie die CPU und den Arbeitsspeicher gemeinsam nutzen, was zu schlechter Leistung führen kann. Im Idealfall sollte nur eine einzige Instanz auf einem Einzelknoten ausgeführt werden. Wie stellen Sie dies beim Failover sicher? Die Lösung besteht darin, dass auf einem Knoten keine Dienste ausgeführt werden, während auf den anderen Knoten jeweils eine SQL Server-Instanz ausgeführt wird. Das ist die Definition eines N+1-Clusters: N Instanzen werden auf N+1-Knoten ausgeführt. Der zusätzliche Knoten dient zur Sicherung.

Aktualisieren von SQL Server
Das Aktualisieren einer gruppierten Instanz von SQL Server ist nichts für schwache Nerven: Die Clusterbildung hat ihren Grund – Sie brauchen Betriebszeit. Doch SQL Server 2005 bietet eine Reihe von Verbesserungen, die Sie nutzen sollten, damit Sie im Falle einer notwendigen Clusterbildung ohne viel Ausfallzeit fortfahren können.
Welche Möglichkeiten haben Sie? Beginnen wir mit der teuersten Lösung: das Erstellen eines ganz neuen Clusters, was neue Server und möglicherweise ein neues SAN (Storage Area Network) erfordert. Sie können wahrscheinlich die vorhandenen Netzwerkschalter beibehalten, aber das ist auch schon alles. Offensichtlich ist dieser Ansatz nicht billig, aber er hat gewisse Vorteile. Neue Hardware zeigt im Allgemeinen viel bessere Leistung als alte, da Datenträgerkapazität und Geschwindigkeit ständig zunehmen. Daher wird die Leistung allein schon durch neue Hardware verbessert. Vielleicht sollten Sie sogar Ihre Ausrüstung leasen, um technisch immer auf dem neuesten Stand zu sein.
Wenn die Hardware vorhanden ist, können Sie Ihren neuen virtuellen SQL Server auf diesem Setup erstellen, Ihre Produktionsdatenbanken kopieren und dann das neue System auf gründlich prüfen, sodass vor dem Cutover-Tag viel Zeit für die Fehlerbehebung vorhanden ist. Sie sollten jedoch unbedingt dafür sorgen, dass ein Skript für die Übertragung der Anmeldeinformationen von Ihrem vorhandenen Server erstellt wird. (Informationen dazu finden Sie unter support.microsoft.com/kb/246133. Es ist auch gut, Ihr Anmeldebuildskript für einen eventuellen Totalausfall zu aktualisieren.)
Um die Ausfallzeit zu minimieren, müssen Sie wahrscheinlich den Protokollversand verwenden, es sei denn, Ihre Datenbanken sind recht klein und Ihnen steht ein Zeitraum zur Verfügung, in dem keine Benutzer verbunden sind. Sie können den Protokollversand praktisch bis kurz vor dem Cutover durchführen. Dann sperren Sie die Benutzer, beenden und senden das letzte Protokoll und weisen die Anwendung dann der neuen Instanz zu. (Der Abschnitt zur Datenbankspiegelung weiter unten enthält eine interessante Alternative für den Protokollversand.) Wenn Sie DNS-Aliase verwenden, müssen Sie die Anwendungen wahrscheinlich nicht einmal der neuen Instanz zuweisen. Aktualisieren Sie stattdessen den DNS-Alias. Dieser Ansatz hat den Vorteil, dass immer noch das Original vorhanden ist, wenn Sie nach teilweiser Migration das Original wiederherstellen müssen.
Es gibt auch eine kostengünstigere Möglichkeit, für die jedoch mehr Vorausplanung erforderlich ist. Ein Cluster kann mehr als eine SQL Server-Instanz unterstützen, doch jede Instanz muss über ihre eigenen Datenträgerressourcen verfügen. Wenn Sie daher Ihr SAN aufteilen, sollten Sie eine LUN für eine zukünftige Aktualisierung vorsehen. Zur Durchführung der Aktualisierung installieren Sie SQL Server-Binärdateien auf dieser Datenträgerressource. Sie können das System in Anspruch nehmen und, wenn Sie bereit sind, den aktuellen SQL Server herunterfahren, die Datenträgerressourcen von der alten SQL Server-Gruppe verschieben, die Abhängigkeiten aktualisieren und die neue SQL Server-Instanz online stellen. Fügen Sie die Datenbanken der alten Instanz hinzu, und alles ist betriebsbereit. (Sie haben vorher hoffentlich alles gesichert.)
Das ist der kostengünstigere Ansatz, doch er ist etwas riskanter. Wenn es Probleme gibt, können Sie die Datenbanken nicht von der neuen Instanz trennen und wiederherstellen. Sie müssen die Wiederherstellung dann mithilfe von Sicherungen durchführen und das kann zu beträchtlichen Ausfallzeiten führen.
Eine Alternative wäre, zwei Instanzen von SQL Server in Ihr SAN zu stellen, vorausgesetzt, es ist genug Platz vorhanden. Sie stellen die Produktionssicherungen (und den Protokollversand) für die neue Instanz wieder her und fahren dann wie zuvor beschrieben fort. Jetzt verfügen Sie jedoch über ein Sicherungssystem. Nach Durchführung der Migration können Sie die SAN-Ressourcen der alten Instanz freigeben. Kosten entstehen nur durch die zusätzlichen Datenträger.

Lastenausgleich
Zuerst soll hier mit einem häufig anzutreffenden Missverständnis aufgeräumt werden. MSCS-Clusterbildung dient zur Schaffung hoher Verfügbarkeit und nicht zum Lastenausgleich. Zudem verfügt SQL Server nicht über eine integrierte, automatische Funktion zum Lastenausgleich. Sie müssen den Lastenausgleich mithilfe des physischen Entwurfs Ihrer Anwendung durchführen. Was bedeutet das?
Wenn eine Tabelle an Größe zunimmt, ist mit einem Leistungsabbau zu rechnen, insbesondere dann, wenn Tabellenscans beteiligt sind. Wenn Millionen oder Milliarden von Zeilen vorhanden sind, bestand die traditionelle Lösung in der Verwendung partitionierter Ansichten, die aus Tabellen mit identischen Schemas bestehen, die mit UNION ALL-Anweisungen verbunden sind. Es werden auch CHECK-Einschränkungen bereitgestellt, um die Mitgliedertabellen zu unterscheiden, und dies verhindert eine Datenduplizierung in der partitionierten Ansicht. Wenn die in der CHECK-Einschränkung verwendete Spalte auch Teil des primären Schlüssels ist, wird die Ansicht aktualisiert.
Falls die Mitgliedertabellen in ihren eigenen Dateigruppen vorhanden sind, könnte die Datenträgerleistung verbessert werden, wenn die Dateien in diesen Dateigruppen auf separaten physischen Laufwerken vorhanden sind. Die Tabellen können sogar in separaten Datenbanken vorhanden sein. Bei SQL Server 2005 können Sie jedoch die Tabellenpartitionierung verwenden, solange sich alle Daten in derselben Datenbank befinden, wodurch die Implementierung sehr viel einfacher wird.
Doch angenommen, dass Sie Ihr Bestes mit der Tabellenpartitionierung oder (lokalen) partitionierten Ansichten getan haben, aber die Geschwindigkeit immer noch zu niedrig ist. Wenn Sie über SQL Server 2000 oder SQL Server 2005 verfügen, können Sie verteilte partitionierte Ansichten verwenden. Der Hauptunterschied besteht darin, dass sich die Mitgliedertabellen in verschiedenen Instanzen von SQL Server befinden können. Diese Instanzen können in einem N+1-Cluster installiert werden. Warum ist das eine gute Vorgehensweise? Wenn eine Mitgliedertabelle in einer partitionierten Ansicht in den Offlinestatus wechselt, gilt dies für die ganze Ansicht. Wenn diese Mitglieder dann Teil eines Clusters werden, verfügen Sie über die Zuverlässigkeit, die zur Unterstützung der Leistung und Bereitstellung des Lastenausgleichs erforderlich ist.

Brauchen Sie überhaupt einen Cluster?
Vielleicht gibt es bei Ihnen einige Ersatzserver, die nicht im Windows-Katalog für Cluster enthalten sind. Es wäre schade, neue Server zur Unterstützung eines Clusters zu kaufen, wenn diese Server verfügbar sind.
In diesem Fall könnte die Datenbankspiegelung eine reizvolle Alternative zur Clusterbildung sein. Bei der Spiegelung sind drei Elemente beteiligt: eine Instanz, in der die gespiegelte Datenbank residiert und die als Prinzipal bezeichnet wird, der als Spiegelserver bezeichnete Sicherungsserver und, falls Sie automatisches Failover wünschen, ein dritter Server, der als Zeugenserver bezeichnet wird. Eine Transaktion in einer Datenbank auf dem Prinzipal wird im Spiegel erneut ausgeführt. Wenn der Prinzipal ausfällt, kann ein Failover der Datenbank auf den Spiegelserver durchgeführt werden. Dies geschieht automatisch, wenn Sie einen Zeugenserver haben. Sie müssen die Spiegelung für alle Ihre Anwendungsdatenbanken einrichten, und es können keine Systemdatenbanken gespiegelt werden.
Der Spiegelserver ist im Unterschied zu einem Cluster eine getrennte Instanz von SQL Server und kann sich an einem weit entfernen Standort befinden. Seine Caches werden durch die Aktualisierungsaktivität aufgefüllt, die als Ergebnis der vom Prinzipal duplizierten Transaktionen stattfindet. Dabei wird natürlich angenommen, dass auf Spiegelservern keine anderen Aktivitäten als der Empfang der gespiegelten Transaktionen vom Prinzipal ablaufen. Das Failover läuft gewöhnlich schneller ab als in einem Cluster, da SQL Server bereits auf dem Spiegelserver ausgeführt wird. Da die Caches zumindest teilweise bereitstehen, ist die anfängliche Leistung nicht so gering wie dies im gruppierten Szenario der Fall sein könnte. Beachten Sie, dass die Rollen von Prinzipal- und Spiegelserver beim Failover einer gespiegelten Datenbank umgekehrt werden.
Der Nachteil der Datenbankspiegelung besteht darin, dass Sie im Gegensatz zu einem Cluster die doppelte Datenträgerkapazität benötigen. Sie brauchen auch mehr CPU-Leistung, wenn Sie den synchronen Modus ohne Datenverlust wünschen. Wie bereits erwähnt, ist hohe Verfügbarkeit nicht billig.

Ein kombinierter Ansatz
Da sich ein Spiegelserver weit entfernt vom Prinzipal befinden kann, ist dieses Verfahren eine gute Wahl für Notfallwiederherstellungen. Ihr Cluster kann Ihre erste Verteidigungslinie sein, doch was geschieht, wenn Sie sowohl Clusterbildung als auch Spiegelung einsetzen? Wenn bei einem Clusterfailover ein Zeuge als Teil Ihrer Spiegelungskonfiguration vorhanden ist, wird der Spiegel zum Prinzipal, während der gruppierte SQL Server in den Onlinestatus wechselt. Es ist jedoch zu beachten, dass das Failover vom neuen Prinzipal zurück zum (gruppierten) neuen Spiegel nicht automatisch verläuft. Folglich ist es besser, das automatische Failover für Ihre gespiegelten Datenbanken bei gleichzeitiger Verwendung eines Clusters nicht zu aktivieren.
Die Notfallwiederherstellung ist nicht der einzige Grund für die Verwendung der Spiegelung. Sie ist auch nützlich, wenn Sie bei Ihrem Prinzipal ein Service Pack oder Hotfix installieren müssen, wobei Sie das Failover auf den Spiegel manuell durchführen können. Beim Installieren des Service Packs oder Hotfixes ist der alte Prinzipalserver vorübergehend offline, und die Transaktionen auf dem neuen Prinzipal, für die ein Commit ausgeführt wurde, stehen in einer Warteschlange und warten darauf, an den neuen Spiegel (den alten Prinzipal) zurückgeschickt zu werden. Nach Installation des Service Packs oder Hotfixes findet die Synchronisierung statt, bis schließlich die beiden Server völlig synchron sind. Jetzt können Sie die Rollen von Prinzipal und Spiegel tauschen. Die Ausfallzeit betrug nur ein paar Sekunden bis zum Failover und Failback. Mithilfe dieses Ansatzes können Sie die Migration Ihres SQL Servers durchführen. Aber vermeiden Sie ein Failback.

Ein virtueller Server sorgt für mehr Flexibilität
Virtualisierung ermöglicht die gleichzeitige Ausführung von einem oder mehreren Betriebssystemen auf einem einzigen physischen Server. Virtualisierungssoftware erweitert das Clusterkonzept mit einer weiteren Funktionsschicht, da Sie die Software gruppieren können. Wenn der Server, auf dem der Host ausgeführt wird, versagt, wird ein Failover des Betriebssystems (und seiner Gastbetriebssysteme) auf einen Sicherungsknoten durchgeführt. Dies könnte eine sehr einfache Möglichkeit zum Migrieren eines Gastservers sein. Außerdem muss das Gastbetriebssystem nicht clusterfähig sein. Sie könnten also die SQL Server Workgroup Edition in einem als Gast ausgeführten Windows Server 2003 ausführen, das unter Microsoft Virtual Server 2005 in einem Cluster ausgeführt wird. Indirekt haben Sie praktisch eine Clusterbildung der Workgroup Edition durchgeführt (siehe Abbildung 2).
Abbildung 2 Verwenden eines virtuellen Servers
Abbildung 2 Verwenden eines virtuellen Servers (Klicken Sie zum Verkleinern auf das Bild)
Abbildung 2 Verwenden eines virtuellen Servers
Abbildung 2 Verwenden eines virtuellen Servers (Klicken Sie zum Vergrößern auf das Bild)

Alles unter Kontrolle
Wenn Sie für eine SQL Server-Implementierung verantwortlich sind, müssen Sie sich darauf verlassen können, dass Ihr Server immer verfügbar ist. Die Serverclusterbildung hilft sicherzustellen, dass dies immer der Fall ist. Dieser Artikel enthält einige grundlegende Tipps für Sie. In der Randliste „Clusterbildung für Ressourcen“ finden Sie weitere nützliche Informationen.
Clusterbildung für Ressourcen
Weitere Informationen zu den hier verwendeten Methoden und den verschiedenen Produkten, die Sie zur Einrichtung Ihres SQL Server-Clusters brauchen, finden Sie hier:
  • SQL Server 2005 Failover Clustering (auf Englisch)
  • SQL Server 2000 Failover Clustering (auf Englisch)
  • Windows Server 2003 R2 Enterprise Edition–Cluster Server (auf Englisch)
  • Microsoft Cluster Server Administrator’s Guide (auf Englisch)
  • Microsoft Virtual Server 2005 R2 (auf Englisch)

Tom Moreau, PhD, BSc, PhD, MCSE, MCDBA, ist unabhängiger Berater, der sich auf die Verwaltung, den Entwurf und die Implementierung von SQL Server-Datenbanken spezialisiert hat. Er lebt in Toronto. Tom verwendet SQL Server seit 1993 und ist seit 2001 MVP. Er hat über 100 Artikel geschrieben und ist Mitverfasser eines Buchs über SQL Server. Besonderer Dank gilt SQL Server-MVP Geoff Hiten für seine hilfreiche Unterstützung.


 Windows-Verwaltung: Einblick in den Windows&#160;Vista-Kernel: Teil&#160;2
Windows-Verwaltung Mark Russinovich

Einblick in den Windows Vista-Kernel: Teil 2
Kurz zusammengefasst:
  • Speicherverwaltung
  • Starten und Herunterfahren
  • Energieverwaltung

Letzten Monat wurden im ersten Teil dieser dreiteiligen Reihe die Verbesserungen am Windows Vista-Kernel im Bereich von Prozessen und E/A-Vorgängen besprochen.
In diesem Beitrag geht es um die fortgeschrittene Speicherverwaltung in Windows Vista und die wichtigsten Verbesserungen bezüglich Systemstart, Herunterfahren und Energieverwaltung (Teil 1).
Jede neue Version von Windows® verbessert die Skalierbarkeit und Leistung. Dies trifft auch auf Windows Vista™ zu. Der Speicher-Manager von Windows Vista umfasst zahlreiche Verbesserungen. Dazu gehören die umfangreichere Verwendung von Synchronisierungsmethoden ganz ohne Sperren, differenziertere Sperren, engeres Verpacken von Datenstrukturen, größere E/A-Auslagerungsdateien, Unterstützung moderner GPU-Speicherstrukturen und eine effizientere Verwendung des Übersetzungsnachschlagepuffers (Translation Lookaside Buffer, TLB). Darüber hinaus bietet die Windows Vista-Speicherverwaltung jetzt eine dynamische Speicherplatzzuweisung für Adressen im Hinblick auf die Anforderungen verschiedener Arbeitsauslastungen.
Vier leistungssteigernde Features, in denen neue Technologien eingesetzt werden, befinden sich zum ersten Mal auf dem Prüfstand eines Betriebssystems. Es geht um die folgenden Funktionen in Windows Vista: SuperFetch, ReadyBoost, ReadyBoot und ReadyDrive. Diese Features werden weiter unten ausführlich besprochen.

Dynamischer Kerneladressbereich
Windows und die Anwendungen, die unter Windows ausgeführt werden, hatten Probleme mit der Beschränkung des Adressbereichs von 32-Bit-Prozessoren. Der Windows-Kernel ist standardmäßig auf 2 GB bzw. die Hälfte des gesamten virtuellen 32-Bit-Adressbereichs begrenzt, wobei die andere Hälfte für die Verwendung durch den Prozessor vorgesehen ist, dessen Thread aktuell auf der CPU ausgeführt wird. Innerhalb seiner Hälfte muss der Kernel Folgendes zuordnen: sich selbst, die Gerätetreiber, den Dateisystemcache, die Kernelstapel, die sitzungsspezifischen Codedatenstrukturen und sowohl die nicht ausgelagerten (im physischen Speicher eingeschlossenen) als auch die ausgelagerten, von Gerätetreibern zugeordneten Puffer. Vor Windows Vista wurde durch den Speicher-Manager zur Startzeit festgelegt, wie viel Adressbereich diesen verschiedenen Zwecken zuzuweisen ist, doch diese Inflexibilität führte manchmal dazu, dass einer der Bereiche vollständig ausgelastet war, während andere noch jede Menge verfügbaren Speicherplatz hatten. Die Auslastung eines Bereichs kann dazu führen, dass Anwendungen fehlschlagen und Gerätetreiber davon abgehalten werden, E/A-Vorgänge abzuschließen.
Im 32-Bit-Windows Vista verwaltet der Speicher-Manager den Adressbereich des Kernels dynamisch und sorgt für die Zuordnung bzw. Freigabe von Bereichen für verschiedene Zwecke, je nachdem, was die Arbeitsauslastung erfordert. Folglich kann der virtuelle Arbeitspeicher, der verwendet wird, um ausgelagerte Puffer zu speichern, zunehmen, wenn Gerätetreiber mehr fordern, und er kann schrumpfen, wenn die Treiber ihn freigeben. Windows Vista ist deshalb in der Lage, eine größere Auswahl von Arbeitsauslastungen zu verarbeiten. Dies gilt gleichermaßen für „Longhorn“, die zukünftige 32-Bit-Version von Windows Server®, die so skaliert wird, dass sie eine größere Anzahl von gleichzeitigen Terminalserverbenutzern ermöglicht.
Selbstverständlich stellen Einschränkungen des Adressbereichs auf 64-Bit-Windows Vista-Systemen derzeit keine wirklich Problem dar und erfordern daher keine besondere Behandlung, da sie bis zu ihren jeweiligen Höchstgrenzen konfiguriert sind.

Speicherprioritäten
Genauso wie Windows Vista E/A-Prioritäten hinzufügt (siehe Teil 1), fügt es auch Speicherprioritäten hinzu. Um zu verstehen, wie Speicherprioritäten von Windows verwendet werden, sollte verstanden werden, wie der Speicher-Manager seinen Speichercache, der die Standbyliste genannt wird, implementiert. In allen Versionen von Windows vor Windows Vista wurde eine physische Seite (in der Regel 4 KB), die einem Prozess gehört und vom System freigegeben wurde, vom Speicher-Manager in der Regel an das Ende der Standbyliste gestellt. Wenn der Prozess erneut auf die Seite zugreifen wollte, nahm der Speicher-Manager die Seite aus der Standbyliste und wies sie wieder dem Prozess zu. Wenn ein Prozess eine neue Seite des physischen Speichers verwenden wollte und kein freier Speicherplatz verfügbar war, gab der Speicher-Manager ihm die Seite am Anfang der Standbyliste. Dieses Schema hat alle Seiten in der Standbyliste praktisch gleich behandelt und ist dabei bei der Sortierung nur nach dem Zeitpunkt ihrer Platzierung in der Liste vorgegangen.
In Windows Vista hat jede Seite des Speichers eine Priorität im Bereich von 0 bis 7, und deshalb unterteilt der Speicher-Manager die Standbyliste in acht Listen, von denen jede eine bestimmte Priorität speichert. Wenn der Speicher-Manager eine Seite aus der Standbyliste herausnehmen will, nimmt er die Seiten zuerst aus den Listen mit einer niedrigen Priorität. Die Priorität einer Seite reflektiert normalerweise die Priorität des Threads, der die Zuordnung als Erster auslöst. (Wenn die Seite freigegeben ist, reflektiert sie die höchsten Speicherprioritäten der freigegebenen Threads.) Ein Thread erbt seinen Seitenprioritätswert von dem Prozess, zu dem der gehört. Der Speicher-Manager verwendet niedrige Prioritäten für Seiten, die er vom Datenträger in spekulativer Weise liest, wenn er die Speicherzugriffe eines Prozesses erwartet.
Standardmäßig haben Prozesse einen Seitenprioritätswert von 5, doch Funktionen ermöglichen den Anwendungen und dem System, die Prozess- und Threadseitenprioritätswerte zu ändern. Die wirkliche Stärke der Speicherprioritäten kommt nur dann zur Geltung, wenn die relativen Prioritäten der Seiten auf einer Makroebene verstanden werden, was die Aufgabe von SuperFetch ist.

SuperFetch
Eine wichtige Änderung, die am Speicher-Manager vorgenommen wurde, betrifft die Art, wie er den physischen Speicher verwaltet. Die Standbylistenverwaltung, die von früheren Versionen von Windows verwendet wurden, haben zwei Einschränkungen. Zum einen verlässt sich die Priorisierung der Seiten nur auf das kürzlich gezeigte Verhalten von Prozessen und sieht ihre zukünftigen Speicheranforderungen nicht voraus. Zum anderen sind die zur Priorisierung verwendeten Daten auf die Liste der Seiten begrenzt, die zu einem beliebigen Zeitpunkt einem Prozess gehören. Diese Mängel können zu Szenarios wie dem „Mittagspausensyndrom“ führen. Sie überlassen Ihren Computer eine kurze Zeit sich selbst, und es wird eine speicherintensive Systemanwendung (z. B. ein Antivirenscan oder eine Datenträgerdefragmentierung) ausgeführt. Diese Anwendung erzwingt, dass der Code und die Daten, die Ihre aktiven Anwendungen im Cache zwischengespeichert hatten, durch die speicherintensiven Aktivitäten überschrieben werden. Wenn Sie sich wieder an den Computer setzen, finden Sie eine verlangsamte Leistung vor, da die Anwendungen ihre Daten und den Code vom Datenträger abrufen müssen.
In Windows XP wurde die Vorabrufunterstützung eingeführt, der die Leistung beim System- und Anwendungsstart verbesserte. Diese Verbesserung wurde dadurch erreicht, dass große Datenträger-E/A-Vorgänge durchgeführt wurden, um die Code- und Dateisystemdaten vorab zu laden, die aufgrund von vorherigen System- und Anwendungsstarts vorhergesehen wurden. Windows Vista geht mit SuperFetch, einem Speicherverwaltungsschema, das die Methode des am längsten zurückliegenden Zugriffs um Verlaufsinformationen und eine proaktive Speicherverwaltung erweitert, einen großen Schritt weiter.
SuperFetch ist in %SystemRoot%\System32\Sysmain.dll als ein Windows-Dienst implementiert, der innerhalb eines Diensthostprozesses (%SystemRoot%\System32\Svchost.exe) ausgeführt wird. Das Schema verlässt sich auf die Unterstützung des Speicher-Managers, damit es Verlaufsinformationen zur Seitenverwendung abrufen und den Speicher-Manager anweisen kann, Daten und Code von Dateien auf Datenträger oder von einer Auslagerungsdatei in die Standbyliste vorab zu laden und den Seiten Prioritäten zuzuweisen. Der SuperFetch-Dienst dehnt die Seitenverfolgung im Wesentlichen auf die Daten und den Code aus, die sich einmal im Speicher befanden, die jedoch vom Speicher-Manager wiederverwendet wurden, um für neue Daten und Code Platz zu schaffen. Er speichert diese Informationen in Szenariodateien mit einer .db-Erweiterung im %SystemRoot%\Prefetch-Verzeichnis zusammen mit Standardvorabrufdateien, die zur Optimierung des Anwendungsstarts verwendet werden. Aufgrund dieser tief reichenden Kenntnis der Speicherauslastung kann SuperFetch Daten und Code vorab laden, wenn der physische Speicher verfügbar wird.
Wann immer Speicher frei wird, z. B. wenn eine Anwendung beendet wird oder wenn sie Speicher freigibt, fordert der SuperFetch den Speicher-Manager auf, kürzlich entfernte Daten und Code abzurufen. Dies wird mit einer Geschwindigkeit von ein paar Seiten pro Sekunde von E/A-Vorgängen mit sehr niedriger Priorität ausgeführt, damit das Vorabladen sich nicht auf den Benutzer oder die anderen aktiven Anwendungen auswirkt. Wenn Sie sich daher in der Mittagspause von Ihrem Computer entfernen und eine speicherintensive Hintergrundaufgabe dazu führt, dass der Code und die Daten Ihrer aktiven Anwendungen in Ihrer Abwesenheit aus dem Speicher entfernt werden, kann SuperFetch oft alles oder einen Großteil davon wieder zurückholen, bevor Sie zu Ihrem Arbeitsplatz zurückkehren. SuperFetch umfasst außerdem eine bestimmte Unterstützung je nach Szenario für Ruhezustand, Standby, Fast User Switching (FUS) und Anwendungsstart. Wenn das System beispielsweise in den Ruhestand übergeht, werden von SuperFetch Daten und Code in der Ruhezustanddatei gespeichert, denn es geht (aufgrund der vorherigen Ruhezustände) davon aus, dass bei der nachfolgenden Wiederaufnahme auf sie zugegriffen wird. Wenn Sie im Gegensatz dazu Windows XP wieder aufnehmen, müssen zuvor zwischengespeicherte Daten wieder vom Datenträger abgelesen werden, wenn darauf verwiesen wird.
Weitere Informationen dazu, wie sich SuperFetch auf den verfügbaren Speicher auswirkt, erhalten Sie in der Randleiste „Überwachen von SuperFetch“.
Überwachen von SuperFetch
Nachdem Sie eine Zeit lang das Windows Vista-System verwendet haben, werden Sie in der Leistungsseite des Task-Managers feststellen, dass der Zähler für den freien physischen Speicher eine niedrige Zahl angibt. Das liegt daran, dass SuperFetch und die Standardzwischenspeicherung in Windows den gesamten verfügbaren physischen Speicher nutzen, um die Datenträgerdaten zwischenzuspeichern. Wenn Sie zum Beispiel das erste Mal starten und sofort den Task-Manager ausführen, werden Sie feststellen, dass der Wert für den freien Speicherplatz sinkt und die Größe des zwischengespeicherten Speichers zunimmt. Ein anderes Beispiel: Wenn Sie ein speicherintensives Programm ausführen und es dann beenden (das funktioniert mit jeder beliebigen Freeware zur Arbeitsspeicheroptimierung, die große Speichermengen zuordnet und sie dann wieder freigibt) oder wenn Sie nur eine sehr große Datei kopieren, steigt der Wert des freien Speichers und der Wert für den genutzten physischen Speicher nimmt ab, während das System den freigegebenen Speicher wieder zurückgewinnt. Langfristig gesehen wird der Cache jedoch von SuperFetch erneut mit den Daten gefüllt, die aus dem Speicher entfernt wurden, sodass der Wert für die Zwischenspeicherung steigt und der Wert des freien Speichers abnimmt.
Überwachen des Speichers
Überwachen des Speichers (Klicken Sie zum Verkleinern auf das Bild)
Überwachen des Speichers
Überwachen des Speichers (Klicken Sie zum Vergrößern auf das Bild)

ReadyBoost
Was Geschwindigkeit angeht, ziehen CPUs und Speicher derzeit zügig an Festplatten vorbei. Deshalb stellen Datenträger einen allgemeinen Systemleistungsengpass dar. Zufällige Datenträger-E/A-Vorgänge sind besonders teuer, weil die Kopfsuchzeiten von Datenträgern sich in der Regel in einem Bereich von 10 Millisekunden befinden. Das ist eine Ewigkeit für die heutigen 3 GHz-Prozessoren. Während sich der Arbeitsspeicher ideal für das Zwischenspeichern von Datenträgerdaten eignet, ist er verhältnismäßig teuer. Flashspeicher dagegen sind normalerweise billiger und können zufälliges Lesen bis zu 10 Mal schneller verarbeiten als eine typische Festplatte. Windows Vista enthält deshalb das ReadyBoost-Feature, um Flashspeichergeräte zu nutzen. Dabei wird eine unmittelbare Zwischenspeicherebene erstellt, die logisch zwischen dem Speicher und den Festplatten positioniert ist.
ReadyBoost besteht aus einem Dienst, der in %SystemRoot%\System32\Emdmgmt.dll (ausgeführt in einem Servicehostdienst) implementiert wurde, und hat einen Volumefiltertreiber, %SystemRoot%\System32\Drivers\Ecache.sys. (Emd steht für External Memory Device. Das ist der Arbeitsname, der für ReadyBoost während seiner Entwicklung verwendet wurde.) Wenn Sie ein Flashgerät wie einen USB-Schlüssel in ein System einfügen, untersucht der ReadyBoost-Dienst das Gerät, um seine Leistungsmerkmale zu bestimmen, und speichert diese Ergebnisse in HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\Currentversion\Emdmgmt (siehe Abbildung 1).
Abbildung 1 Testergebnisse von ReadyBoost in der Registrierung
Abbildung 1 Testergebnisse von ReadyBoost in der Registrierung (Klicken Sie zum Verkleinern auf das Bild)
Abbildung 1 Testergebnisse von ReadyBoost in der Registrierung
Abbildung 1 Testergebnisse von ReadyBoost in der Registrierung (Klicken Sie zum Vergrößern auf das Bild)
Falls Sie nicht bereits ein Gerät für die Zwischenspeicherung verwenden und falls das neue Gerät zwischen 256 MB und 32 GB groß ist, eine Übertragungsrate von 2,5 MB/s oder höher für zufällige 4 KB-Lesevorgänge und eine Übertragungsrate von 1,75 MB/s oder höher für zufällige 512 KB-Schreibvorgänge aufweist, dann werden Sie von ReadyBoost gefragt, ob Sie bis zu 4 GB des Speichers der Datenträgerzwischenspeicherung zuweisen möchten. (Obwohl ReadyBoost NTFS verwenden kann, beschränkt es die maximale Cachegröße auf 4 GB, um FAT32-Einschränkungen zu berücksichtigen.) Wenn Sie zustimmen, erstellt der Dienst im Stammverzeichnis des Geräts eine Cachedatei mit dem Namen ReadyBoost.sfcache und weist SuperFetch an, den Cache im Hintergrund wieder zu füllen.
Nachdem der ReadyBoost-Dienst das Zwischenspeichern initialisiert, fängt der Ecache.sys-Gerätetreiber alle Lese- und Schreibvorgänge ab, speichert sie auf lokalen Festplattenvolumes (beispielsweise C:\) und kopiert alle Daten, die geschrieben werden, in die Cachedatei, die der Dienst erstellt hat. Ecache.sys komprimiert die Daten und erreicht in der Regel ein Komprimierungsverhältnis von 2:1, sodass eine 4 GB Cachedatei gewöhnlich 8 GB Daten enthält. Der Treiber verschlüsselt jeden Block, den er mit der AES-Verschlüsselung (Advanced Encryption Standard) schreibt, mit einem zufällig generierten startspezifischen Sitzungsschlüssel, um den Datenschutz der Daten im Cache des Geräts zu garantieren, falls das Gerät aus dem System entfernt wird.
Wenn ReadyBoost zufällige Lesevorgänge erkennt, die aus dem Cache bedient werden können, werden sie aus dem Cache verarbeitet. Da Festplatten jedoch einen besseren sequenziellen Lesezugriff haben als Flashspeicher, ermöglicht es den Lesevorgängen, die Teil eines sequenziellen Zugriffsmusters sind, den direkten Zugriff auf den Datenträger, auch wenn sich die Daten im Cache befinden.

ReadyBoot
Windows Vista verwendet den gleichen Vorabrufvorgang, den Windows XP immer dann verwendet, wenn das System weniger als 512 MB Speicher zur Verfügung hat. Wenn das System jedoch 700 MB oder mehr Arbeitsspeicher hat, verwendet es einen RAM-Cache, um den Startvorgang zu optimieren. Die Größe des Cache hängt vom verfügbaren Gesamtarbeitsspeicher ab, ist jedoch groß genug, um einen geeigneten Cache zu erstellen und dem System trotzdem den Speicher zu gewähren, den es für einen reibungslosen Start benötigt.
Nach jedem Systemstart verwendet der ReadyBoost-Dienst (der gleiche Dienst, der das oben beschriebene ReadyBoost-Feature implementiert) eine CPU-Leerlaufzeit, um für den nächsten Systemstart einen Cacheplan für die Systemstartzeit zu erstellen. Er analysiert die Dateiablaufverfolgungsinformationen der fünf vorherigen Systemstarts und stellt fest, auf welche Dateien zugegriffen wurde und wo sie sich auf dem Datenträger befinden. Er speichert die verarbeiteten Informationen in %SystemRoot%\Prefetch\Readyboot als .fx-Dateien und speichert den Cacheplan unter HKLM\System\CurrentControlSet\Services\Ecache\Parameters in den REG_BINARY-Werten, die nach den internen Datenträgervolumes, auf die sie sich beziehen, benannt werden.
Der Cache wird vom gleichen Gerätetreiber implementiert, der den ReadyBoost-Cache (Ecache. sys) implementiert, doch das Laden des Zwischenspeichers wird beim Systemstart vom ReadyBoost-Dienst geleitet. Obwohl der Cache des Systemstarts so komprimiert wird wie der ReadyBoost-Cache, besteht ein weiterer Unterschied zwischen der ReadyBoost- und der ReadyBoot-Cacheverwaltung. Im ReadyBoot-Modus ändert sich, abgesehen von Aktualisierungen des ReadyBoot-Diensts, der Cache nicht, um die Daten, die während des Systemstarts gelesen oder geschrieben werden, zu reflektieren. Der ReadyBoost-Dienst löscht den Cache 90 Sekunden nach dem Systemstart, oder wenn andere Speicheranforderungen es rechtfertigen, und zeichnet die Cachestatistiken in HKLM\System\CurrentControlSet\Services\Ecache\Parameters\ReadyBootStats auf (siehe Abbildung 2). Microsoft-Leistungstests zeigen, dass ReadyBoot eine Verbesserung der Leistung ermöglicht, die ungefähr 20 Prozent über der Leistung des älteren Windows XP-Vorabrufs liegt.
Abbildung 2 ReadyBoot-Leistungsstatistiken
Abbildung 2 ReadyBoot-Leistungsstatistiken (Klicken Sie zum Verkleinern auf das Bild)
Abbildung 2 ReadyBoot-Leistungsstatistiken
Abbildung 2 ReadyBoot-Leistungsstatistiken (Klicken Sie zum Vergrößern auf das Bild)

ReadyDrive
ReadyDrive ist ein Windows Vista-Feature, das die neuen Hybridfestplatten (H-HDD) nutzt. Eine H-HDD ist ein Datenträger mit eingebettetem permanentem Flashspeicher (auch NVRAM genannt). Reguläre H-HDDs verfügen über 50 MB bis 512 MB Cache, doch die Cachebeschränkung in Windows Vista liegt bei 2 TB.
Windows Vista verwendet ATA-8-Befehle, um die Datenträgerdaten zu definieren, die im Flashspeicher gespeichert werden sollen. Zum Beispiel werden in Windows Vista Systemstartdaten beim Herunterfahren des Systems im Cache gespeichert, was einen schnelleren Neustart ermöglicht. Außerdem werden im Ruhezustand des Systems Teile der Ruhezustanddateidaten im Cache gespeichert, damit die nachfolgende Wiederaufnahme schneller erfolgt. Da der Cache sogar dann aktiviert wird, wenn der Datenträger heruntergefahren ist, kann Windows den Flashspeicher als einen Cache zum Schreiben auf den Datenträger verwenden, was verhindert, dass der Datenträger hochgefahren wird, wenn das System vom Akku betrieben wird. Wird der Datenträgerspindel ausgeschaltet, kann dies viel Strom sparen, der bei normaler Nutzung vom Datenträgerlaufwerk verbraucht wird.

Startkonfigurationsdatenbank
Windows Vista hat mehrere Aspekte des Systemstarts und Herunterfahrens verbessert. Der Systemstart wurde folgendermaßen verbessert: Es wurde eine Startkonfigurationsdatenbank (Boot Configuration Database, BCD) für das Speichern der System- und Betriebssystem-Startkonfiguration, ein neuer Ablauf und eine neue Organisation für Systemstartprozesse, eine neue Anmeldearchitektur und die Unterstützung für verzögerte Autostartdienste eingeführt. Die Änderungen für das Herunterfahren in Windows Vista umfassen die Benachrichtigung für Windows-Dienste vor dem Herunterfahren, die Reihenfolge von Windows-Diensten beim Herunterfahren und eine wichtige Änderung an der Art, wie das Betriebssystem die Übergänge der Energieverwaltung handhabt.
Eine der offensichtlichsten Änderungen am Startprozess ist das Fehlen von Boot.ini im Stammverzeichnis des Systemvolumes. Das liegt daran, dass die Startkonfiguration, die auf früheren Versionen von Windows in der Boot.ini-Textdatei gespeichert wurde, jetzt in der Startkonfigurationsdatenbank gespeichert wird. Einer der Gründe dafür, warum Windows Vista die Startkonfigurationsdatenbank verwendet, liegt darin, dass sie die zwei aktuellen Startkonfigurationen vereinigt, die von Windows unterstützt werden: MBR (Master Boot Record) und EFI (Extensible Firmware Interface). MBR wird gewöhnlich von x86- und x64-Desktopsystemen verwendet, während EFI von Itanium-basierten Systemen verwendet wird (obwohl anzunehmen ist, dass Desktop-PCs schon bald mit EFI-Unterstützung geliefert werden). Die Startkonfigurationsdatenbank abstrahiert die Firmware und hat andere Vorteile gegenüber Boot.ini, wie z. B. Unterstützung für Unicode-Zeichenfolgen und alternative, vor dem Systemstart ausführbare Dateien.
Die Startkonfigurationsdatenbank wird im Grunde auf der Festplatte gespeichert, und zwar in einer Registrierungsgruppe, die in die Windows-Registrierung für den Zugriff über die Registrierungs-APIs geladen wird. Auf PCs speichert Windows sie in \Boot\Bcd auf dem Systemvolume. Auf EFI-Systemen wird sie auf der EFI-Systempartition gespeichert. Wenn die Registrierungsgruppe geladen ist, erscheint sie unter HKLM\Bcd00000000, doch ihr internes Format ist nicht dokumentiert, sodass die Bearbeitung die Verwendung eines Tools wie %SystemRoot%\System32\Bcdedit.exe erfordert. Schnittstellen für das Manipulieren der Startkonfigurationsdatenbank werden außerdem den Skripts und benutzerdefinierten Editoren über WMI (Windows Management Instrumentation) zur Verfügung gestellt. Sie können das Dienstprogramm für die Windows-Systemkonfiguration (%SystemRoot%\System32\Msconfig.exe) verwenden, um grundlegende Parameter zu bearbeiten oder hinzuzufügen, z. B. die Optionen für das Kerneldebuggen.
Die Startkonfigurationsdatenbank trennt plattformübergreifende Starteinstellungen, wie z. B. die Standard-Betriebssystemauswahl und die Startmenüzeitsperre, von betriebssystemspezifischen Einstellungen, wie z. B. den Betriebssystem-Startoptionen und dem Pfad zum Betriebssystem-Ladeprogramm. In Abbildung 3 wird zum Beispiel illustriert, dass beim Ausführen von Bcdedit ohne Verwendung von Befehlszeilenoptionen die Plattformeinstellungen im Abschnitt „Windows-Start-Manager“ oben auf der Ausgabe angezeigt werden, gefolgt von betriebssystemspezifischen Einstellungen im Abschnitt „Windows-Startladeprogramm“.
Abbildung 3 In BCDEdit angezeigte Einstellungen
Abbildung 3 In BCDEdit angezeigte Einstellungen (Klicken Sie zum Verkleinern auf das Bild)
Abbildung 3 In BCDEdit angezeigte Einstellungen
Abbildung 3 In BCDEdit angezeigte Einstellungen (Klicken Sie zum Vergrößern auf das Bild)
Wenn Sie eine Windows Vista-Installation starten, teilt dieses neue Schema die Aufgaben, die auf älteren Versionen von Windows vom Betriebssystemladeprogramm (Ntldr) verarbeitet wurden, in zwei verschiedene EXE-Dateien: \BootMgr und %SystemRoot%\System32\Winload.exe. Bootmgr liest die Startkonfigurationsdatenbank und zeigt das Startmenü des Betriebssystems an, während Winload.exe das Betriebssystem lädt. Wenn Sie einen ordnungsgemäßen Start durchführen, lädt Winload.exe die Systemstartgerätetreiber und zentralen Betriebssystemdateien, einschließlich Ntoskrnl.exe, und überträgt die Steuerung auf das Betriebssystem. Wenn das System aus dem Ruhezustand wiederhergestellt wird, führt es %SystemRoot%\System32\Winresume.exe aus, um die Ruhezustanddaten in den Speicher zu laden und das Betriebssystem wiederherzustellen.
Bootmgr unterstützt außerdem zusätzliche, vor dem Start ausführbare Dateien. Windows Vista enthält die Windows-Speicherdiagnose (\Boot\Memtest.exe), die als eine Option zum Überprüfen des RAM-Zustands vorkonfiguriert ist, doch Drittanbieter können ihre eigenen vor dem Start ausführbare Dateien hinzufügen, die als Optionen im Startmenü von Bootmgr angezeigt werden.

Startprozesse
In älteren Versionen von Windows war die Beziehung zwischen verschiedenen Systemprozessen nicht intuitiv. Bei Systemstart zum Beispiel werden vom interaktiven Anmelde-Manager (%SystemRoot%\System32\Winlogon.exe) der Dienst für das lokale Sicherheitsautoritäts-Subsystem (Lsass.exe) und der Dienststeuerungs-Manager (Services.exe) gestartet. Des Weiteren verwendet Windows einen Namespacecontainer, der Sitzung genannt wird, um die Prozesse zu isolieren, die in verschiedenen Anmeldesitzungen ausgeführt werden. Vor Windows Vista mussten sich die Benutzer an der gemeinsam mit der Konsole verwendeten Sitzung 0 anmelden. Das ist die von Systemprozessen verwendete Sitzung, die potenzielle Sicherheitsrisiken verursachte. Solch ein Problem trat zum Beispiel dann auf, wenn ein schlecht geschriebener Windows-Dienst, der in Sitzung 0 ausgeführt wurde, eine Benutzeroberfläche auf der interaktiven Konsole anzeigte und dadurch schädlichen Programmen ermöglichte, das Fenster durch Methoden wie den so genannten Shatter Attacks anzugreifen und sich möglicherweise Administratorrechte zu verschaffen.
Um diese Probleme zu behandeln, wurden mehrere Systemprozesse für Windows Vista neu entworfen. Der Sitzungs-Manager (Smss.exe) ist der erste Benutzermodusprozess, der wie in älteren Versionen von Windows beim Systemstart erstellt wird, doch in Windows Vista wird eine zweite Instanz des Sitzungs-Managers gestartet, um Sitzung 0 zu konfigurieren, die ausschließlich den Systemprozessen zugeordnet ist. Der Sitzungs-Manager-Prozess für Sitzung 0 startet die Windows-Startanwendung (Wininit.exe), ein Windows-Subsystemprozess (Csrss.exe) für Sitzung 0, und wird dann beendet. Die Windows-Startanwendung fährt fort, indem sie den Dienststeuerungs-Manager, den Dienst für das lokale Sicherheitsautoritäts-Subsystem und einen neuen Prozess, den lokalen Sitzungs-Manager (Lsm.exe), der die Terminalserververbindungen für den Computer verwaltet, startet.
Wenn ein Benutzer sich beim System anmeldet, erstellt der anfängliche Sitzungs-Manager eine neue Instanz von sich, um die neue Sitzung zu konfigurieren. Der neue Smss.exe-Prozess startet einen Windows-Subsystemprozess und einen Winlogon-Prozess für die neue Sitzung. Der Umstand, dass der Sitzungs-Manager sich selbst kopiert, um neue Sitzungen zu initialisieren, bietet keine Vorteile auf einem Clientsystem, doch auf Windows Server „Longhorn“-Systemen, die als Terminalserver fungieren, können mehrere Kopien gleichzeitig ausgeführt werden, um eine schnellere Anmeldung mehrerer Benutzer zu ermöglichen.
Mit dieser neuen Architektur werden Systemprozesse, einschließlich Windows-Diensten, in Sitzung 0 isoliert. Wenn ein Windows-Dienst, der in Sitzung 0 ausgeführt wird, eine Benutzeroberfläche anzeigt, benachrichtigt der Dienst zur Erkennung interaktiver Dienste (%SystemRoot%\System32\UI0Detect.exe) alle angemeldeten Administratoren, indem er im Sicherheitskontext des Benutzers eine neue Kopie von sich selbst startet und die in Abbildung 4 dargestellte Nachricht anzeigt. Wenn der Benutzer die Schaltfläche „Show me the message“ (Meldung anzeigen) auswählt, schaltet der Dienst auf den Windows-Dienstdesktop, auf dem der Benutzer mit der Benutzeroberfläche des Diensts interagieren und dann zu seinem/ihrem eigenen Desktop zurückkehren kann. Weitere Informationen zu den Prozessen beim Systemstart erhalten Sie in der Randleiste „Anzeigen der Startprozessbeziehungen“.
Abbildung 4 Anzeige eines Fensters durch den Dienst
Abbildung 4 Anzeige eines Fensters durch den Dienst (Klicken Sie zum Verkleinern auf das Bild)
Abbildung 4 Anzeige eines Fensters durch den Dienst
Abbildung 4 Anzeige eines Fensters durch den Dienst (Klicken Sie zum Vergrößern auf das Bild)
Anzeigen der Startprozessbeziehungen
Sie können den Process Explorer von Sysinternals (microsoft.com/technet/sysinternals) verwenden, um die Prozessstartstruktur von Windows Vista anzuzeigen.
Der Screenshot enthält die Sitzungsspalte, die Sie durch den Spaltendialog von Process Explorer hinzufügen können. Der hervorgehobene Prozess ist der anfängliche Smss.exe-Prozess. Darunter befinden sich Csrss.exe und Wininit.exe der Sitzung 0, die linksbündig ausgerichtet sind, weil ihr übergeordneter Prozess, die Instanz von Smss.exe, die die Sitzung 0 konfiguriert hat, beendet wurde. Die drei untergeordneten Elemente von Wininit sind Services.exe, Lsass.exe und Lsm.exe.
Prozess Explorer ermittelt, dass ein Satz von Prozessen in Sitzung 1 ausgeführt wird, und das ist die Sitzung, bei der ich durch eine Remotedesktopverbindung angemeldet bin. Process Explorer zeigt die Prozesse, die im selben Konto wie er selbst ausgeführt werden, blau markiert an. Abschließend wurde Sitzung 2 initialisiert, um die Vorkehrungen für einen Benutzer zu treffen, der sich bei der Konsole anmeldet und eine neue Anmeldesitzung erstellt. Es ist diese Sitzung, in der Winlogon LogonUI ausführt, um dem Benutzer einer neuen Konsole die Aufforderung zu erteilen, STRG+ALT+ENTF zu drücken, um sich anzumelden. Es ist ebenfalls diese Sitzung, in der Logonui.exe den Benutzer zur Angabe seiner/ihrer Anmeldeinformationen auffordert.
Startprozess und Sitzungsinformationen
Startprozess und Sitzungsinformationen (Klicken Sie zum Verkleinern auf das Bild)
Startprozess und Sitzungsinformationen
Startprozess und Sitzungsinformationen (Klicken Sie zum Vergrößern auf das Bild)

Anmeldeinformationsanbieter
Sogar die Anmeldearchitektur wurde in Windows Vista geändert. In früheren Versionen von Windows hat der Winlogon-Prozess die in der Registrierung angegebene GINA-DLL (Graphical Identification and Authentication) geladen, um eine Anmeldebenutzeroberfläche anzuzeigen, die den Benutzer zur Angabe der Anmeldeinformationen aufforderte. Leider weist das GINA-Modell eine Reihe von Einschränkungen auf, einschließlich der Tatsache, dass nur eine GINA konfiguriert werden kann, das Schreiben einer vollständigen GINA für Drittanbieter schwierig ist und dass benutzerdefinierte GINAs, die keine standardmäßigen Benutzeroberflächen haben, die Windows-Benutzerfunktionalität verändern.
Statt GINA verwendet Windows Vista die neue Anmeldeinformationsarchitektur. Winlogon startet einen getrennten Prozess, den „Logon User Interface Host“ (Logonui.exe), der die Anmeldeinformationsanbieter lädt, die in HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\Currentversion\Authentication\Credential Providers konfiguriert sind. LogonUI kann mehrere Anmeldeinformationsanbieter gleichzeitig hosten. Die interaktiven Anbieter (Authui.dll) und Smartcardanbieter (Smart-cardcredentialprovider.dll) sind im Lieferumfang von Windows Vista enthalten. Um eine einheitliche Benutzerfunktionalität zu gewährleisten, verwaltet LogonUI die Benutzeroberfläche, die den Endbenutzern angezeigt wird, doch sie ermöglicht außerdem den Anmeldeinformationsanbietern, benutzerdefinierte Elemente wie Text, Symbole und Bearbeitungssteuerelemente anzugeben.

Verzögerte Autostartdienste
Wenn Sie sich schon einmal bei einem Windows-System sofort nach Systemstart angemeldet haben, werden Sie die zeitliche Verzögerung bemerkt haben, bis Ihr Desktop vollständig konfiguriert ist und Sie mit der Shell und beliebigen Anwendungen, die Sie starten, interagieren können. Während Sie sich anmelden, startet der Dienststeuerungs-Manager viele Windows-Dienste, die als automatische Startdienste konfiguriert sind und deshalb zur Startzeit aktiviert werden. Viele Dienste führen CPU- und datenträgerintensive Initialisierungen durch, die mit Ihren Anmeldeaktivitäten konkurrieren. Um dies zu berücksichtigen, führt Windows Vista einen neuen Dienststarttyp ein, der sich verzögerter automatischer Start nennt und den die Dienste verwenden können, wenn sie nicht sofort nach dem Windows-Start aktiv sein müssen.
Der Dienststeuerungs-Manager startet Dienste, die für den verzögerten automatischen Start konfiguriert wurden, nachdem das Starten der Autostartdienste abgeschlossen ist, und er legt die Priorität ihres anfänglichen Threads auf THREAD_PRIORITY_LOWEST fest. Diese Prioritätsebene führt dazu, dass alle Datenträger-E/A-Vorgänge, die der Thread durchführt, eine sehr niedrige E/A-Priorität erhalten. Nachdem ein Dienst das Initialisieren abgeschlossen hat, legt der Dienststeuerungs-Manager seine Priorität auf normal fest. Diese Kombination von verschobenem Start, der niedrigen CPU- und Speicherpriorität sowie der Hintergrunddatenträgerpriorität vermindert deutlich die Beeinträchtigung der Benutzeranmeldung. Viele Windows-Dienste, einschließlich der intelligenten Hintergrundübertragung, Windows Update-Client und Windows Media® Center, verwenden den neuen Starttyp, um die Leistung der Anmeldungen nach dem Systemstart zu verbessern.

Herunterfahren
Ein Problem, das die Programmierer von Windows-Diensten geplagt hat, bestand darin, dass ihnen beim Herunterfahren von Windows in der Regel höchstens zwanzig Sekunden zur Verfügung stehen, um eine Bereinigung durchzuführen. Die Versionen vor Windows Vista haben ein sauberes Herunterfahren, das wartet, bis alle Dienste beendet sind, nicht unterstützt, weil ein umständlicher Dienst das Herunterfahren endlos aufhalten kann. Einige Dienste, wie beispielsweise jene, die über netzwerkbezogene Vorgänge zum Herunterfahren verfügen oder große Datenmengen auf Datenträger speichern müssen, benötigen möglicherweise mehr Zeit, und deshalb ermöglicht Windows Vista, dass ein Dienst eine Benachrichtigung vor dem Herunterfahren anfordern kann.
Wenn Windows Vista heruntergefahren wird, benachrichtigt der Dienststeuerungs-Manager zuerst die Dienste, die eine Benachrichtigung vor dem Herunterfahren angefordert haben. Er wartet für unbegrenzte Zeit, bis diese Dienste beendet sind, doch wenn sie einen Fehler haben und auf seine Abfragen nicht antworten, gibt der Dienststeuerungs-Manager auf und fährt nach drei Minuten fort. Nachdem diese Dienste beendet wurden oder die Zeitsperre abgelaufen ist, fährt der Dienststeuerungs-Manager fort, indem er die restlichen Dienste auf die alte Art herunterfährt. Die Gruppenrichtlinie und Windows Update Services registrieren die Benachrichtigung vor dem Herunterfahren in einer neuen Windows Vista-Installation.
Die Gruppenrichtlinie und die Windows Update Services verwenden außerdem ein anderes Windows Vista-Dienstfeature: die Reihenfolge beim Herunterfahren. Dienste konnten schon immer Startabhängigkeiten angeben, die der Dienststeuerungs-Manager Startdiensten in einer ihnen dienlichen Reihenfolge gewährt, doch in Versionen vor Windows Vista konnten sie keine Abhängigkeiten für das Herunterfahren angeben. Jetzt können sich Dienste, die sich für die Benachrichtigung vor dem Herunterfahren registrieren, außerdem für die in HKLM\System\CurrentControlSet\Control\PreshutdownOrder gespeicherte Liste registrieren. Dann beendet der Dienststeuerungs-Manager sie in der entsprechenden Reihenfolge. Weitere Informationen zu diesen Diensten erhalten Sie in der Randleiste unter „Erkennen eines verzögerten Autostarts und Dienste zur Unterstützung vor dem Herunterfahren".

Energieverwaltung
Standby und Ruhezustand sind andere Arten des Herunterfahrens, und die umständliche Energieverwaltung in Treibern und Anwendungen hat schon Probleme bereitet, seit Windows 2000 die Energieverwaltung in der Windows NT®-basierten Reihe der Windows-Betriebssysteme eingeführt hat. Viele Benutzer gingen davon aus, dass ihr Laptopsystem in den Ruhezustand wechselt oder unterbrochen wird, wenn Sie den Laptop schließen, bevor sie sich auf den Weg machen. Am Ziel wurden sie dann mit einer überhitzten Tragetasche, einer abgelaufenen Batterie und einem Verlust von Daten konfrontiert. Das lag daran, dass Windows die Gerätetreiber und Anwendungen immer um ihre Zustimmung gefragt hat, um den Betriebszustand zu ändern. Dabei konnte ein einziger Treiber oder eine einzige Anwendung, die nicht reagierte, den Übergang verhindern.
In Windows Vista informiert der Power Manager des Kernels nach wie vor die Treiber und Anwendungen über die Energiestatusänderungen, sodass sie sich darauf vorbereiten können, doch er benötigt keine Berechtigung mehr. Außerdem wartet der Power Manager höchstens 20 Sekunden, bis die Anwendungen auf die Änderungsbenachrichtigungen reagieren, statt der zwei Minuten, die er in älteren Versionen von Windows gewartet hat. Daher können Windows Vista-Benutzer jetzt mehr Vertrauen haben, dass ihre Systeme Ruhezustände und Unterbrechungen berücksichtigen.

Ausblick
Wie bereits erwähnt ist dies der zweite Teil einer dreiteiligen Artikelreihe. Im ersten Teil wurden die Verbesserungen am Windows Vista-Kernel in den Bereichen E/A-Vorgänge und Prozesse behandelt. In diesem Teil wurden die Verbesserungen in Windows Vista im Bereich Speicherverwaltung, Systemstart und Herunterfahren betrachtet. Im nächsten Teil wird die Reihe abgeschlossen mit einer Beschreibung der Änderungen, die am Kernel im Bereich Zuverlässigkeit und Sicherheit vorgenommen wurden.
Erkennen eines verzögerten Autostarts und Dienste zur Unterstützung vor dem Herunterfahren
Der integrierte SC-Befehl wurde in Windows Vista aktualisiert, um Dienste anzuzeigen, die als verzögerte Autostartdienste konfiguriert wurden:
Verwenden von SC zur Anzeige des Starttyps
Verwenden von SC zur Anzeige des Starttyps (Klicken Sie zum Verkleinern auf das Bild)
Verwenden von SC zur Anzeige des Starttyps
Verwenden von SC zur Anzeige des Starttyps (Klicken Sie zum Vergrößern auf das Bild)
Leider werden vom SC-Befehl Dienste, die eine Benachrichtigung vor dem Herunterfahren angefordert haben, nicht protokolliert, doch Sie können das PsService-Dienstprogramm von Sysinternals verwenden, um zu erkennen, ob ein Dienst eine Benachrichtigung vor dem Herunterfahren akzeptiert:
Anzeigen des Status vor dem Herunterfahren
Anzeigen des Status vor dem Herunterfahren (Klicken Sie zum Verkleinern auf das Bild)
Anzeigen des Status vor dem Herunterfahren
Anzeigen des Status vor dem Herunterfahren (Klicken Sie zum Vergrößern auf das Bild)

Mark Russinovich ist Technical Fellow in der Platform and Services Division von Microsoft. Er ist Mitautor von „Microsoft Windows Internals“ (Microsoft Press, 2004) und hält häufig Vorträge auf IT- und Entwicklerkonferenzen. Er wechselte bei der kürzlichen Übernahme des von ihm mitgegründeten Unternehmens Winternals Software zu Microsoft. Darüber hinaus gründete er Sysinternals, wo er die Dienstprogramme „Process Explorer“, „Filemon“ und „Regmon“ veröffentlichte.


 Mitteilung der Redaktion: Auszeichnungen
Mitteilung der Redaktion
Auszeichnungen
Joshua Trupin

IN DEN DREI JAHRZEHNTEN MEINES LEBENS ist es mir nicht gelungen, irgendetwas zu gewinnen. Beim Lotto habe ich nicht einmal drei Richtige. Bei Verlosungen ziehe ich immer die Nieten. Und auch beim Fußballtoto habe ich kein Glück.
Angesichts dieser Negativerfolge ist es kein Wunder, dass ich mich riesig gefreut habe, als ich endlich etwas gewonnen habe. Das TechNet Magazin wurde kürzlich mit vier Auszeichnungen der Society for Technical Communication (STC) bedacht. Wir stecken viel Arbeit in jede Ausgabe, und es ist schön, wenn diese Bemühungen Anerkennung finden. Ich möchte kurz unseren Mitarbeitern und Autoren für ihre Beiträge danken.
Unsere Ausgabe vom März/April 2006 enthielt ein klares und übersichtliches Handbuch für das Active Directory in Form eines Puzzleposters. Es war enorm populär und wir bekommen immer noch jeden Tag Anfragen für Kopien dieser Ausgabe! Die STC hat unser Poster mit einer Auszeichnung für Spitzenleistung bei Softwarehandbüchern bedacht.
Zwei Artikel wurden ebenfalls hoch bewertet. Sowohl der Artikel „Playing with Exchange in a Sandbox“ von Greg Taylor und Simon Hirten in der Ausgabe August 2006 und „Deconstructing Common Security Myths“ von Jesper Johansson und Steve Riley in der Ausgabe Mai/Juni 2006 wurde von der STC mit einer Auszeichnung für verdienstvolle Arbeit bedacht.
Das TechNet Magazin selbst erhielt eine Auszeichnung für Spitzenleistung im Bereich wissenschaftliche Zeitschriften & Fachzeitschriften. Ich bin sehr stolz auf diese Anerkennung, und dasselbe gilt für alle Mitglieder unseres Teams.
Doch wir werden uns nicht auf unseren Lorbeeren ausruhen. In dieser Ausgabe untersucht Mark Russinovich weitere Kerneländerungen in Windows Vista. Dies sind wichtige Informationen von anhaltendem Wert für alle IT-Fachleute, die im Bereich Desktopbereitstellung oder Supportdiensten tätig sind. Des Weiteren enthält das Magazin in diesem Monat detaillierte Artikel zu SQL Server, angefangen bei der Verwendung von Indexmetadaten über die Tabellenpartitionierung und Optionen mit hoher Verfügbarkeit bis hin zu Tipps für das Clustering.
Hier am One TechNet Magazine Plaza legen wir nie eine Pause ein. (Dafür sorgen schon die engen Termine). Doch hin und wieder freuen wir uns über eine Änderung des Schauplatzes. Vom 4. bis 8. Juni 2007 werden wir bei der Microsoft TechoEd in Orlando sein (siehe microsoft.com/teched). Kommen Sie vorbei, um einige der preisgekrönten Redakteure und Autoren des TechNet Magazin persönlich kennen zu lernen. Es gibt Werbegeschenke, und es ist einiges an Unterhaltung geplant. Wer weiß, vielleicht gewinnen Sie ja auch einen Preis. -JOSHUA TRUPIN
Unser Dank gilt folgenden technischen Experten von Microsoft: Vijay Bharadwaj, Paul Bowden, Elden Christensen, Manish Karla, Michael Murgolo, Rajeev Nagar, John Peng, Mark Russinovich, Abraham Samuel, Mark Scurrell, Jim Truher, George Walters und Buck Woody.

Joshua Trupin


 Toolbox: Neue Produkte f&#252;r IT-Profis
Toolbox
Neue Produkte für IT-Profis
Greg Steen

Verwalten der Netzwerksynchronisierung
ViceVersa Pro
www.tgrmn.com

Falls Ihre Infrastruktur nicht aus einem einzelnen Computer besteht, müssen Sie Dateien wahrscheinlich ständig in all Ihren Umgebungen verschieben. Von Protokolldateien über Anwendungsversionen bis hin zu Datenbanksicherungen werden Daten ständig über das Netzwerk übertragen. Daher ist es wichtig zu wissen, was kopiert werden muss, um die Synchronisierung verschiedener Umgebungen zu erhalten. Für die meisten IT-Fachleute ist das manuelle Übertragen dieser Dateien in die verschiedenen Umgebungen keine Option, einmal ganz abgesehen davon, dass es im Allgemeinen keine gute Idee ist, da es zu fehlerhaften Synchronisierungen führen kann.
Mit ViceVersa Pro von TGRMN Software können Sie diese Aufgaben leicht automatisieren und planen. Die Anwendung stellt vier verschiedene Kopiermodi bereit. „Basic Synchronization“ bietet Ihnen Synchronisierung vom Quell- zum Zielverzeichnis und mit dem Modus „Advanced Synchronization“ wird die bidirektionale Datei- und Verzeichnissynchronisierung mit Dateinachverfolgung ermöglicht. Bei den anderen beiden Modi handelt es sich um „Backup“ (mit der Ihr Quellverzeichnis gespiegelt wird) und „Consolidation“.
Der Sicherungsmodus spiegelt das Quell- im Zielverzeichnis wider, wobei Dateien zu diesem Zielverzeichnis hinzugefügt und gelöscht werden, doch Sie können auch die Dateireplikation auswählen, bei der nur Dateien ins Zielverzeichnis kopiert werden. Dies könnte sich als sehr nützlich erweisen, wenn Sie Benutzer haben, die Dinge unerwartet löschen. Bei der bidirektionalen Synchronisierung erfolgt die Synchronisierung, wie der Name schon sagt, in beide Richtungen. Zusätzlich wird die Nachverfolgung von Konflikten und Löschvorgängen ermöglicht. Wenn sich eine Datei vor der nächsten Synchronisierung sowohl im Quell- als auch im Zielverzeichnis ändert, wird auf diesen Konflikt hingewiesen, und Sie können das Problem manuell beheben. Die Konsolidierungsmethode ähnelt der bidirektionalen Synchronisierung, überwacht jedoch keine Konflikte oder Löschvorgänge.
Schutz vor Kopierfehlern und Datenverlust
Schutz vor Kopierfehlern und Datenverlust (Klicken Sie zum Verkleinern auf das Bild)
Schutz vor Kopierfehlern und Datenverlust
Schutz vor Kopierfehlern und Datenverlust (Klicken Sie zum Vergrößern auf das Bild)
ViceVersa Pro kann mit der integrierten Dateikomprimierung und den Dateiverschlüsselungsfunktionen im Sicherungsmodus bei Protokollversandaufgaben helfen. Die Anwendung komprimiert Ihre Quelldateien im Standard-gzip-Format, das dann kennwortgeschützt werden kann.
Die Anwendung verfügt auch über einen guten integrierten Dateivergleich, doch Sie können ViceVersa Pro so einstellen, dass ein externes Dateivergleichsprogramm verwendet wird, wenn Sie dies bevorzugen. Zur Unterstützung einer globalen Umgebung kann ViceVersa Unicode-Zeichen und Pfade mit mehr als 256 Zeichen verarbeiten. Die Anwendung verfügt außerdem über einen integrierten Support für die Internet-Zeitsynchronisierung, d. h, Sie können sie so einrichten, dass sie auf Ihren lokalen NTP-Computer oder einen externen NTP-Server verweist, wenn Sie ausgehende Anforderungen aus der Umgebung zulassen, in der Sie die Anwendung verwenden.
Bisweilen kann die Bandbreitennutzung Probleme bereiten, besonders dann, wenn Ihr Datenverkehr über eine VPN- oder WAN-Verbindung läuft. In diesem Fall können Sie die von der Anwendung für die einzelnen Synchronisierungsaufgaben verwendete Bandbreite mithilfe von ViceVersa beschränken. Dadurch kann von den Servern auch eine Reaktion auf Produktionsebene sichergestellt werden, auf die oder von denen Sie Dateien kopieren. Sie können bei Bedarf auch einen maximalen Schwellenwert für die CPU-Nutzung festlegen, um die Verfügbarkeit auf Ihrem Server sicherzustellen, wenn die Anwendung ausgeführt wird.
ViceVersa Pro schützt mithilfe eines sicheren Kopieralgorithmus vor Kopierfehlern und Datenverlust. Die Anwendung führt auch zyklische Redundanzüberprüfungen durch, um die Datenintegrität sicherzustellen. Sie können Synchronisierungsaufgaben so planen, dass sie fast in jedem beliebigen Abstand einschließlich Echtzeitmodus ausgeführt werden (dabei werden Dateien synchronisiert, wenn sie zu den Synchronisierungsordnern hinzugefügt oder daraus gelöscht werden).
Eine weitere praktische Funktion von ViceVersa Pro besteht darin, dass Sie über die Benutzeroberfläche eine Vorschau aller Vorgänge sehen können, bevor diese ausgeführt werden. So wird sichergestellt, dass Sie nur das Gewünschte kopieren. Nichts ist so unangenehm wie mehrere Gigabyte Protokolldateien im Systemverzeichnis.
Wenn Sie ein preisgünstiges Synchronisierungstool mit vielen Funktionen wünschen, dürfte ViceVersa Pro Ihre Bedürfnisse erfüllen.
Preis: 59,95 $ pro Einzelbenutzerlizenz.

Verwalten der Datenträger Ihres Systems
Partition Manager 8.0 Professional Edition
www.partition-manager.com/corporate/professional
Wenn Sie eine Anwendung suchen, die Ihnen beim Verwalten der Datenträger ihres Systems hilft, sollten Sie die Partition Manager 8.0 Professional Edition der Paragon Software Group in Betracht ziehen.
Die Kernfunktionalität der Windows® -basierten Anwendung besteht aus einer intuitiven assistentengesteuerten Schnittstelle, mit der Sie Festplattenpartitionen leicht erstellen, löschen, formatieren und deren Sichtbarkeit ändern können, egal, ob es sich um das FAT16/32-, NTFS-, Ext2/3- oder HPFS-Format handelt. Sie können auch die Größe vorhandener Partitionen korrigieren oder Partitionen von einem Datenträger auf einen anderen verschieben.
Des Weiteren können Sie Dateisystemtypen konvertieren, beispielsweise von FAT16/32 zu NTFS oder Ext2 zu Ext3 und umgekehrt. Beim Kopieren einer Partition auf mehrere Datenträger wird die Größe der Partition automatisch der Größe des Datenträgers angepasst, was praktisch sein kann, wenn Sie das Datenlaufwerk Ihres Systems erweitern möchten, ohne alle Dateien manuell kopieren zu müssen. Ein nützliches Feature von Version 8.0 ist die Möglichkeit eines „Hot Resize“, wobei Sie eine aktive NTFS-Partition vergrößern können, ohne Windows neu zu starten.
Vergrößern einer aktiven NTFS-Partition ohne Neustart
Vergrößern einer aktiven NTFS-Partition ohne Neustart (Klicken Sie zum Verkleinern auf das Bild)
Vergrößern einer aktiven NTFS-Partition ohne Neustart
Vergrößern einer aktiven NTFS-Partition ohne Neustart (Klicken Sie zum Vergrößern auf das Bild)
Ein weiteres hilfreiches Feature der Pro Edition ist die Möglichkeit, dynamische Datenträger in Basisdatenträger auf Windows 2000-, Windows XP- und Windows Server® 2003-Clients zu konvertieren. Der Partition Manager unterstützt Datenträger mindestens bis zu 500 GB (die Testgrenze von Paragon, also keine wirkliche physische Grenze) sowie FireWire- und per USB verbundene Laufwerke. Der Partition Manager unterstützt PATA- (IDE), SATA- und SCSI-Festplatten.
Mit dem Partition Manager können Sie eine Wiederherstellungs-CD (oder DVD oder sogar eine Diskette) erstellen, mit der Sie ein System nach einem totalen Datenträgerausfall wiederherstellen können. Wenn Sie versehentlich eine Partition löschen, während das System noch aktiv ist, können Sie die Löschung der Partition über die Oberfläche wieder rückgängig machen. Sie können sogar die Clustergröße Ihres Datenträgers ändern, um die Leistung zu optimieren. Die Anwendung bietet außerdem eine „virtuelle“ Ansicht „vor der Ausführung“, sodass Sie Ihre Datenträgeränderungen bewerten können, bevor Sie sie tatsächlich durchführen.
Mit dem Partition Manager 8.0 können Sie ein Laufwerk Ihres Systems auch aktualisieren. Die Anwendung ermöglicht das Kopieren einer Partition oder eines ganzen Festplattenbilds auf einen neuen Datenträger, wobei die Größe an die Zielpartition angepasst wird.
Der Partition Manager enthält zudem einen eingebetteten Datenträgerdefragmentierer, der Laufwerke defragmentieren kann, die bis zu 99 Prozent voll sind, obwohl Sie hoffentlich aktiv werden können, bevor ein Laufwerk diesen Zustand erreicht.
Preis: 99,95 $ für die Professional Edition.

Hinzufügen von automatischer Vervollständigung zum SQL Editor
SQL Prompt: IntelliSense für SQL
www.red-gate.com/products/SQL_Prompt/index.htm

Es ist verlockend, sich vorzustellen, dass alle Datenbanken mit logischen Benennungskonventionen in einer normalisierten Form erstellt und strukturiert werden, doch leider ist dies nicht der Fall. Als System- oder Datenbankadministrator stelle ich oft fest, dass ich mich beim Erstellen oder Ausführen von Abfragen immer wieder auf die Tabellenstruktur beziehen muss, und beim Entwickeln von Anwendungen ist dies sogar noch häufiger der Fall.
Obwohl SQL Server™ Management Studio für SQL Server 2005 dies durch die Integration eines Objektbrowsers in die Strukturansicht des Benutzeroberflächenbereichs sehr erleichtert hat, vermisse ich noch immer die Funktion, an die ich mich beim Visual Studio®-IDE so sehr gewöhnt habe: IntelliSense®. Glücklicherweise bietet Red-Gate Software mit SQL Prompt die automatische Vervollständigung für Microsoft SQL Server-Editoren an.
Die Anwendung wird in Ihrer Taskleiste ausgeführt und erkennt, wenn Sie die Arbeit in einem Editor beginnen. Zuerst werden Sie von SQL Prompt aufgefordert, die Verbindungsinformationen für diese Datenbank einzugeben, sodass alle Objektdaten zwischengespeichert werden können. Dies führt zu schnellerer Leistung und reduziert den Verkehr, doch wenn Sie ständig Objekte in der Datenbankinstanz ändern, müssen Sie den Cache (einfach mit zwei Mausklicks) löschen, um Ihre Änderungen in der Eingabeaufforderungsliste anzuzeigen.
SQL Prompt lässt sich nicht nur direkt in die Visual Studio IDEs, Enterprise Manager, Query Analyzer und SQL Server Management Studio integrieren, sondern auch in UltraEdit und EditPlus 2. Auf der Registerkarte „Optionen“ der Einstellungsbenutzeroberfläche können Sie angeben, mit welchen SQL-Schlüsselwörtern die Kandidatenliste ausgelöst werden soll (beispielsweise FROM, JOIN, EXEC und so weiter). Durch Auslösen von SQL Prompt mit SQL JOINS erhalten Sie sogar Ihre ON-Anweisung (vorausgesetzt, Sie haben die Referenz eingestellt, oder die Felder haben denselben Namen). Hier können Sie auch Textverknüpfungen zum Einfügen von Codeausschnitten festlegen. In der Anwendung bedeutet beispielsweise „ssf“ gefolgt von der Tabulatortaste „SELECT * FROM“. Mit SQL Prompt können Sie auch bestimmen, dass SQL-Schlüsselwörter beim Eingeben automatisch groß geschrieben werden. Diese Funktion und die Codeausschnitte sparen mit Sicherheit viel Zeit.
Auf der Registerkarte „Candidates“ (Kandidaten) der Einstellungsbenutzeroberfläche können Sie festlegen, ob SQL Prompt vollqualifizierte Spaltennamen, Präfix mit den Besitzer-/Schemainformationen verwendet und Ihre Namen in eckige Klammern eingefügt werden sollen. Sie können sogar festlegen, welche SQL-Funktionstypen in der Kandidatenliste angezeigt werden sollen. Wenn Sie SQL verwenden, ist dies ein sehr nützliches Tool.
SQL Prompt wird bis zur Veröffentlichung von Version 3.0 kostenlos erhältlich sein. Als dieser Artikel geschrieben wurde, war die Anwendung in der endgültigen Betaversion vorhanden. Der Preis für Version 3.0 ist noch nicht bekannt.
Preis: Kostenlos.

Berechnen der Seitengröße
Atomic Web Page Size Calculator
www.info-pack.com/pagesize
Die Bandbreite für Endbenutzer nimmt zu, und neue Technologien helfen, Webinhalte schneller an Endbenutzer zu liefern, doch die Seitengröße spielt noch immer eine Rolle. Eine große Zahl an Bytes kann bei einer Website mit starkem Datenverkehr zu hohen Bandbreitenkosten führen.
Das Dienstprogramm Atomic Page Size Calculator von Info-pack.com bietet eine preiswerte, einfache Möglichkeit, das Seitengewicht Ihrer Websiteseiten zu prüfen. Sie geben einfach die URL der Seite ein, deren Größe fragwürdig ist. Das Programm berechnet dann das Gewicht aller Elemente einschließlich Bildern, auf die extern verwiesen wird – also Elemente, die in den Webprotokollen für Ihre primäre Domäne nicht angezeigt werden.
Bandbreitenkosten im Auge behalten
Bandbreitenkosten im Auge behalten (Klicken Sie zum Verkleinern auf das Bild)
Bandbreitenkosten im Auge behalten
Bandbreitenkosten im Auge behalten (Klicken Sie zum Vergrößern auf das Bild)
Der Rechner unterstützt Seiten-, Bild- und JavaScript-Dateien, sodass Sie Daten zu den meisten Ressourcen Ihrer Seite abrufen können. Außerdem werden Sie von der Anwendung benachrichtigt, wenn diese eine „unterbrochene“ 404-Ressource findet. Wenn Ihnen die Gewichtsinformationen für Ihre URL vorliegen, klicken Sie auf die Schaltfläche „Report“ (Bericht), um die Aufschlüsselung der Größe und die Einschätzungen für die Zeit anzuzeigen, die zum Herunterladen dieser URL bei unterschiedlichen Verbindungsgeschwindigkeiten erforderlich ist.
Es wäre gut, wenn die Anwendung mehrere URLs gleichzeitig handhaben könnte. Vielleicht wird diese Funktion in eine zukünftige Version aufgenommen. Wenn Sie die Seitengröße der Seiten ihres Entwicklungsteams schnell überprüfen möchten, ist diese Anwendung wahrscheinlich das Richtige für Sie.
Preis: 19,95 $ direkt.

Kontaktaufnahme mit Toolbox
Wenn Sie ein Lieblingswerkzeug oder -dienstprogramm haben, das Ihrer Meinung nach hier vorgestellt werden sollte, dann schreiben Sie eine E-Mail (in englischer Sprache) an den Autor unter tntools@microsoft.com.
Greg Steen ist Technologieexperte, Unternehmer und Enthusiast. Er ist immer auf der Suche nach neuen Hilfsmitteln und Methoden, die die Arbeitsprozesse und Entwicklung von IT-Profis erleichtern.


 Schwerpunkt Dienstprogramme: SyncToy
Schwerpunkt Dienstprogramme
SyncToy
Jay Munro
Laden Sie den Code für diesen Artikel herunter: SynctToy (971KB)

KOPFSCHMERZEN sind an der Tagesordnung, wenn IT-Experten, Netzwerkadministratoren und Helpdesk-Mitarbeiter von einem Benutzer kontaktiert werden, dessen Computer abgestürzt ist, und wenn keine Datensicherung vorhanden ist. Sogar die erfahrensten Computerbenutzer dazu zu bringen, Dateien im Netzwerk und nicht nur lokal zu speichern, kann mühsam sein. SyncToy kann hierbei helfen.
SyncToy wurde ursprünglich dazu entworfen, digitale Fotos zwischen einer Kamera, einem Computer und externen Laufwerken zu synchronisieren, und stellt eine flexible und zuverlässige Möglichkeit zur Sicherung nahezu aller Dateitypen dar. Das Programm kann auf Windows Vista™, Windows® XP und Windows Server® 2003 ausgeführt werden und funktioniert mit lokalen, externen oder USB-Laufwerken sowie mit Netzwerk- oder Arbeitsgruppenfreigaben.
SyncToy verwendet eine Architektur mit gepaarten Ordnern, in der Sie ein linkes und ein rechtes Verzeichnis angeben. Sie können beliebig viele Ordnerpaare erstellen und einen oder mehrere Ordner mit einem einzigen Schaltflächenklick synchronisieren. Um ein Ordnerpaar zu erstellen, durchlaufen Sie zügig vier Schritte in einem Assistenten, in dem Sie einen Pfad eingeben bzw. einfügen oder zu einem Ort für das linke und rechte Verzeichnis navigieren. SyncToy erkennt die UNC-Dateibenennung (wie z. B. \\MyServer\Joe_smith\backup) sowie lokale Laufwerkszuordnungen und Pfade (E:\doc_backup). Nachdem die Pfade eingetragen sind, wählen Sie eine von fünf Aktionen aus, die SyncToy beim Vergleichen der Ordner durchführt.
Sync Kopiert die neuen und aktualisierten Dateien in beide Richtungen. Wenn Sie eine Datei in einem Ordner umbenennen oder löschen, wird diese Aktion im anderen repliziert.
Echo Kopiert neue und aktualisierte Dateien. Dateien werden nur vom linken zum rechten Ordner gelöscht und umbenannt.
Subscribe Kopiert aktualisierte Dateien von rechts nach links, und nur wenn die Datei bereits links vorhanden ist. Änderungen, die links vorgenommen werden, werden nicht nach rechts repliziert.
Contribute Kopiert neue und aktualisierte Dateien auf der linken Seite nach rechts und ignoriert Löschungen.
Combine Hält mehrere Computer im Gleichschritt, indem Dateien, die nur auf einer Seite existieren, auf die andere Seite kopiert werden. Dateien, die auf einer beliebigen Seite gelöscht oder umbenannt werden, sind nicht betroffen und werden nicht repliziert.
Wenn Sie die Aktion auswählen, wählen Sie einen passenden Namen für das Ordnerpaar, und das ist auch schon alles. SyncToy ermöglicht derzeit keine Bearbeitung von Pfaden oder Namensänderungen, nachdem ein Ordnerpaar bereits erstellt wurde. Wenn Ihnen dabei also ein Fehler unterläuft, wählen Sie das Ordnerpaar, klicken Sie auf die Löschoption, und erstellen Sie es erneut. Sie können die Optionen festlegen. Dazu gehört die Auswahl der Dateien und Unterverzeichnisse und die Frage, ob überschriebene Dateien gleich im Papierkorb abgelegt werden (dies ist die Standardeinstellung).
Synchronisieren der Dateien mit SyncToy
Synchronisieren der Dateien mit SyncToy (Klicken Sie zum Verkleinern auf das Bild)
Synchronisieren der Dateien mit SyncToy
Synchronisieren der Dateien mit SyncToy (Klicken Sie zum Vergrößern auf das Bild)

Das Hauptdialogfeld in SyncToy zeigt Ordnerpaare auf der linken Seite an, zusammen mit den Pfaden, Optionen und Aktionen für das ausgewählte Paar. Die Option „All Folder Pairs“ listet alle Ordnerpaare auf, und Sie können eine Vorschau aller ausgewählten Paare durchführen oder alle ausgewählten Paare ausführen. Erwartungsgemäß werden in der Vorschau alle Schritte so angezeigt, als ob die Synchronisierung tatsächlich erfolgt, doch es werden bei der Vorschau keine Änderungen durchgeführt. Dies empfiehlt sich vor allem dann, wenn Sie unbeaufsichtigte Synchronisierungen planen. Die Vorschau zeigt einen Bericht an, in dem die Vorgänge aufgelistet werden, die sie durchgeführt hätte. Wenn alles in Ordnung ist, klicken Sie auf „Run“.
Die Planung ist nicht integriert, obwohl die Hilfedatei eine relativ gute Anleitung für die Planwerkzeuge in Windows Vista und Windows XP enthält. Technisch nicht versierte Benutzer benötigen möglicherweise Hilfestellung beim Einrichten, doch dies ist nur ein einziges Mal nötig, da alle Änderungen in Ordnerpaaren, Aktionen und Optionen in SyncToy vorgenommen werden.
Obwohl es auf denselben Standards basiert wie reguläre Versandsoftware wird SyncToy, wie alle hochleistungsfähigen Werkzeuge, nicht von Microsoft, sondern durch Gemeinschaftsforen und Dokumentation unterstützt. Sie sind also auf sich selbst gestellt. Die Hilfedatei wurde für alle Verwendungsebenen verfasst und deckt die Features sehr ausführlich ab. Die Benutzeroberfläche ist so intuitiv, dass die Grundlagen schon nach der ersten Runde klar sind.
Hier können Sie SyncToy herunterladen und Ihren Benutzern zeigen, wie Dateien gesichert werden. Sie schlafen dann garantiert besser.

Jay Munro ist als Autor im Windows User Assistance-Team bei Microsoft tätig und hat sich auf Internet Explorer spezialisiert. Zuvor war er Projektleiter in Testumgebungen von PC Magazin.


 SQL&#160;– Fragen und Antworten: Sommerzeit, Serverspeicher und mehr
SQL – Fragen und Antworten
Sommerzeit, Serverspeicher und mehr
Herausgegeben von Nancy Michell

Sommerzeit
F: Muss ich angesichts der in den USA bevorstehenden Änderung der Sommerzeit, die in Übereinstimmung mit dem Energy Policy Act von 2005 erfolgt, SQL Server™ aktualisieren?
A: Nein. Zu diesem Zeitpunkt sind keine SQL Server-spezifischen Aktualisierungen erforderlich, um die Änderung der Sommerzeit zu unterstützen. SQL Server ruft zeitbezogene Daten aus dem zugrunde liegenden Betriebssystem ab. Das bedeutet, dass SQL Server die Werte des Betriebssystems verwendet und anzeigt, wenn das Betriebssystem die richtigen Daten und Zeiten berichtet. In Übereinstimmung mit der in den USA bevorstehenden Änderung der Sommerzeit müssen Sie Ihre Versionen von Windows® aktualisieren. Informationen hierzu finden Sie unter support.microsoft.com/kb/928388. Diese Aktualisierung ist aufgrund der bevorstehenden Änderung der Sommerzeit unter allen Windows-Betriebssystemen vor Windows Vista™ (enthält die Änderung bereits) erforderlich, einschließlich derjenigen, die SQL Server ausführen. (Auch in Australien werden Änderungen vorgenommen. Siehe support.microsoft.com/kb/912475.)

Herstellen einer Verbindung mit Windows Vista
F: Ich habe Windows Vista installiert und kann jetzt keine Verbindung zu SQL Server 2005 auf meinem System herstellen. Ich bin ein lokaler Administrator und konnte diese Verbindung bisher problemlos herstellen. Was ist passiert?
A: Hierbei handelt es sich um erwartetes Verhalten in Windows Vista und SQL Server 2005 ohne Service Pack 2 (SP2). Windows Vista besitzt ein neues Sicherheitsmodell (Benutzerkontensteuerung), das Ihre Mitgliedschaft in der lokalen Administratorgruppe erfasst und Sie bittet, Vorgänge zu überprüfen, für die Administratorrechte erforderlich sind. Wenn Sie auf die Schaltfläche „Zulassen“ klicken, werden Ihre Anmeldeinformationen einschließlich Ihres Administratortokens an die Anwendung gesendet. Im Fall vom SQL Server Management Studio (SSMS) wird kein Dialogfeld angezeigt, weil für die Ausführung des Tools keine Administratorrechte erforderlich sind. Das Problem besteht darin, dass die SQL Server 2005-Systemadministratorrolle standardmäßig die lokale Administratorgruppe aus dem Betriebssystem enthält. In der Vergangenheit hat Ihr Konto genau diese für den Zugriff auf SQL Server verwendet. Da Windows Vista diese Berechtigung nicht mitsendet, erhalten Sie keinen Zugriff.
Beachten Sie, dass SQL Server 2005 ohne SP2 nicht unter Windows Vista unterstützt wird und dass SP2 ein Tool hat, das Ihr Konto für Sie hinzufügt. Wenn Sie noch auf SP2 warten, kann dies leicht behoben werden. Ihr eigenes Windows-Benutzerkonto muss SQL Server, in Ihrem Fall der Systemadministratorrolle, hinzugefügt werden. Dies erreichen Sie, indem Sie mit der rechten Maustaste auf „SQL Server Management Studio“ klicken und „Ausführen als Administrator“ auswählen. Stellen Sie eine Verbindung zu Ihrem SQL Server her, und fügen Sie Ihr Windows-Konto der Systemadministratorrolle hinzu. Weitere Informationen hierzu finden Sie unter SQL Server Books Online (auf Englisch).

Transaktionsreplikation mit Ansichten
F: Wenn ich eine veröffentlichte Ansicht habe und diese aktualisiere, weiß ich, dass diese Transaktion repliziert wird. Wird die Transaktion jedoch auch repliziert, wenn ich die Basistabelle dieser Ansicht aktualisiere? Wird darüber hinaus die Transaktion repliziert, wenn ich von einer veröffentlichten Tabelle eine Ansicht erstelle und die Ansicht anstelle der Basistabelle aktualisiere?
A: Angenommen, die Basistabelle ist als Artikel in einer Veröffentlichung konfiguriert (d. h. auch sie ist für die Replikation konfiguriert), dann werden alle Aktualisierungen der Basistabelle repliziert.
Wenn Sie eine Ansicht replizieren, ist standardmäßig alles, was als Teil einer Ansicht repliziert wird, der Schemateil der Ansicht oder der Code hinter der Ansicht. Die zugrunde liegenden Daten gehören nicht dazu, es sei denn, Sie haben eine indizierte Ansicht. Jedes Mal, wenn Sie (auch ohne Replikation) eine Ansicht aktualisieren, in diesem Fall also eine Datenbearbeitungssprachen-Anweisung (Data Manipulation Language, DML) mit der Ansicht als Ziel ausführen, aktualisieren Sie tatsächlich nur die Daten in der zugrunde liegenden Tabelle, nicht die Ansicht. Eine Ansicht ist nur ein logischer Speicher einer Abfrageanweisung ohne verbundenen physischen Speicher (es sei denn, Sie verwenden auch hier indizierte Ansichten).

Maximaler Serverspeicher
F: Ich habe ein System, auf dem Windows Server® 2003 und SQL Server 2000 mit 5 GB RAM ausgeführt werden. Angenommen, ich verwende den /3 GB-Switch zum Erhöhen des virtuellen Adressspeichers für meinen Benutzermodus, den /PAE-Switch zum Laden der Windows-Kernelversion der physischen Adresserweiterung (PAE) und setze aktivierte AWE (Address Windowing Extensions) auf 1 (und aktiviere Sperrseiten im Speicher). Konfiguriert die Option für maximalen Serverspeicher bei aktivierten AWE nur die Größe des Datencaches oder die Größe aller Puffercaches (Daten, Prozesse, Sitzungen usw.)? Nur der Datencache kann den AWE-zugeordneten Speicher nutzen. Wenn ich den maximalen Serverspeicher auf 4 GB konfiguriere, verwendet der Datencache nur 1 GB (den durch AWE zugeordneten Teil)? Oder kann er dieses zusätzliche 1 GB verwenden und weiterhin verwenden oder mit allen anderen Speicherverbrauchern im Standardadressraum konkurrieren?
A: Ein maximaler Serverspeicher beschränkt immer die gesamte Pufferpoolgröße. Der einzige Verbraucher, der den AWE-zugeordneten Speicher nutzen kann, ist jedoch der Datencache.
Um auf Ihre erste Frage zurückzukommen: Auch mit aktivierten AWE beschränkt der maximale Serverspeicher den gesamten Pufferpool. Verbraucher, die keinen Datencache verwenden, verwenden aber nie AWE-zugeordneten Speicher.
Nun zu Ihrer zweiten Frage: Der Datencache verwendet AWE-zugeordneten Speicher sowie jeden anderen Speicher im Pufferpool, den SQL Server für geeignet hält. Es findet keine Begrenzung auf AWE-Speicher statt. Er ist nur zufällig der einzige Verbraucher, der AWE-Speicher nutzen kann. Weitere Informationen zum /3 GB-Switch erhalten Sie im Blog von Raymond Chen (auf Englisch).

Profilerstellung und Leistung
F: Ich arbeite mit einem SQL Server 2000, der in der Produktion gespiegelt wird. Wenn ich SQL Server Profiler auf dem Datenbankcomputer starte und die Ablaufverfolgungsdaten in eine Datei schreibe, stelle ich einen erheblichen Leistungsabfall fest. Warum?
A: Der Grund für den Leistungsabfall hängt davon ab, wo Sie Profiler ausführen. Wenn Sie Profiler interaktiv auf dem Servercomputer ausführen, verbrauchen die Benutzeroberfläche von Profiler sowie die CPU auf dem Server Speicher, was die Leistung beeinträchtigt.
Wenn Sie Profiler interaktiv auf einer Arbeitsstation ausführen, dann verschieben Sie Ereignisinformationen im gesamten Netzwerk. Dies wirkt sich auf den Durchsatz aus. Wenn Sie das gleiche Netzwerk für die Spiegelung verwenden, werden Sie dort ebenso eine Beeinträchtigung feststellen. Wenn Sie darüber hinaus die Profiler-Ausgabe auf einer Netzwerkfreigabe speichern, verschieben Sie Daten im gesamten Netzwerk, was die Leistung beeinträchtigt.
Die beste Methode, diese Folgen zu begrenzen, besteht wahrscheinlich darin, Profiler in nicht interaktivem Modus auf dem Server auszuführen, der die zu profilierende Instanz ausführt, und anschließend die Ausgabe zu einer lokalen Datei zu leiten. Mit dieser Methode werden zwar Serverressourcen verbraucht, die Auswirkung ist jedoch am geringsten. Sie funktioniert viel besser als die (speicherinterne) Profiler-Ablaufverfolgung. Die Dateiablaufverfolgung verwendet den Systemspeicher effizienter. Sie verfügt über größere Puffer und leert sie effektiver auf den Datenträger. Darüber hinaus besteht keine Abhängigkeit von externen Prozessen (wie bei SQL Server Profiler).
Schließlich werden die Ablaufverfolgungsdaten in eine Datenträgerdatei geschrieben, während Profiler noch das Profil erstellt. Die Ablaufverfolgungsdatei ist freigegeben, damit andere Personen die Echtzeitprofildaten von einem Remotestandort aus anzeigen können. Wenn Sie die Ablaufverfolgungsdatei interaktiv aufrufen, bedeutet dies, dass Sie Profiler manuell aufgerufen haben und eine Ausgabe am Bildschirm anzeigen. Ablaufverfolgungen können programmatisch ohne visuelle Ausgabe erstellt werden. Aus diesem Grund sollte die Ausführung nicht interaktiv stattfinden.
Sie können eine Freigabe zusätzlich zu einem lokalen Verzeichnis erstellen, und andere Benutzer können auf die dort gefundenen Dateien zugreifen. Dies stellt in der Regel kein Problem dar. Wie oben erwähnt, möchten Sie keine Ablaufverfolgungsausgabe an eine Datei auf einer Remotefreigabe senden, insbesondere nicht an eine, auf die über die gleiche Netzwerkpipe wie für die Spiegelung zugegriffen wird.
Sie sollten auch nur den Minimalsatz an Ereignissen auswählen, der für Ihre Untersuchung erforderlich ist. Die Ablaufverfolgungsdatei sollte auf dem schnellsten Laufwerk Ihres Systems gespeichert werden. Wenn möglich, sollte es sich um ein anderes Laufwerk handeln als das, auf dem sich die SQL Server-Datenbank und die Transaktionsprotokolle befinden. Wenn Sie weiterhin einen erheblichen Leistungsabfall feststellen, teilen Sie die Ereignisse in zwei oder mehr Verfolgungen auf, die jeweils auf eine andere Festplatte abzielen. Selbst wenn die Ablaufverfolgungen auf die gleiche Festplatte abzielen, profitieren Sie von einer Teilung, weil jede Verfolgung ihren eigenen Puffersatz besitzt. Weitere Informationen erhalten Sie unter sp_trace_create und Ähnlichem unter SQL Server Books Online (auf Englisch).

Clusterbildungsprobleme
F: Ich versuche SQL Server auf einem Cluster zu installieren, auf dem Windows Server 2003 ausgeführt wird. Bei jedem Versuch erhalte ich eine Fehlermeldung, die besagt, dass beim Ausführen erforderlicher Vorgänge auf den Clusterknoten ein Setupfehler aufgetreten ist. In der Datei „sqlstp.log“ steht:
Script file copied to '\\SERVER01\ADMIN$\SERVER01_MSSQLSERVER.iss' successfully.
Installing remote service (SERVER01)...
An error occured in the service create (SERVER01): 1069...
Was passiert?
A: Für diesen Fehler gibt es mehrere mögliche Gründe. Das Setup installiert den Windows NT®-Dienst auf allen ausgewählten Knoten, um die Installation auf den einzelnen Computern von einem Remotestandort aus zu verwalten. Daher müssen Sie sich auf einige Schwierigkeiten einstellen.
Erstens besitzen Ihre Domänenkontobenutzer möglicherweise eine Gruppenrichtlinie, die eine Berechtigung für das Anmelden als Dienst verweigert. (Beachten Sie, dass die Domänenrichtlinie die Richtlinie Ihres lokalen Computers außer Kraft setzt.) Stellen Sie sicher, dass Sie ein Konto ohne diese Einschränkungen verwenden.
Zweitens sollte das angemeldete Konto des Computers, auf dem Sie das Setup ausführen, aus folgenden Gründen auf allen Knoten über Administratorzugriff verfügen: Für den Hauptinstallationsvorgang wird ein Remoteregistrierungszugriff auf allen Computern benötigt. Setup kopiert „cnvsvc.exe“ in das Windows-Verzeichnis des Remotecomputers. Alternativ verwendet Setup Windows-APIs, die nur die angemeldete Kontoberechtigung für den Zugriff auf Remotecomputer verwenden. Aus diesen Gründen sollten Sie standardmäßig in allen Modi als Administrator angemeldet sein.

Notfallwiederherstellungsplan
F: Ich überlege, ob ich die Datenbankspiegelung (asynchroner Modus) oder den Protokollversand für die Implementierung meiner Notfallwiederherstellungsstrategie für meine SAP-Datenbanken verwenden soll. Meine Standorte für die Produktion und die Notfallwiederherstellung verfügen über eine 100 MB-Breitbandverbindung, die nicht dediziert für die Spiegelungssitzung verwendet wird. Die Verbindung wird von mehreren Spiegelungssitzungen oder sogar von anderen Notfallwiederherstellungsservern gemeinsam genutzt.
Wenn ein Netzwerkproblem auftritt, dem zufolge der Protokolldatensatz nicht an die Spiegelungsdatenbank gesendet werden kann, wird der Versuch dann wiederholt?
Gibt es einen Aufbewahrungszeitraum, wenn die Spiegelungssitzung angehalten wird? Gibt es, abgesehen von der Systemansicht, Protokollinformationen, mit denen ich den Datenverkehr während der Spiegelung und die Übertragung der Protokolldatensätze überwachen kann?
A: Beginnen wir mit dem Beantworten der Frage: Was ist die Wiederholungslogik von Datenbankspiegelungen? Hierfür gibt es zwei mögliche Betrachtungsweisen: Erstens: Wenn es sich um ein vorübergehendes Netzwerkproblem handelt, wird die Verbindung des Spiegelungssitzungsstatus getrennt. Der Standardnetzwerk-Timeoutwert beträgt 10 Sekunden. Folglich kann ein Protokolldatensatz nicht von der Prinzipaldatenbank an die Spiegelungsdatenbank gesendet werden. In solchen Fällen wird der Prinzipal weiter „offen“ ausgeführt, und für die Transaktion wird auf der Clientseite ein Commit ausgeführt. Sobald das Netzwerkproblem gelöst wurde, wird automatisch ohne Benutzereingriff eine Wiederholung der Spiegelungssitzung durchgeführt. Es wird mithilfe der Protokolldatensätze ein Aufholversuch unternommen. Die Partner werden zuerst synchronisiert, und sobald sie soweit sind, wird der Status synchronisiert.
Zweitens: Wenn es ein Wiederholungsproblem gibt, wird der Status der Spiegelungssitzung angehalten. Bei einem Wiederholungsproblem kann die Spiegelungsdatenbank nicht die Protokolldatensätze in ihrer Datenbank übertragen. Wiederholungsprobleme werden hauptsächlich durch eine nicht gefundene physische Datei oder durch unzureichenden Speicherplatz verursacht. In solchen Fällen wird der Prinzipal weiter offen ausgeführt, und für die Transaktion wird folglich auf der Clientseite ein Commit ausgeführt. Nachdem Sie das Wiederholungsproblem manuell auf dem Spiegelserver gelöst haben, erfordert die Spiegelungssitzung Eingriffe:
ALTER DATABASE <db> SET PARTNER RESUME;
Hinsichtlich des Aufbewahrungszeitraums lautet die Antwort, dass die Protokolldatensätze unabhängig von der Trennung oder der Unterbrechung der Spiegelungssitzung aufbewahrt werden, bis die Sitzung wiederhergestellt und alle Datensätze seit der Unterbrechung der Sitzung bis zur Wiederaufnahme auf dem Spiegel gesichert sind. Während die Spiegelungssitzung getrennt oder angehalten wurde, kann das Protokoll im Prinzipal im Grunde genommen nicht abgeschnitten werden, weil dadurch die Protokollwiederholungskette gebrochen wird. Das bedeutet, dass das Protokoll des Prinzipals uneingeschränkt wächst, bis die Sitzung wiederhergestellt ist. Deshalb gibt es in der Spiegelungssitzung keine Aufbewahrungsbegrenzung. Die einzige Beschränkung stellt der Festplattenspeicher dar, der dem Prinzipalserver für die Speicherung des Protokolls zur Verfügung steht, da das Protokoll nicht abgeschnitten werden kann.
Es gibt keine bestimmte Protokolldatei, die Sie für die Spiegelungsüberwachung verwenden können. SQL Server 2005 stellt zu diesem Zweck ein GUI-Tool, den Datenbankspiegelungs-Monitor, zur Verfügung. Mit diesem können Systemadministratoren den Status anzeigen und aktualisieren sowie Warnschwellenwerte für verschiedene wichtige Leistungsmetriken konfigurieren. Dieses Tool kann eine Warnung ausgeben, wenn die Spiegelung nicht zufriedenstellend durchgeführt wird. Das Hauptproblem hinsichtlich der Leistung der Datenbankspiegelung besteht in der rechtzeitigen Verarbeitung der Protokolldatensätze. Weitere Informationen zur Überwachung von Datenbankspiegelungen finden Sie in dem Artikel „Überwachen des Spiegelungsstatus“ unter http://msdn2.microsoft.com/de-de/library/ms365781.aspx.

Unser Dank gilt den folgenden Microsoft-IT-Experten für ihre fachliche Unterstützung: Chad Boyd, Sandu Chirica, Alan Doby, Kaloian Manassiev, Luciano Moreira, Ivan Penkov, Sivagaminathan Rajarethinam, Deborah To, Patrick Woodward, Buck Woody, Stanley Yau und Warren Young.


 The Cable Guy: Das DHCPv6-Protokoll
The Cable Guy
Das DHCPv6-Protokoll
Joseph Davies

Das Dynamic Host Configuration-Protokoll (DHCP) wurde entworfen, um Computern IP-Adressen und andere Netzwerkinformationen zuzuweisen, sodass sie im Netzwerk automatisch kommunizieren können. Bei einem IPv6-Netzwerk wird DHCP eigentlich nicht zum Konfigurieren von Adressen benötigt, es können jedoch gute Gründe für seine Verwendung sprechen. DHCP für IPv6 (DHCPv6) kann
die Einstellungen für statusbehaftete Adresskonfigurationseinstellungen oder statusfreie Konfigurationseinstellungen für IPv6-Hosts bereitstellen. IPv6-Hosts können mehrere Methoden verwenden, um Adressen zu konfigurieren:
Statusfreie automatische Adresskonfiguration wird zum Konfigurieren sowohl von verbindungslokalen Adressen als auch von zusätzlichen nicht verbindungslokalen Adressen durch den Austausch der Routeranfrage- und Routerankündigungsnachrichten mit angrenzenden Routern verwendet.
Statusbehaftete automatische Adresskonfiguration wird verwendet, um nicht verbindungslokale Adressen durch die Verwendung eines Konfigurationsprotokolls zu konfigurieren, z. B. DHCP.
Ein IPv6-Host führt eine statusfreie Autokonfiguration automatisch durch und verwendet ein Konfigurationsprotokoll, wie z. B. DHCPv6. Dies erfolgt aufgrund der folgenden Kennzeichen, die in der von einem angrenzenden Router gesendeten Routerankündigungsnachricht enthalten sind:
Das verwaltete Adresskonfigurationskennzeichen (Managed Address Configuration Flag), das auch M-Kennzeichen genannt wird. Wenn dieses Kennzeichen auf 1 eingestellt ist, wird der Host angewiesen, ein Konfigurationsprotokoll zu verwenden, um statusbehaftete Adressen zu erhalten.
Ein anderes statusbehaftetes Konfigurationskennzeichen, das auch O-Kennzeichen genannt wird. Wenn dieses Kennzeichen auf 1 eingestellt ist, wird der Host angewiesen, ein Konfigurationsprotokoll zu verwenden, um andere Konfigurationseinstellungen zu erhalten.
Wenn die Werte der M- und O-Kennzeichen kombiniert werden, kann sich Folgendes ergeben:
Beide Kennzeichen, sowohl M als auch O, sind auf 0 eingestellt. Diese Kombination entspricht einem Netzwerk ohne DHCPv6-Infrastruktur. Hosts verwenden Routerankündigungen für nicht verbindungslokale Adressen und andere Methoden (wie z. B. manuelle Konfiguration), um andere Einstellungen zu konfigurieren.
Beide Kennzeichen, sowohl M als auch O, sind auf 1 eingestellt. DHCPv6 wird sowohl für Adressen als auch für andere Konfigurationseinstellungen verwendet. Diese Kombination wird „DHCPv6 statusbehaftet“ genannt, wobei DHCPv6 den IPv6-Hosts statusbehaftete Adressen zuweist.
Das M-Kennzeichen ist auf 0 und das O-Kennzeichen auf 1 eingestellt. DHCPv6 wird nur dazu verwendet, andere Konfigurationseinstellungen, aber keine Adressen zuzuweisen. Angrenzende Router werden konfiguriert, um nicht verbindungslokale Adresspräfixe anzukündigen, von denen die IPv6-Hosts statusfreie Adressen ableiten. Diese Kombination wird „DHCPv6 statusfrei“ genannt: DHCPv6 weist IPv6-Hosts keine statusbehafteten Adressen, sondern statusfreie Konfigurationseinstellungen zu.
Das M-Kennzeichen ist auf 1 und das O-Kennzeichen auf 0 eingestellt. In dieser Kombination wird DHCPv6 für die Adresskonfiguration, nicht jedoch für andere Einstellungen verwendet. Da IPv6-Hosts in der Regel mit anderen Einstellungen konfiguriert werden müssen, wie z. B. den IPv6-Adressen der DNS-Server, stellt dies eine unwahrscheinliche Kombination dar.
Wie DHCP for IPv4 enthält eine DHCPv6-Infrastruktur folgende Komponenten: DHCPv6-Clients, die eine Konfiguration anfordern, DHCPv6-Server, die eine Konfiguration bereitstellen, und DHCPv6-Relay-Agents, die Nachrichten zwischen Clients und Servern übermitteln, wenn sich Clients in Subnetzen ohne DHCPv6-Server befinden.

DHCPv6-Nachrichten
Wie bei DHCP for IPv4 werden bei DHCPv6 UDP-Nachrichten (User Datagram Protocol) verwendet. DHCPv6-Clients fragen DHCP-Nachrichten auf UDP-Port 546 ab. DHCPv6-Server und Relay-Agents fragen DHCPv6-Nachrichten auf UDP-Port 547 ab. Die Struktur für DHCPv6-Nachrichten ist viel einfacher als für DHCP for IPv4, dessen Ursprung im BOOTP-Protokoll liegt, das zur Unterstützung von Arbeitsstationen ohne Datenträger diente. Abbildung 1 illustriert die Struktur von DHCPv6-Nachrichten, die zwischen Client und Server übermittelt werden.
Abbildung 1 DHCPv6-Nachrichten zwischen Client und Server
Abbildung 1 DHCPv6-Nachrichten zwischen Client und Server (Klicken Sie zum Verkleinern auf das Bild)
Abbildung 1 DHCPv6-Nachrichten zwischen Client und Server
Abbildung 1 DHCPv6-Nachrichten zwischen Client und Server (Klicken Sie zum Vergrößern auf das Bild)
Das 1-Byte-Feld „Msg-Type“ zeigt den DHCPv6-Nachrichtentyp an. Das 3-Byte-Feld „Transaction-ID“ wird von einem Client bestimmt und dazu verwendet, die Nachrichten eines DHCPv6-Nachrichtenaustauschs zu gruppieren. Aufgrund des Felds „Transaction-ID“ werden DHCPv6-Optionen dazu verwendet, die Client- und Serveridentifikation, Adressen und andere Konfigurationseinstellungen anzuzeigen. Eine Liste der definierten DHCPv6-Optionen erhalten Sie in der RFC 3315 (siehe auch „DHCPv6-RFC-Ressourcen“ in der Randleiste).
DHCPv6-Optionen sind im Format Typ-Länge-Wert formatiert. Abbildung 2 illustriert die Struktur von DHCPv6-Optionen.
Das 2-Byte-Feld „Option-Code“ zeigt eine bestimmte Option an. Das 2-Byte-Feld „Option-Len“ zeigt die Länge des Felds „Option-Data“ in Bytes an. Das Feld „Option-Data“ enthält die Daten für die Option.
Es ist eine eigene Nachrichtenstruktur für die Nachrichten vorhanden, die zwischen Relay-Agents und Servern ausgetauscht werden, um zusätzliche Informationen aufzuzeichnen. Abbildung 3 illustriert die Struktur dieser Art von Nachrichten.
Abbildung 2 Struktur von DHCPv6-Optionen
Abbildung 2 Struktur von DHCPv6-Optionen (Klicken Sie zum Verkleinern auf das Bild)
Abbildung 2 Struktur von DHCPv6-Optionen
Abbildung 2 Struktur von DHCPv6-Optionen (Klicken Sie zum Vergrößern auf das Bild)
Das 1-Byte-Feld „Hop-Count“ zeigt die Anzahl der Relay-Agents an, die die Nachricht empfangen haben. Ein empfangender Relay-Agent kann die Nachricht verwerfen, wenn sie eine konfigurierte maximale Hopanzahl überschreitet. Das 16-Byte-Feld „Link-Address“ enthält eine nicht verbindungslokale Adresse, die einer Schnittstelle zugewiesen wird, die mit dem Subnetz verbunden ist, in dem sich der Client befindet. Über das Feld „Link-Address“ kann der Server den richtigen Adressbereich für die Adresszuweisung bestimmen. Das 16-Byte-Feld „Peer-Address“ enthält die IPv6-Adresse des Clients, der die Nachricht ursprünglich gesendet hat, oder des vorherigen Relay-Agents, der die Nachricht übertragen hat. Abgesehen vom Feld „Peer-Address“ gibt es DHCPv6-Optionen, die die Option „Relay Message“ umfassen, in der die übertragene Nachricht und andere Optionen enthalten sind. Die Option „Relay Message“ stellt eine Kapselung der Nachrichten bereit, die zwischen dem Client und dem Server ausgetauscht werden.
Es gibt keine für IPv6 definierten Broadcastadressen. Daher ist die Verwendung der begrenzten Broadcastadresse für einige DHCPv4-Nachrichten durch die Verwendung der All_DHCP_Relay_Agents_and_Servers-Adresse FF02::1:2 für DHCPv6 ersetzt worden. Beispielsweise sendet ein DHCPv6-Client, der versucht, den Ort des DHCPv6-Servers im Netzwerk festzustellen, eine Solicit-Nachricht (Anfrage) von seiner verbindungslokalen Adresse an FF02::1:2. Wenn im Subnetz des Hosts ein DHCPv6-Server vorhanden ist, empfängt er die Solicit-Nachricht und sendet eine entsprechende Antwort. In der Regel empfängt jedoch ein DHCPv6-Relay-Agent im Subnetz des Hosts die Solicit-Nachricht und leitet sie an einen DHCPv6-Server weiter.
Abbildung 3 Struktur der Nachrichten zwischen Relay und Server
Abbildung 3 Struktur der Nachrichten zwischen Relay und Server (Klicken Sie zum Verkleinern auf das Bild)
Abbildung 3 Struktur der Nachrichten zwischen Relay und Server
Abbildung 3 Struktur der Nachrichten zwischen Relay und Server (Klicken Sie zum Vergrößern auf das Bild)

Statusbehafteter Nachrichtenaustausch
Ein statusbehafteter DHCPv6-Nachrichtenaustausch zum Abrufen von IPv6-Adressen und Konfigurationseinstellungen (wobei sowohl das M- als auch das O-Kennzeichen in einer empfangenen Routerankündigung auf 1 eingestellt ist) besteht standardmäßig aus den folgenden Nachrichten:
  • Einer Solicit-Nachricht (Anfrage), die vom Client gesendet wird, um die Server zu lokalisieren.
  • Einer Advertise-Nachricht (Ankündigung), die von einem Server gesendet wird, um anzuzeigen, dass er Adressen und Konfigurationseinstellungen bereitstellen kann.
  • Einer Request-Nachricht (Anforderung), die vom Client gesendet wird, um Adressen und Konfigurationseinstellungen von einem bestimmten Server anzufordern.
  • Einer Reply-Nachricht (Antwort), die vom angeforderten Server gesendet wird, der die Adressen und Konfigurationseinstellungen enthält.
Wenn zwischen dem Client und dem Server ein Relay-Agent vorhanden ist, sendet der Server die Relay-Forward-Nachrichten (Weiterleitung), die die gekapselten Solicit- und Request-Nachrichten des Clients enthalten. Der Server sendet die Relay-Reply-Nachrichten des Relay-Agents, die die gekapselten Advertise- und Reply-Nachrichten für den Client enthalten. Eine vollständige Liste der DHCPv6-Nachrichten findet sich in Abbildung 4.
Figure 4 DHCPv6-Nachrichten (Close Figure 4)

DHCPv6-Nachricht | Beschreibung | Entsprechende DHCP-for-IPv4-Nachricht
Solicit | Gesendet durch einen Client, um Server zu lokalisieren. | DHCPDiscover
Advertise | Gesendet durch einen Server als Antwort auf eine Solicit-Nachricht, um Verfügbarkeit anzuzeigen. | DHCPOffer
Request | Gesendet durch einen Client, um Adressen oder Konfigurationseinstellungen von einem bestimmten Server anzufordern. | DHCPRequest
Confirm | Gesendet durch einen Client an alle Server, um zu bestimmen, ob die Konfiguration eines Clients für den verbundenen Link gültig ist. | DHCPRequest
Renew | Gesendet durch einen Client an einen bestimmten Server, um die Gültigkeitsdauer der zugewiesenen Adressen zu verlängern und aktualisierte Konfigurationseinstellungen beizubehalten. | DHCPRequest
Rebind | Gesendet durch einen Client an einen beliebigen Server, wenn die Renew-Nachricht unbeantwortet blieb. | DHCPRequest
Reply | Gesendet durch einen Server an einen bestimmten Client als Antwort auf eine der folgenden Nachrichten: Solicit, Request, Renew, Rebind, Information-Request, Confirm, Release oder Decline. | DHCPAck
Release | Gesendet durch einen Client, um anzuzeigen, dass der Client keine zugewiesene Adresse mehr verwendet. | DHCPRelease
Decline | Gesendet durch einen Client an einen bestimmten Server, um anzuzeigen, dass die zugewiesene Adresse bereits verwendet wird. | DHCPDecline
Reconfigure | Gesendet durch einen Server an einen Client, um anzuzeigen, dass der Server neue oder aktualisierte Konfigurationseinstellungen hat. Der Client sendet dann entweder eine Renew- oder Information-Request-Nachricht. | Nicht zutreffend
Information-Request | Gesendet durch einen Client, um Konfigurationseinstellungen (nicht jedoch Adressen) anzufordern. | DHCPInform
Relay-Forward | Gesendet durch einen Relay-Agent, um eine Nachricht an einen Server weiterzuleiten. Eine Relay-Forward-Nachricht enthält eine Clientnachricht, die als DHCPv6-Relay Message-Option gekapselt ist. | Nicht zutreffend
Relay-Reply | Gesendet durch einen Server, um durch einen Relay-Agent eine Nachricht an einen Client zu senden. Eine Relay-Reply-Nachricht enthält eine Servernachricht, die als DHCPv6-Relay Message-Option gekapselt ist. | Nicht zutreffend

Statusfreier Nachrichtenaustausch
Ein statusfreier DHCPv6-Nachrichtenaustausch für den ausschließlichen Abruf von Konfigurationseinstellungen, wenn in einer empfangenen Routerankündigung das M-Kennzeichen auf 0 und das O-Kennzeichen auf 1 eingestellt ist, besteht standardmäßig aus den folgenden Nachrichten: Einer Information-Request-Nachricht, die vom DHCPv6-Client gesendet wird, um Konfigurationseinstellungen von einem Server zu erhalten, und einer Reply-Nachricht, die von einem Server gesendet wird, der die angeforderten Konfigurationseinstellungen enthält.
Für ein IPv6-Netzwerk mit Routern, die so konfiguriert sind, dass sie IPv6-Hosts statusfreie Adresspräfixe zuweisen, kann der 2-Nachrichten-DHCPv6-Austausch verwendet werden, um DNS-Server, DNS-Domänennamen und andere Konfigurationseinstellungen zuzuweisen, die in der Routerankündigungsnachricht nicht enthalten sind.

DHCPv6-Unterstützung in Windows
Windows Vista™ und „Longhorn“, die nächste Version von Windows Server®, enthalten einen DHCPv6-Client. In Abhängigkeit von den Werten der M- und O-Kennzeichen in empfangenen Routerankündigungsnachrichten versucht der DHCPv6-Client, eine DHCPv6-basierte Konfiguration durchzuführen. Um DHCPv6 zu verwenden, müssen Sie daher die DHCPv6-Server und -Relay-Agents so konfigurieren, dass sie jedes IPv6-Subnetz verarbeiten, und müssen dann Ihre IPv6-Router konfigurieren, um die beiden Kennzeichen auf ihre entsprechenden Werte einzustellen. Wenn für ein bestehendes Subnetz mehrere Ankündigungsrouter vorhanden sind, sollten sie so konfiguriert werden, dass sie die gleichen statusfreien Adresspräfixe und Werte der M- und O-Kennzeichen ankündigen. IPv6-Hosts unter Windows® XP oder Windows Server 2003 enthalten keinen DHCPv6-Client und ignorieren daher die Werte der M- und O-Kennzeichen in empfangenen Routerankündigungen.
Sie können einen IPv6-Router, der Windows Vista oder Windows Server „Longhorn“ ausführt, so konfigurieren, dass das M-Kennzeichen in Routerankündigungen mit dem Befehl „netsh interface ipv6 set interface InterfaceName managedaddress=enabled“ auf 1 eingestellt wird. Gleichermaßen können Sie das O-Kennzeichen in Routerankündigungen mit dem Befehl „netsh interface ipv6 set interface InterfaceName otherstateful=enabled“ auf 1 einstellen.
Die Beta-2-Version von Windows Server „Longhorn“ unterstützt einen DHCPv6-Relay-Agent und die statusfreie DHCPv6-Konfiguration mit dem DHCP-Serverdienst. Sie können den DHCP-Serverdienst so konfigurieren, dass DHCPv6-Optionen an alle DHCPv6-Clients im 2-Nachrichten-DHCPv6-Austausch verteilt werden, wie bereits beschrieben. Microsoft beabsichtigt, in der Beta-3-Version von Windows Server „Longhorn“ den statusbehafteten DHCPv6-Vorgang zu unterstützen, einschließlich der Fähigkeit, IPv6-Adressbereiche im DHCP-Snap-In zu erstellen.
DHCPv6-RFC-Ressourcen
Ausgewählte RFCs bezüglich DHCPv6:
  • RFC 3315 – Dynamic Host Configuration Protocol for IPv6 (DHCPv6) (auf Englisch)
  • RFC 2462 – IPv6 Stateless Address Autoconfiguration (auf Englisch)
  • RFC 3633 – IPv6 Prefix Options for DHCP Version 6 (auf Englisch)
  • RFC 3646 – DNS Configuration Options for DHCPv6 (auf Englisch)
  • RFC 3736 – Stateless DHCP Service for IPv6 (auf Englisch)

Joseph Daviesist technischer Redakteur bei Microsoft und lehrt und schreibt seit 1992 über Themen im Bereich der Windows-Netzwerke. Er hat fünf Bücher für Microsoft Press verfasst und ist der Autor der monatlich erscheinenden TechNet-Rubrik „The Cable Guy“


 Windows PowerShell: Die Kraft der Variablen
Windows PowerShell
Die Kraft der Variablen
Don Jones

Wenn Sie mit einer Windows-basierten Skriptsprache arbeiten, wie z. B. VBScript oder KiXtart, sind Sie an Variablen als nichts Anderes gewöhnt, als eine Art Speichermechanismus für Daten. Windows PowerShell verfügt auch über Variablen, diese sind jedoch erheblich leistungsfähiger als die Variablen in älteren Skriptsprachen. Die Windows
PowerShell-Variablen sind zugrunde liegenden Klassen im Microsoft® .NET Framework zugeordnet. Und im Framework stellen Variablen Objekte dar, was bedeutet, dass sie Daten speichern und auch auf vielfache Weise manipulieren können. Die widerstandsfähigen Funktionen der Variablen in Windows PowerShell™ sind der Grund, weshalb die Windows PowerShell-Skriptsprache keine spezifischen Datenbearbeitungsfunktionen enthält. Für diese Funktionen besteht kein Bedarf, da die Variablen bereits selbst die Funktionalität bereitstellen.

Deklarieren von Variablen
Obwohl das New-Variable cmdlet in Windows PowerShell Ihnen ermöglicht, eine Variable zu deklarieren und ihr einen anfänglichen Wert zuzuweisen, müssen Sie das cmdlet nicht verwenden. Stattdessen können Sie eine neue Variable einfach und schnell durch Zuweisen eines Werts erstellen:
$var = "Hello"

In Windows PowerShell beginnen Variablennamen immer mit einem Dollarzeichen($) und können eine Mischung aus Buchstaben, Zahlen, Symbolen oder sogar Leerzeichen enthalten (wenn Sie allerdings Leerzeichen verwenden, müssen Sie die Variable in geschweiften Klammern, wie z. B. ${Meine Variable} = „Hallo“ einschließen). In diesem Beispiel wurde eine neue Variable mit dem Namen $var erstellt und ihr wurde der anfängliche Wert „Hallo“ zugewiesen. Weil in diesem Fall der Wert eine Zeichenfolge ist, wird Windows PowerShell den Zeichenfolgendatentyp verwenden, um den Wert zu speichern. Im Kontext von .NET Framework ist das die System.String-Klasse, die möglicherweise über die am besten integrierte Funktionalität von allen Variablentypen verfügt. Wenn, sagen wir, eine Kleinbuchstabenversion des Werts in $var erscheinen soll, kann ich folgendermaßen vorgehen:
PS C:\> $var.ToLower()
hello
PS C:\>
Die ToLower-Methode ist in die System.String-Klasse integriert und stellt eine Kleinbuchstabendarstellung des Werts der Zeichenfolge her. Sie ändert jedoch nicht den eigentlichen Inhalt der Variablen $var. Um eine vollständige Liste der Funktionen der System.String-Klasse anzuzeigen, leiten Sie eine Zeichenfolgenvariable folgendermaßen zum Get-Member cmdlet:
$var | get-member
Abbildung 1 zeigt die Ausgabe, die einige Dutzend Methoden umfasst, die zum Manipulieren von Zeichenfolgen verwendet werden. Beinahe die gesamte Funktionalität, die von VBScript-Funktionen der Zeichenfolgenmanipulation bereitgestellt wird, wird stattdessen von Methoden der Zeichenfolgenvariablen in Windows PowerShell bereitgestellt.
Abbildung 1 Ein Blick auf die Ausgabe der System.String-Klasse
Abbildung 1 Ein Blick auf die Ausgabe der System.String-Klasse (Klicken Sie zum Verkleinern auf das Bild)
Abbildung 1 Ein Blick auf die Ausgabe der System.String-Klasse
Abbildung 1 Ein Blick auf die Ausgabe der System.String-Klasse (Klicken Sie zum Vergrößern auf das Bild)

Viele der Funktionen der Zeichenfolgenvariablen sind in einem administrativen Kontext nützlicher als die Zeichenfolgenfunktionen in einer Sprache wie VBScript. Angenommen, Sie haben ein Skript geschrieben, das UNC-Pfade (Universal Naming Convention) aus einer Datei einliest und diese dann für einen bestimmten Zweck verwendet. Sie müssten überprüfen, ob jeder eingelesene Pfad eine UNC ist, bevor Sie versuchen, den Pfad zu verwenden. Die StartsWith-Methode lässt Sie bestätigen, dass der Wert einer Zeichenfolge mit den notwendigen umgekehrten Schrägstrichen, die eine UNC erfordert, beginnt:
PS C:\> $path = "\\Server\Share"
PS C:\> $path.StartsWith("\\")
True
PS C:\>
Weil StartsWith einen Wert als Wahr oder Falsch wiedergibt, können Sie es in logischen Konstrukten verwenden:
if ($path.StartsWith("\\")) {
 # code goes here
}
Windows PowerShell bietet sogar eine Form der automatischen Vervollständigung für die Methoden von Variablen, was die Menge der erforderlichen Tastatureingaben verringert. Wenn $var eine Zeichenfolge enthält, können Sie
$var.
eingeben und dann auf Tab drücken, das den ersten Methodennamen für die Variable $var auftauchen lässt. Erneutes Drücken von Tab verschiebt zur nächsten Methode, und Drücken von Umschalt + Tab bringt die frühere Methode zum Vorschein. Auf diese Weise können Sie durch alle verfügbaren Methoden blättern, bis Sie die gewünschte finden.

Variablenverwirrung
So weit haben die Beispiele Windows PowerShell ermöglicht, den Datentyp der Variablen zu bestimmen. Die Zuweisung einer Zeichenfolge zu einer Variablen zwingt die Variable, zur System.String-Klasse zu gehören. Die Zuweisung einer Zahl zu einer Variablen führt andererseits gewöhnlich dazu, dass die Variable eine ganze Zahl wird (oder genauer gesagt ein Int32, der einen bestimmten Wertbereich speichern kann). Bedenken Sie z. B. Folgendes:
PS C:\> $int = 5
PS C:\> $int | get-member

  TypeName: System.Int32
Diese verstümmelte Datenausgabe zeigt, dass Windows PowerShell $int als einen Int32 behandelt, der seinen eigenen Satz an Methoden und Eigenschaften hat. Und sein Satz an Methoden und Eigenschaften ist in der Tat viel kleiner als der des Zeichenfolgentyps.
$int wurde zum Int32 gemacht, weil der Wert nicht in Anführungszeichen eingeschlossen war, und weil der Wert ausschließlich aus Ziffern bestand. Wäre er in Anführungszeichen eingeschlossen gewesen, wäre er als ein System.String interpretiert worden.
Windows PowerShell entscheiden zu lassen, welcher Datentyp zu verwenden ist, bringt nicht immer die Ergebnisse, die Sie wünschen. Angenommen, Sie lesen Werte aus einer Datei, und Sie wollen, dass die Werte immer als Zeichenfolgen behandelt werden. Vielleicht aber enthalten einige der Werte nur Ziffern, was die Möglichkeit erhöht, dass Windows PowerShell sie als Int32 oder einen anderen numerischen Typ behandeln würde. Das kann Probleme für Ihr Skript verursachen. Wenn Windows PowerShell den Wert nicht als eine Zeichenfolge erkennt, dann sind alle Methoden der System.String-Klasse nicht verfügbar (und Ihr Skript könnte auf eine dieser nicht verfügbaren Methoden angewiesen sein).
Um dieses Problem zu umgehen, können Sie Windows PowerShell zwingen, eine Variable als einen bestimmten Typ zu behandeln, indem Sie diesen Typ deklarieren, wenn Sie die Variable zum ersten Mal verwenden. Hier ist ein Beispiel:
[string]$var = 5
Normalerweise wäre $var ein Int32 gewesen, aber hier wurde Windows PowerShell gezwungen, $var zu einer Zeichenfolge zu machen, und damit sichergestellt, dass alle Methoden verwenden werden können, die der System.String-Klasse zugeordnet werden. Die Deklaration des Variablentyps liefert dem Code auch eine praktische Art von Selbstdokumentation, da es jetzt offensichtlich ist, welcher Datentyp erwartungsgemäß in $var passt. Eigentlich habe ich es mir angewöhnt, immer einen bestimmten Typ für alle meine Variablen zu deklarieren, und so Windows PowerShell die Entscheidung völlig abzunehmen. Dies macht das Verhalten meiner Skripts voraussagbarer und in mehreren Fällen hat es mir ziemlich viel Debuggingzeit erspart.
Wie Sie sich denken können, hat das gewaltsame Deklarieren von Variablen seine Rückwirkungen, obwohl diese nicht unbedingt schlecht sind. Nehmen Sie dieses Beispiel, das den Variablentyp nicht deklariert:
PS C:\> $me = 5
PS C:\> $me = "Don"
Die Variable $me war anfänglich ein Int32, aber Windows PowerShell hat sie in eine Zeichenfolge umgewandelt, als der Wert „Don“ hinzugefügt wurde. Windows PowerShell kann den Typ einer Variablen nach Bedarf ändern, vorausgesetzt, dass die Variable nicht bereits explizit auf einen bestimmten Typ festgelegt wurde.
In diesem Beispiel habe ich $me gezwungen, ein Int32 zu sein, indem ich den [int]-Typnamen verwendet habe:
PS C:\> [int]$me = 5
PS C:\> $me = "Don"
Cannot convert value "Don" to type
"System.Int32". Error: "Input string
was not in a correct format."
At line:1 char:4
+ $me <<<< = "Don"
Als ich dann versuchte, der Variablen einen Zeichenfolgenwert zuzuweisen, wurde eine Fehlermeldung angezeigt. Da ich $me explizit gezwungen hatte, ein Int32 zu sein, hat Windows PowerShell erwartet, die Zeichenfolge „Don“ in einen Ganzzahlwert zu konvertieren. Es war nicht fähig, dies durchzuführen, noch war es fähig, den Typ von $me in String zu ändern.

So viele Typen
Viele Typen sind innerhalb Windows PowerShell verfügbar. Eigentlich können Sie jeden beliebigen .NET Framework-Typ verwenden (und die verfügbaren Typen gehen in die Hunderte). Jedoch definiert Windows PowerShell mehrere Verknüpfungen für gebräuchliche Datentypen. Abbildung 2 ist nur eine partielle Liste, die 10 der gebräuchlichsten Typenverknüpfungen zeigt. Eine vollständige Liste finden Sie in der Windows PowerShell-Dokumentation.
Figure 2 Gebräuchliche Typenverknüpfungen (Close Figure 2)

Verknüpfung | Datentyp
[datetime] | Datum oder Zeit
[string] | Zeichenfolge
[char] | Einzelnes Zeichen
[double] | Gleitzahl mit doppelter Genauigkeit
[single] | Gleitzahl mit einfacher Genauigkeit
[int] | 32-Bit ganze Zahl
[wmi] | Windows Management Instrumentation (WMI) Instanz oder Sammlung
[adsi] | Active Directory-Dienstobjekt
[wmiclass] | WMI-Klasse
[Boolesch] | Wahrer oder Falscher Wert
Sie können einen Variablentyp auch dadurch deklarieren, dass Sie den vollen .NET Framework-Klassennamen verwenden, wie hier:
[System.Int32]$int = 5
Dieses Verfahren ermöglicht Ihnen, Typen zu verwenden, die sich im .NET Framework befinden, aber keine bestimmte Verknüpfung in Windows PowerShell haben.

Erweitern von Typen
Vielleicht das Tollste an Windows PowerShell ist seine Möglichkeit, die Funktionen dieser veränderlichen Typen zu erweitern. Im Windows PowerShell Installationsordner (normalerweise in %systemroot\system32\windowspowershell\v1.0, obwohl Sie den Pfad auf 64-Bitsystemen etwas anders vorfinden werden) finden Sie eine Datei mit dem Namen types.ps1xml. Sie können diese Datei in Notepad oder in einem XML-Editor, wie z. B. PrimalScript bearbeiten. Standardmäßig ist die System.String-Klasse nicht aufgelistet, aber viele andere Typen doch. Dem System.String-Typ kann jedoch eine neue Funktion hinzugefügt werden, indem diese der types.ps1xml-Datei hinzugefügt wird.
Nach der Änderung muss Windows PowerShell geschlossen und wieder geöffnet werden. Außerdem muss sichergestellt sein, dass die lokale Skriptausführungsrichtlinie nicht signierten Skripts die Ausführung ermöglicht, da ich types.ps1xml: nicht signiert habe.
Set-executionpolicy remotesigned
Jetzt, nach dem Neustart von Windows PowerShell, kann die neue Funktionalität wie folgt verwendet werden:
PS C:\> [string]$comp = "localhost"
PS C:\> $comp.canping
True
PS C:\>
Wie Sie sehen, habe ich der System.String-Klasse eine CanPing-Eigenschaft hinzugefügt. Dies gibt Wahr oder Falsch an, um anzuzeigen, ob der lokale Computer die Adresse pingen kann, die in der Zeichenfolge enthalten ist. In Abbildung 3 sehen Sie, dass die WMI-Abfrage eine besondere Variable, nämlich $this, verwendet. Die Variable $this vertritt den aktuellen Wert, der in der Zeichenfolge enthalten ist, und wie der Inhalt der Zeichenfolgenvariable in die WMI-Abfrage übergeben wird.
Figure 3 Erweitern des System.String-Typs (Close Figure 3)
<Type>
  <Name>System.String</Name>
  <Members>
    <ScriptProperty>
      <Name>CanPing</Name>
      <GetScriptBlock>
      $wmi = get-wmiobject -query "SELECT *
FROM Win32_PingStatus WHERE Address = '$this'"
      if ($wmi.StatusCode -eq 0) {
        $true
      } else {
        $false
      }
      </GetScriptBlock>
    </ScriptProperty>
  </Members>
</Type>

Lassen Sie eine Variable die Arbeit machen
Windows PowerShell liefert flexible Variablentypen voller Features und ein gleichermaßen flexibles System zum Erweitern der Funktionalität der Typen. Diese Funktionen machen es sehr leicht, ganz viel Leistung in Ihre Skripts einzubauen. Tatsächlich können Variable zu einem bedeutenden Baustein in komplizierten Skripts werden, wobei sie in vielen Fällen die erweiterten Funktionen übernehmen, die normalerweise in einer komplizierteren Funktion zu finden wären.
Online weiterlernen
Seien auch Sie bei dieser Serie von Webcasts dabei: Am zweiten Dienstag jeden Monats tauchen wir tiefer in die reiche Skriptfunktionalität ein, die von Windows PowerShell bereitgestellt wird. Besuchen Sie microsoft.com/events/series/donjonesscripting.mspx und melden Sie sich noch heute an.

Am 20. Februar 2007 Windows PowerShell: Der Skripting-Intensivkurs
Nehmen Sie an diesem Webcast teil, und lernen Sie die Variablen, Sprachenkonstrukte, Skripts und Funktionen in Windows PowerShell kennen. In diesem einstündigen Intensivkurs führen wir vor, wie die einfache aber wirksame Skriptsprache in Windows PowerShell die administrative Automatisierung von Windows® schneller macht. Wir erforschen auch mehrere Drittanbietertools, die Windows PowerShell-Skripting so schmerzlos wie möglich machen.

Am 20. März 2007 Windows PowerShell: Funktionen, Filter und Wirkungsgrad
Lernen Sie, wirksamen, modularisierten Code in Windows PowerShell-Funktionen und Filtern zu erstellen. Wir erforschen die widerstandsfähigen Bereichsregeln in Windows PowerShell, die Ihnen ermöglichen, Funktionen und Filter völlig einzukapseln, und erklären, wie Sie diese Funktionen und Filter über Projekte hinweg leicht wieder verwenden können. Wir führen auch vor, wie Sie Ihre eigenen benutzerdefinierten Funktionen in den globalen Bereich in Windows PowerShell einfügen können, was es einfacher macht, eine Bibliothek nützlicher Dienstprogrammfunktionen zu Ihrer direkten Verfügung zu assemblieren.

Am 17. April 2007 Windows PowerShell und Windows Management Instrumentation
Windows PowerShell kann auf die komplette Leistungsfähigkeit und die Funktionalität von Windows Management Instrumentation oder WMI zugreifen. Es wird nicht nur beschrieben, wie Windows PowerShell zu verwenden ist, um auf WMI zuzugreifen, sondern auch wie WMI-Objekte und -Sammlungen durch die Windows PowerShell-Pipeline übermittelt werden. Es wird erkundet, wie WMI-Eigenschaften und -Methoden in Windows PowerShell-Skripts zu verwenden sind, und die zugrunde liegenden Sicherheits- und Konfigurationsfeatures in WMI werden illustriert.

Am 22. Mai 2007 Windows PowerShell: Konvertieren von VBScript
Sie möchten Ihre Skripts£oder einfach nur Ihre Fähigkeiten£von VBScript zu Windows PowerShell konvertieren? Dann nehmen Sie an diesem Webcast teil, um zu lernen, wie es geht. Es wird erkundet, wie Windows PowerShell alle Hauptkonstrukte und Features von VBScript integriert, was es leicht macht, Ihre VBScript-Fähigkeiten in diese neue administrative Umgebung zu übersetzen. Es wird illustriert, wie Tools in VBScript in die systemeigene Skriptsprache in Windows PowerShell konvertiert werden. Es wird außerdem die einmalige Struktur in Windows PowerShell untersucht und Ihnen demonstriert, wie Sie in die Verwendung der Windows PowerShell Skriptsprache einsteigen, damit Ihre Bemühungen effizienter und wirksamer werden.

Am 19. Juni 2007 Windows PowerShell: Interne Erweiterungen
In diesem Webcast wird erkundet, wie Windows PowerShell das leistungsfähige und flexible .NET Framework verwendet, um Daten zu behandeln, und Ihnen Hunderte von eingebauten Funktionen zum Verwalten von Zeichenfolgen, Daten und anderen Datentypen zur Verfügung stellt. Aber haben Sie auch gewusst, dass Sie diese Funktionen mithilfe von Windows PowerShell-Skripts erweitern können? Wir zeigen Ihnen, wie Zeichenfolgenvariable erstellt werden, die nicht nur einen Computernamen enthalten, sondern Ihnen auch mitteilen können, ob dieser Computer läuft. Erfahren Sie, wie Datums- und Zeitvariablen erstellt werden, die automatisch ihre Daten ohne die Verwendung externer Funktionen formatieren können. Nehmen Sie an dieser Sitzung teil, um zu sehen, wie alle Arten neuer Funktionalität in Minutenschnelle in Windows PowerShell eingebaut werden können, und somit die Windows-Verwaltung schneller und leichter machen.

Don Jones ist Direktor für Projekte und Dienste bei SAPIEN Technologies und Mitautor von Windows PowerShell: TFM (SAPIEN Presse). Sie erreichen Don Jones unter www.ScriptingAnswers.com.


 Hey, Scripting Guy!: Antwort auf Ihre Fragen zur Organisationseinheit...f&#252;r nur 5 Cent
Hey, Scripting Guy!
Antwort auf Ihre Fragen zur Organisationseinheit...für nur 5 Cent
Die Scripting Guys von Microsoft
Laden Sie den Code für diesen Artikel herunter: HeyScriptingGuy2007_03.exe (151KB)

F: Wie kann ich ein Dialogfeld anzeigen lassen, das mir ermöglicht, eine Organisationseinheit aus Active Directory auszuwählen?

SIE WISSEN JA, wenn wir Scripting Guys jedes Mal, wenn uns diese Frage gestellt wird, fünf Cent bekämen, hätten wir -- na, gut, es liefe eigentlich doch nur auf €37,20 hinaus, nicht wahr? Ok, aber wenn wir fünf Cent für jeden Benutzer bekommen hätten, der uns diese Frage stellen wollte, es aber nur nie tatsächlich geschafft hat, dann hätten wir -- na gut, der Betrag spielt keine Rolle. Schließlich sind wir nicht wegen des Geldes Scripting Guys geworden. Wir sind Scripting Guys geworden, weil es eine befriedigende Aufgabe ist, Benutzern zu helfen, ihre Systemverwaltungsaufgaben schneller und leichter durchzuführen.
Anmerkung. O.k., damit sind wir, technisch gesehen, doch wegen des Geldes Scripting Guys geworden. Aber dann hat unser Manager zu uns gesagt: „Ihr wisst ja, ihr könnt erfolgreich sein und viel Geld machen, aber nur, wenn ihr bereit seid, wirklich hart zu arbeiten und nur qualitativ Hochwertiges zu produzieren“. Da war es für uns klar, dass Geld nicht alles ist.
Was soll's. Der Punkt ist doch: Viele Leute möchten wissen, wie ein Dialogfeld angezeigt wird, das ihnen ermöglichen würde, eine Organisationseinheit auszuwählen, und dann, durch Erweiterung, eine Verbindung zu dieser Organisationseinheit herzustellen, indem sie ein Skript verwenden. „Sie haben uns gezeigt, wie ein Dialogfeld angezeigt wird, das uns Ordner auswählen lässt“, stand neulich in einer E-Mail, „und Sie haben uns gezeigt, wie ein Dialogfeld angezeigt wird, das uns Dateien auswählen lässt. Warum haben Sie bisher nie gezeigt, wie ein Dialogfeld angezeigt wird, das uns eine Organisationseinheit von Active Directory® auswählen lässt?“
Zunächst einmal, ja, wir haben wirklich gezeigt, wie ein Dialogfeld angezeigt wird, das Benutzern ermöglicht, einen Ordner auszuwählen, und Sie finden ein Beispiel dafür genau hier. Wir haben auch allen gezeigt, wie ein Dialogfeld angezeigt wird, das es ermöglicht, Dateien auszuwählen; prüfen Sie es hier nach microsoft.com/technet/scriptcenter/resources/qanda/jan05/hey0128.mspx, wenn Sie uns nicht glauben. Beide Artikel wurden gut aufgenommen, und wir wissen, dass Benutzer die Verfahren in ihren Skripts anwenden. Warum haben wir den Leuten dann also nicht gezeigt, wie ein Dialogfeld anzuzeigen ist, das ihnen ermöglicht, Organisationseinheiten vom Active Directory auszuwählen? Ist dies eine Art Microsoft-Verschwörung, oder was?
Selbstverständlich nicht. (Aber, Moment mal: Das ist doch genau das, was jemand sagen würde, der in eine Verschwörung verwickelt ist, oder?) Die Wahrheit ist, dass wir Ihnen tatsächlich aus gutem Grund nicht gezeigt haben, wie ein Dialogfeld anzuzeigen ist, das Ihnen ermöglicht, Organisationseinheiten vom Active Directory auszuwählen: Ein solches Dialogfeld existiert nicht. Wie es beim Baseball heißt, man kann nicht treffen, was man nicht sehen kann. Und wie wir beim Scripting sagen, man kann nicht anzeigen, was nicht existiert.
Also, denken wir, war es das dann wohl für diesen Monatsartikel. Dann bis zum nächsten Mal.
Zu früh gefreut! Nach den Herausgebern von TechNet Magazin war es das noch nicht für diesen Monat. „Wenn ein solches Dialogfeld nicht existiert, na und?“ haben sie gesagt. „Ihr seid schließlich die Scripting Guys, um Petes willen. Könnt Ihr nicht einfach ein Dialogfeld erstellen, um das in Ordnung zu bringen? Wir haben gedacht, Ihr Kerle könntet alles zustande bringen, wenn es um Scripting geht“.
Selbstverständlich sind die Herausgeber von TechNet Magazin völlig falsch informiert worden. Alles zustande bringen, wenn es um Scripting geht? Nicht so ganz. In Wirklichkeit können wir Scripting Guys eigentlich nur eine Sache, wenn es um Scripting geht.
Allerdings ist glücklicherweise gerade diese eine Sache das Erstellen eines Dialogfelds, das Ihnen ermöglicht, eine Organisationseinheit vom Active Directory auszuwählen. Sehen Sie sich Abbildung 1 an.
Ja, dies ist ein ganz schön langes Skript, nicht wahr? Aber wie man so sagt: Es lässt sich kein Omelett machen, ohne ein paar Eier aufzuschlagen. Ebenso wenig lässt sich ein benutzerdefiniertes Dialogfeld erstellen, ohne auch ein paar Eier aufzuschlagen, (wir sind auf halber Strecke durch diesen Artikel hungrig geworden, und mussten für einen Imbiss unterbrechen). Jetzt, nachdem der Hunger gestillt ist, wollen wir sehen, ob wir erklären können, wie das Ganze funktioniert.
Was wir mit dem Skript machen, ist Folgendes: Wir verwenden das Internet Explorer®-Objektmodell, um ein Pseudo-Dialogfeld zu erstellen. Wir erstellen eine Instanz von Internet Explorer, nehmen eine Sammlung von Organisationseinheiten aus dem Active Directory, und zeigen dann die Organisationseinheiten in einem Listenfeld in einem Internet Explorer-Fenster an. Wir warten, bis der Benutzer eine Organisationseinheit auswählt, nehmen dann den ADsPath des ausgewählten Elements, heben das „Dialogfeld“ auf, und gehen dann von dort aus weiter.
Anmerkung. Wird das nicht der raffinierteste und hübscheste Dialog, der je erstellt wurde? Ja, wenn Sie unter „raffiniertest und hübschest“ eine aufs Äußerste reduzierte Angelegenheit verstehen, die nicht einmal eine Schaltfläche für OK oder Abbrechen hat. Aber zu unserer Verteidigung sei gesagt: Die Idee ist hier einfach, Ihnen das grundlegende Gerüst zu geben. Wenn Sie das Dialogfeld verschönern oder ändern wollen, sind Sie auf sich selbst gestellt.
(Junge, Junge, wenn wir für jedes Mal, wenn wir sagen „Tut uns leid, Sie sind auf sich selbst gestellt“, 5 Cent bekämen, dann wären wir wirklich reich. Spenden sind erbeten an Scripting Guys c/o TechNet Magazin.)
Um die Erklärung unseres Verfahrens in den uns zugeteilten Artikelumfang einzupassen, werden wir ein paar Dinge nur streifen können. Z. B. alles, was wir über den folgenden Codeblock sagen, ist, dass er eine Instanz von Internet Explorer erstellt, die 350 Pixel mal 400 Pixel umfasst, und dabei solche Dinge wie die Adressleiste und die Statusleiste ausblendet:
Set objExplorer = CreateObject( _
    "InternetExplorer.Application")

objExplorer.Navigate "about:blank"
objExplorer.ToolBar = 0
objExplorer.StatusBar = 0
objExplorer.Width= 350
objExplorer.Height = 400
objExplorer.Left = 400
objExplorer.Top = 400
objExplorer.Visible = 1
Selbstverständlich kommt dabei nur ein leeres Internet Explorer-Fenster heraus. Um die Liste von Organisationseinheiten in unserer Domäne abzurufen, muss das Active Directory durchsucht werden. Wir können die Einzelheiten der Durchsuchung des Active Directory heute nicht erklären; werfen Sie für weitere Informationen einen Blick in unsere zweiteilige Serie im Script Center (microsoft.com/technet/scriptcenter/resources/tales/sg0405.mspx). Wir können Ihnen nur sagen, dass dies der Code ist, den wir verwenden, um den Namen und den ADsPath für jede Organisationseinheit in der Domäne fabrikam.com abzurufen:
objCommand.CommandText = _
    "SELECT Name, ADsPath FROM 'LDAP://DC=fabrikam,DC=com' WHERE objectCategory=
    'organizationalUnit' ORDER BY Name"
Ach ja, und um Ihnen die Sache zu erleichtern, haben wir für Sie die Organisationseinheiten auch alphabetisch nach Namen sortiert. Dafür ist die Klausel SORTIEREN NACH Namen da: (Keine Ursache; schließlich sind wir nur zu Ihren Diensten da).
Beim Aufrufen der Execute-Methode erhalten wir eine Satzgruppe, die aus allen Organisationseinheiten besteht, die in fabrikam.com gefunden wurden. Das bedeutet, dass der nächste Schritt darin besteht, jede der Organisationseinheiten in einem Listenfeld anzuzeigen.
Wie wird das also gemacht? Nun, zuerst muss das ganze Listenfeld im Speicher erstellt werden. Das bedeutet für den Anfang das Verwenden dieser Codezeile, um das Tag <AUSWÄHLEN> in einer Variablen mit dem Namen strHTML zu speichern.
strHTML = "<select size = '20' name='OUList' style='width:300px'>"
Was wird mit dieser Codezeile gemacht? Nun, es wird einfach ein Standard-HTML-Listenfeld erstellt (etwas, das Sie mithilfe des Tag <AUSWÄHLEN> machen). Dabei erhält das Listenfeld den Namen OUList und wird konfiguriert, 20 Elemente auf einmal anzuzeigen und 300 Pixel (300px) breit zu sein. Wenn Sie sich etwas in HTML auskennen, dürfte der vorherige Code recht vertraut aussehen.
Als Nächstes müssen dem Listenfeld einige Elemente hinzugefügt werden (das heißt, einige Organisationseinheiten). Durch einen erstaunlichen Zufall besteht unsere Satzgruppe aus Informationen zu jeder der Organisationseinheiten in unserer Domäne. Deswegen können wir eine Do Until-Schleife einrichten, welche die ganze Satzgruppe durchläuft, die Informationen aufnimmt, und dann dem Listenfeld jede Organisationseinheit hinzufügt. Innerhalb dieser Schleife wird der folgende Code verwendet (wieder Standard-HTML, um einem Listenfeld Elemente hinzuzufügen), um jede Organisationseinheit hinzuzufügen. Dabei wird das Element so konfiguriert, dass der Name der Organisationseinheit in der Liste angezeigt wird, und, wenn Sie auf diese Organisationseinheit im Listenfeld klicken, der ADsPath dem Skript übergeben wird:
strHTML = strHTML & "<option value= " & _
    Chr(34) & objRecordSet.Fields
    ("AdsPath").Value & Chr(34)
strHTML = strHTML & ">" & objRecordSet.
    Fields("Name").Value
Warum soll der ADsPath dem Skript übergeben werden? Die Antwort ist ganz einfach: Angenommen, der Name der Organisationseinheit wäre stattdessen übergeben worden. Wenn der Name, sagen wir, „Finanz“ ist, wird es schwierig, ihn an diese Organisationseinheit zu binden; schließlich ist „Finanz“ allein keine gültige ADSI-Bindungszeichenfolge. Wenn wir jedoch wieder den ADsPath aufrufen (LDAP://ou=Finance,dc=fabrikam,dc=com), dann ist Bindung ein Klacks. Das kommt daher, dass der ADsPath genau das ist, was benötigt wird, um eine Verbindung zu einem Objekt in Active Directory zu ermitteln und herzustellen.
Übrigens wird der Name im Listenfeld angezeigt, weil wir annehmen, dass Ihre Organisationseinheiten einmalige Namen haben. Das könnte auch anders sein; z. B., die Organisationseinheiten Nordamerika\Forschung und Europa\Forschung haben den gleichen Namen (Forschung). Wenn Ihre Organisationseinheiten doppelte Namen haben, könnten Sie stattdessen vielleicht eine andere Eigenschaft, etwa ADsPath oder distinguishedName, im Listenfeld verwenden wollen. Das müssen Sie alleine entscheiden. (Klingeling! Schon wieder ein Fünf-Cent-Stück!)
Übrigens, beachten Sie, dass wir das Listenfeld immer noch im Speicher erstellen: Jedes dem Feld hinzugefügte Element wird der Variablen strHTML hinzugefügt. Das ist alles Teil des Plans: Wir speichern den ganzen Code für das Listenfeld in der Variablen strHTML, verwenden dann den Wert dieser Variablen, um unserer Instanz des Internet Explorer das Listenfeld tatsächlich hinzuzufügen.
Nachdem alle Organisationseinheiten hinzugefügt worden sind, wird diese Codezeile verwendet, um das Ende des Listenfelds zu bezeichnen.
strHTML = strHTML & "</select>"
Jetzt enthält strHTML alle erforderlichen HTML-Tags, um ein Listenfeld zu erstellen, und zwar, was das Beste daran ist, ein Listenfeld, in dem jedes Element eine Organisationseinheit in Active Directory vertritt. Das bedeutet, dass jetzt der Wert von strHTML der Eigenschaft der InnerHTML unseres Internet Explorer-Dokuments zugewiesen werden kann:
objExplorer.Document.Body.InnerHTML = strHTML
Dies wiederum ergibt ein Listenfeld, das alle Organisationseinheiten in einer Domäne anzeigt.
Aber halt, nicht weggehen; wir sind noch nicht ganz fertig. Z. B. brauchen wir noch einen Code, der es ermöglicht, unser Skript anzuhalten, bis der Benutzer eine Organisationseinheit im Dialogfeld ausgewählt hat. Ohne diesen würde das Listenfeld zwar angezeigt werden, aber das Skript würde weiter ausgeführt, ohne Rücksicht darauf, ob der Benutzer eine Auswahl trifft. Au weia! Um dieses Szenario zu verhindern, wird folgender Codeblock verwendet:
Do While objExplorer.Document.Body.All.OUList.Value = ""
    Wscript.Sleep 300
Loop
Was hier geschieht, ist eine wiederholte Überprüfung des Werts unseres Listenfelds (das wir, wie Sie sich vielleicht erinnern, OUList genannt haben, mit dem gleichen Namen, den einer der Scripting Guys seiner Tochter gegeben hat). Wenn der Wert eine leere Zeichenfolge ist (das heißt, dass kein Element ausgewählt worden ist), wird einfach das Skript für 300 Millisekunden angehalten, dann eine Schleife durchlaufen, und die Überprüfung wiederholt. Dies geht weiter: a) ewig; b) bis der Benutzer ein Element im Listenfeld auswählt; oder c) bis der Benutzer das Internet Explorer-Fenster schließt.
Angenommen, der Benutzer wählt eine Organisationseinheit im Listenfeld aus. In diesem Fall nehmen wir den Wert (der, wie Sie sich erinnern, der ADsPath der Organisationseinheit ist) und weisen ihn einer Variablen mit dem Namen strTargetOU zu:
strTargetOU = objExplorer.Document.Body.All.OUList.Value
Wir verwenden dann die Methode zum Beenden, um unsere Instanz des Internet Explorer, wie unten gezeigt, aufzuheben:
objExplorer.Quit
Jetzt sind wir fast fertig. Wir prüfen zuerst, ob strTargetOU gleich einer leeren Zeichenfolge ist:
If strTargetOU = "" Then
    Wscript.Quit
End If
Wenn ja, bedeutet das, dass der Benutzer den Internet Explorer geschlossen hat, ohne eine Organisationseinheit auszuwählen; wir wiederum verwenden die Wscript.Quit-Methode, um das Skript zu beenden. (Wir machen die Annahme: Wenn der Benutzer keine Organisationseinheit gewählt hat, dann ist er oder sie nicht wirklich am Ausführen des Skripts interessiert). Wenn aber strTargetOU nicht gleich einer leeren Zeichenfolge ist, dann geben wir den Wert der Variablen wieder:
Wscript.Echo strTargetOU
Natürlich, in einem wirklichen Skript würden Sie wahrscheinlich weiter gehen, und an diese Organisationseinheit in Active Directory anbinden, statt einfach den ADsPath wiederzugeben. Aber Sie wissen was man so sagt -- oder wenigstens was wir sagen: Dabei sind Sie auf sich gestellt.
Wie wir erwähnt haben, und wie Sie in Abbildung 2 sehen können, ist es nicht das raffinierteste je erstellte Dialogfeld, aber es funktioniert, und es ist viel leichter, als einen ADsPath eintippen zu müssen (vorausgesetzt, dass Sie den ADsPath überhaupt kennen). Außerdem gibt es Ihnen die Chance, den Code und das Dialogfeld anzupassen, sodass sie Ihren Bedürfnissen entsprechen.
Abbildung 2 Ein einfacher Skriptdialog
Abbildung 2 Ein einfacher Skriptdialog

Ach ja, wenn wir doch nur ein Fünf-Cent-Stück für jeden Artikel bekommen hätten, den wir je über das Anzeigen eines Dialogfelds geschrieben haben, das Ihnen ermöglicht, eine Organisationseinheit vom Active Directory auszuwählen. Immerhin würde das für uns fünf Cent mehr ergeben, als TechNet Magazin uns gewöhnlich bezahlt.
Aber wir wollen uns ja nicht beschweren.

Die Scripting Guys von Microsoft arbeiten für (und sind Angestellte von) Microsoft. Wenn sie nicht gerade ihrem Hobby, dem Baseball (oder verschiedenen anderen Aktivitäten) nachgehen, betreiben sie das TechNet Script Center. Besuchen Sie es unter www.scriptingguys.com.


 Exchange Fragen &amp; Antworten: Transaktionsprotokolle, Cmdlets, Remotemanagement und mehr
Exchange Fragen & Antworten
Transaktionsprotokolle, Cmdlets, Remotemanagement und mehr
KC Lemson and Nino Bilic

F: Warum wurde die Transaktionsprotokollgröße in Microsoft® Exchange Server 2007 auf 1 MB herabgesetzt?
A: Exchange 2007 bietet den Protokollversand. Dies ist eine Technologie, auf der mehrere neue Features mit dem Namen „Fortlaufende lokale Replikation“ (Local Continuous Replication, LCR) und „Fortlaufende Clusterreplikation“ (Cluster Continuous Replication, CCR) beruhen. Wenn dies auf der Ebene einer Speichergruppe (Storage Group, SG) aktiviert ist, werden die Speichergruppen-Transaktionsprotokolle aus der ausgeführten Speichergruppe in die Kopiespeichergruppe kopiert. Die Protokolle in der Kopiespeichergruppe werden in der Datenbank wiedergegeben, um sie auf dem neuesten Stand halten. Dies ist die grundlegende, vereinfachte Erklärung.
Das Problem besteht darin, dass Transaktionsprotokolle nicht an die Kopiespeichergruppe gesendet werden können, es sei denn, das Protokoll ist für die Produktionsspeichergruppe geschlossen. Das heißt, dass das e00-Protokoll (das aktuelle Protokoll in der ersten Speichergruppe) erst gesendet werden kann, wenn es vollständig, geschlossen und umbenannt ist. Darüber hinaus sind Einstellungen verfügbar, mit denen Sie die Anzahl der Protokolle in diesem Prozess steuern können, da ein Kompromiss zwischen Verfügbarkeit und Leistung erforderlich ist. (Diese Einstellungen sind verfügbar, indem Sie das Set-MailboxServer-Cmdlet in der Exchange-Verwaltungsshell ausführen. Die Hilfedatei enthält Details zu den genauen erforderlichen Parametern.)
Die Transaktionsprotokollgröße wurde reduziert, um die Datenmenge zu minimieren, die zwischen den beiden Kopien der Speichergruppe möglicherweise nicht synchron ist. Dies spielt eine Rolle, wenn beispielsweise die Festplatte der Produktionsdatenbank abstürzt und Sie daraufhin den Start der Speichergruppe von der Kopie in Angriff nehmen müssen. Bei kleineren Transaktionsprotokollen ist die Wahrscheinlichkeit geringer, dass großer Datenverlust entsteht.
Das bedeutet jedoch nicht, dass Sie maximal 1 MB Daten verlieren. In Anbetracht der Tatsache, dass es sich um Transaktionsprotokolle handelt, ist es möglich, dass die verloren gegangene Protokolldatei mit 1 MB beispielsweise eine COMMIT-Transaktion für 5 MB enthalten könnte. In diesem Fall würden Sie die 5 MB Daten auf der Kopie verlieren. Obwohl Sie möglicherweise bereits fünf der Protokolle mit den Daten erhalten haben, sind das letzte Protokoll mit den wenigen Daten und die benötigte COMMIT-Transaktion wichtig.
Letzten Endes liegt es an Ihnen zu beurteilen, ob es sich angesichts Ihrer Geschäftsanforderungen um ein annehmbares Risiko handelt. Ein kleiner Datenverlust mit einer Wiederherstellungszeit von nur wenigen Minuten kann durchaus im Vergleich zu stundenlanger Wiederherstellungsarbeit akzeptabel sein. Weitere Aspekte dieses Themas werden in Zukunft an dieser Stelle eingehender behandelt.

F: Da die Transaktionsprotokolle nun kürzer sind: Werden sie zu einem früheren Zeitpunkt „knapp“, das heißt, reichen sie nicht mehr so lange aus?
A: „Knapp werden“ bezieht sich in Exchange auf die Transaktionsprotokollnamen. In Exchange Server 2003 werden Transaktionsprotokolle folgendermaßen benannt:
E nn fffff.log
„nn“ ist das Präfix, das sich von Speichergruppe zu Speichergruppe ändert. Da „nn“ während der gesamten Lebensdauer der Speichergruppe gleich bleibt, stellt der „fffff“-Wert die Anzahl eindeutig bezeichneter Transaktionsprotokolle dar, die für die Speichergruppe erstellt werden können. Er beträgt etwa eine Million Protokolle. Einige unserer Kunden haben bereits auf ausgelasteten Postservern diese Beschränkung erreicht.
Seit Exchange Server 2000 stellen wir einen Hotfix zur Verfügung, damit ein Ereignis im Anwendungsprotokoll angezeigt wird, wenn diese Grenze beinahe erreicht wird. (Weitere Informationen hierzu erhalten Sie unter support.microsoft.com/kb/896001.)
Was passiert in Exchange 2007? Oben wurde beschrieben, dass die Größe der Transaktionsprotokolle von 5 MB (die Größe in früheren Versionen von Exchange) auf 1 MB (die Größe in Exchange 2007) reduziert wurde. Bedeutet dies, dass eindeutige Transaktionsprotokollnamen bereits nach einem Fünftel der Daten nicht mehr genügend Platz haben?
Die Antwort lautet: Nein. In Exchange 2007 weist der Name des Transaktionsprotokolls das folgende Format auf:
E nn ffffffff.log
Beachten Sie, dass im Gegensatz zu den in früheren Versionen von Exchange zur Verfügung stehenden „fffff“ nun „ffffffff“ Protokolle verfügbar sind. Wegen der internen Berechnungsmethode der Extensible Storage Engine (ESE) kann Exchange 2007 nicht alle „ffffffff“ Protokolle erstellen. Stattdessen werden „7fffffec“ Protokolle erstellt, was auch eine hohe Anzahl darstellt. (Bei der Konvertierung von Hexadezimalzahlen in Dezimalzahlen wird dies noch deutlicher.)
Was bedeutet dies in der Praxis? Es bedeutet, dass Sie mit Exchange 2007 etwa 2048 Mal mehr Protokolle erstellen können als in früheren Versionen von Exchange. Was die Protokolle betrifft, die ein Fünftel der Größe besitzen:
2048 / 5 = 409.6
Sie können mit dem neuen Protokollbenennungsschema 409 Mal mehr Daten verarbeiten als mit dem alten Schema. Beachten Sie, dass sich diese Einheiten auf Speichergruppen und nicht auf Server beziehen, weil jede Speichergruppe ein anderes Protokolldateipräfix besitzt (wie e00, e01 usw.). Darüber hinaus können Sie in der Enterprise-Version von Exchange 2007 50 Speichergruppen pro Server erstellen. Es sieht also nicht so aus, als ob in naher Zukunft die Transaktionsprotokolle knapp werden könnten.

F: Wie kann ich meine Exchange 2007-Server von einem Remotestandort aus verwalten?
A: Es steht Ihnen eine Anzahl von Optionen zur Remoteverwaltung von Exchange 2007-Servern zur Verfügung. Erstens können Sie die Exchange 2007-Verwaltungstools auf einem anderen Computer als Ihrem Exchange-Server installieren, wenn dieser Computer entweder die 32-Bit- oder die 64-Bit-Version von Windows Server® 2003 Service Pack 1 (SP1) oder höher oder Windows Server 2003 R2 oder Windows XP SP2 oder höher ausführt. Beachten Sie, dass in Produktionsumgebungen die Installation von Serverrollen (Clientzugriff, Postfach, Edge usw.) auf 32-Bit-Hardware nicht unterstützt wird. Sie wird jedoch für die Installation von Verwaltungstools auf einem 32-Bit-Computer unterstützt. Denken Sie auch daran, dass die Verwaltungstools ab der ersten Version von Exchange Server 2007 nicht unter Windows Vista™ unterstützt werden.
In einigen Organisationen erstellt die IT-Abteilung einen einzelnen Server, der als Verwaltungsserver dient und auf dem die notwendigen Verwaltungstools für verschiedene Produkte installiert werden. Anschließend greifen Administratoren, die diese Tools benötigen, für die Remoteverwaltung über Terminalserver auf den Verwaltungsserver zu. In anderen Situationen installieren die Benutzer die Verwaltungstools auf ihren eigenen Desktops.
Von der Konsole oder der Shell aus können Sie Vorgänge auf den Servern in Ihrer Organisation ausführen. In der Konsole sind die Server sichtbar, sodass Sie auf allen Servern Vorgänge von einem Remotestandort aus durchführen können. In der Shell unterstützen viele Aufgaben ein Filterkennzeichen wie -server, wenn ein Vorgang auf einem einzelnen Server durchgeführt werden soll. Für Befehle, die lokal ausgeführt werden müssen, wie z. B. der Get-NetworkConnectionInfo-Befehl, gelten einige Ausnahmen.

F: Der letzte Artikel enthielt Informationen über den empfohlenen Arbeitsspeicher für einen Exchange 2007-Server. Wie groß sollte die Auslagerungsdatei sein?
A: Um potenzielle Fehler wegen Mangels an virtuellem Arbeitsspeicher zu vermeiden, werden die folgenden Richtlinien für die Festsetzung der Größe Ihrer Systemauslagerungsdatei empfohlen.
Wenn der Server über weniger als 8 GB RAM verfügt, sollte die Mindestgröße der Auslagerungsdatei der RAM-Größe plus 10 MB entsprechen. Wenn der Server folglich 4 GB RAM besitzt, beträgt die Mindestgröße 4 GB plus 10 MB. Die empfohlene Größe für die Auslagerungsdatei setzt sich jedoch aus der RAM-Größe mal 1,5 zusammen. Das wären für einen 4 GB-Server 6 GB.
Darüber hinaus wird für einen Server mit mehr als 8 GB RAM die Mindestgröße für die Auslagerungsdatei auf die gleiche Weise berechnet, also die RAM-Größe plus 10 MB. Die empfohlene Größe wird jedoch anders bestimmt. Grundsätzlich sollten Sie auf einem Server mit 8 GB RAM die RAM-Größe mit 1,5 multiplizieren, wenn Sie bei kleineren Auslagerungsdateien Fehlermeldungen wegen eines Mangels an virtuellem Speicher erhalten.
Beachten Sie, dass die hier aufgeführten Fehler keinen Bezug zur Fragmentierung von virtuellem Speicher haben (ein Problem bei Exchange 2000- und Exchange 2003-Servern). Hierbei handelt es sich um vom System protokollierte Popupfehler, denen zufolge die Größe der Auslagerungsdatei erhöht wird oder die Auslagerungsdatei zu klein ist.

F: Ich würde gerne mehr über die Verwendung der Exchange-Verwaltungsshell erfahren, habe jedoch noch nie zuvor eine Befehlszeile für die Verwaltung meiner Systeme verwendet. Wo beginne ich?
A: Zuerst sollen grundlegende Dinge erläutert werden. Jedes Cmdlet in der Exchange-Verwaltungsshell besteht aus einem einzelnen Verb und einem einzelnen Substantiv. Es gibt nur ein paar Verben, die von der Exchange-Verwaltungsshell verwendet werden: „Get“ wird verwendet, um Eigenschaften von Objekten abzurufen. „Set“ wird verwendet, um die Eigenschaften eines Objekts zu ändern, „New“, um neue Objekte zu erstellen usw. Zu den Substantiven der Exchange-Verwaltungsshell gehören viele Begriffe, mit denen alle Exchange-Administratoren bereits vertraut sind (z. B. Mailbox, Contact, Queue und OWAVirtualDirectory). Einige Begriffe sind jedoch in Exchange Server 2007 neu (wie TransportRule, StorageGroupCopy und UMAutoAttendant). In der Praxis sieht ein grundlegendes Cmdlet etwa folgendermaßen aus: New-Mailbox (Erstellen eines Postfachs) oder Get-Mailbox (Abrufen einer Liste der Postfächer in der Organisation).
Die meisten Cmdlets benötigen jedoch weitere Einzelheiten zur gewünschten Verwendung. Wenn Sie beispielsweise eine Eigenschaft in einem Postfach ändern möchten, müssen Sie den Namen des Postfachs und der Eigenschaft angeben. Dies geschieht über Parameter. Wenn „New-Sandwich“ ein Cmdlet wäre, dann könnten die Parameter, die den Inhalt des Sandwichs genauer beschreiben, „-AnzahlderTomatenscheiben 4“, „-Brot Weizen“ usw. heißen.
Wenn Sie die Verb-/Substantivaufteilung verstehen, können Sie die Befehlszeilenbereitstellung im Assistenten der Exchange-Verwaltungskonsole (Exchange Management Console, EMC) verwenden, um zu erfahren, mit welchen Cmdlets welche Vorgänge durchgeführt werden können. Führen Sie in der EMC den Assistenten aus, um einen neuen Benutzer zu erstellen. Nach Abschluss des Vorgangs wird am Ende des Assistenten eine Kopie des Befehls angezeigt, der im Inneren ausgeführt wurde (siehe Abbildung 1). Durch Drücken von STRG+C wird der Inhalt des Dialogfelds kopiert, sodass Sie das Cmdlet anschließend in Editor einfügen und eigene einfache Batchdateien zusammenstellen können.
Abbildung 1 Befehlszeilenbereitstellung zum Erstellen eines neuen Benutzers
Abbildung 1 Befehlszeilenbereitstellung zum Erstellen eines neuen Benutzers (Klicken Sie zum Verkleinern auf das Bild)
Abbildung 1 Befehlszeilenbereitstellung zum Erstellen eines neuen Benutzers
Abbildung 1 Befehlszeilenbereitstellung zum Erstellen eines neuen Benutzers (Klicken Sie zum Vergrößern auf das Bild)
Wenn Sie die Verwendung von Cmdlets üben möchten (ohne einen Schaden zu verursachen), können Sie den Befehl mit einem -WhatIf am Ende abschließen. Dadurch erfahren Sie, welche Aktionen das System durchführen würde, ohne dass diese Änderungen tatsächlich vorgenommen werden.
Sobald Sie mit den grundlegenden Cmdlets wie *-Mailbox vertraut sind, möchten Sie sicherlich auch andere ausprobieren. Verwenden Sie das Get-ExCommand-Cmdlet, um nach weiteren Cmdlets zu suchen. Dadurch wird eine Liste aller Cmdlets der Exchange-Verwaltung angezeigt. (Dies muss während der Ausführung der Exchange-Verwaltungsshell durchgeführt werden. Wenn Sie einfach nur die Microsoft-Befehlsshell oder Windows PowerShell™ öffnen, können Sie diese Aufgabe oder andere Aufgaben der Exchange-Verwaltung nicht durchführen.) Die Liste ist lang. Deshalb empfiehlt sich die Verwendung von Platzhaltern, um die Suche anzupassen. Beispielsweise gibt „Get-ExCommand *database*“ eine Liste aller Exchange-Cmdlets zurück, die „database“ in ihrem Namen haben, wie Dismount-Database, Move-DatabasePath und New-MailboxDatabase.
Wenn Ihnen ein Teil des gesuchten Substantivs bekannt ist, können Sie die Optionen durchlaufen. Sie können beispielsweise „Get-Mailbox“ eingeben und anschließend die Tabulatortaste drücken, um alle Cmdlets mit „mailbox“ im Substantiv des Aufgabennamens zu durchlaufen. Sie können sogar die Verwendung von Platzhaltern mit der Vervollständigung durch die Tabulatortaste kombinieren. Zum Beispiel können Sie „Get-*Mailbox*“ eingeben und mit der Tabulatortaste die möglichen Optionen durchlaufen.
Ein anderer einfacher Trick besteht in der Verwendung von Eingabeaufforderungen. Jedes Cmdlet besitzt einen Satz an Parametern, die von den grundlegenden Standardparametern für die Durchführung des Vorgangs benötigt werden. Get-Cmdlets, wie Get-Mailbox, benötigen keine Parameter. Standardmäßig gibt Get-Mailbox eine Liste aller Postfächer in der gesamten Organisation zurück. (Standardmäßig beschränkt sich diese Liste auf 1000 Einträge. Um diesen Höchstwert zu ändern, können Sie beispielsweise „Get-Mailbox -ResultSize 2000“ eingeben.) Sie erhalten von Cmdlets, die Objekte erstellen oder ändern (wie Set oder New), eine Aufforderung, die benötigten Informationen über das zu erstellende oder zu ändernde Objekt einzugeben. Wenn Sie beispielsweise New-Mailbox ausführen, werden Sie von der Shell aufgefordert, nacheinander das Kennwort, die Datenbank, den Namen usw. einzugeben.
Um mehr über die möglichen Parameter in einem bestimmten Cmdlet herauszufinden, verwenden Sie das Hilfesystem: Help Move-DatabasePath. (Sie können auch einfach nur „Move-DatabasePath“, „Move-DatabasePath -?“ usw. eingeben.) Sie erhalten eine Beschreibung des Cmdlets und eine Liste der Parameter mit dem Zweck eines jeden. Sie können auf die Hilfe ebenso über das Get-Help-Cmdlet zugreifen.
Eine andere Methode, mögliche Parameter für ein Cmdlet zu ermitteln, besteht in der Verwendung der Tabulatorvervollständigung für Parameternamen. Geben Sie „Get-Mailbox -S“ ein, und drücken Sie die Tabulatortaste. Sie durchlaufen alle möglichen Parameter, die mit S beginnen.
Darüber hinaus steht Ihnen selbstverständlich das umfangreiche Hilfesystem zur Verfügung. Wenn Sie etwas offline nicht finden können, sollten Sie es im regelmäßig aktualisierten Hilfeinhalt unter go.microsoft.com/fwlink/?linkid=79421 sowie in der Kurzübersicht unter go.microsoft.com/fwlink/?linkid=64647 suchen (jeweils auf Englisch).
Auf diese Weise können Sie die Arbeit mit der Exchange-Verwaltungskonsole beginnen. Die hier aufgeführten Informationen beschränken sich jedoch nur auf das Wesentliche und können die tatsächliche Leistung und Flexibilität des Tools nur oberflächlich behandeln. Aus diesem Grund werden wir dieses Thema ausführlicher in einem anderen Artikel besprechen.

F: In Exchange Server 2003 ESM (Exchange System Manager) konnten wir leicht die Postfachgröße aller Benutzer erkennen. Dieses Feature scheint in Exchange 2007 abhanden gekommen zu sein. Gibt es eine Möglichkeit, diese Informationen in Exchange 2007 anzuzeigen?
A: In der neuen Exchange 2007-Konsole können Sie die Größe eines Postfachs der allgemeinen Eigenschaftenseite des Postfachs entnehmen. Wenn Sie diese Informationen für mehrere Benutzer anzeigen möchten, müssen Sie die Exchange-Verwaltungsshell verwenden.
Wenn Sie Get-MailboxStatistics ausführen, können Sie die Daten eines ganzen Servers abrufen (nicht nur einer bestimmten Datenbank). Standardmäßig wird die Größe nicht gezeigt. Sie müssen das Cmdlet mit Format-List ausführen, um die Größe abzurufen.
get-mailboxstatistics | format-list
Manchmal empfiehlt es sich auch, die Anzeige auszuwählen und in eine Tabelle zu leiten. Im folgenden Beispiel wird der Anzeigename des Postfachs, die Gesamtgröße des Elements, die Gesamtgröße der gelöschten Elemente sowie die Datenbank des Postfachs abgerufen:
Get-MailboxStatistics | Select-Object
displayname,totalitemsize,
totaldeleteditemsize,databasename
| Format-Table
Je nachdem, welche Informationen Sie suchen, können Sie für die Ausgabe unterschiedliche Formate festlegen. In diesem Beispiel funktioniert Format-Table besser als Format-List.

KC Lemson ist leitende Programm-Managerin im Exchange Server-Team.
Nino Bilicist Technical Lead.


 Sicherheit auf dem Pr&#252;fstand: Bereitstellen von EFS: Teil&#160;2
Sicherheit auf dem Prüfstand
Bereitstellen von EFS: Teil 2
John Morello

Jede Bereitstellung des verschlüsselnden Dateisystems (Encrypting File System, EFS) besteht hauptsächlich aus zwei Teilen: dem Back-End-Entwurfsanteil mit Schwerpunkt auf Zertifikatsverwaltung und Wiederherstellungs-Agents und dem an die Benutzer gerichteten EFS-Bereitstellungsanteil. Im Beitrag des letzten Monats wurde der Back-End-Anteil behandelt, und es wurden Optionen für die Daten- und Schlüsselwiederherstellung erörtert.
Außerdem wurden die Optionen für das Ausstatten von Clients mit Zertifikaten behandelt. Im vorliegenden Artikel werden die Aspekte der Bereitstellung behandelt, die Ihre Endbenutzer betreffen. Dazu gehören Verbesserungen von Windows® Explorer, das Auswählen der zu verschlüsselnden Dateisystemspeicherorte und das Verwalten von Verschlüsselungsoptionen mittels Gruppenrichtlinien.

Ermitteln des Verwendungsstatus von EFS
Wenn Sie sich dafür entschieden haben, EFS bereitzustellen, besteht der erste Schritt darin, den aktuellen Verwendungsstatus von EFS innerhalb Ihrer Organisation festzustellen. Denken Sie daran, dass EFS in eigenständigem Modus verwendet werden kann, in dem allein der Endbenutzer für die Erstellung und Sicherung der Verschlüsselungsschlüssel verantwortlich ist. Möglicherweise befinden sich in Ihrer Organisation fortgeschrittene Benutzer, die bereits EFS in diesem Modus verwendet haben. Es ist deshalb wichtig zu wissen, wer diese Benutzer sind, um einen reibungslosen Wechsel zu einer besser überschaubaren Bereitstellung zu gewährleisten.
Das erste Mal, wenn EFS von einem Benutzer auf einem Computer bereitgestellt wird, erstellt Windows den folgenden Registrierungseintrag in HKEY_CURRENT_USER:
HKCU\Software\Microsoft\Windows NT\CurrentVersion\EFS\CurrentKeys\CertificateHash
Mit Microsoft® Systems Management Server (SMS), Active Directory-Anmeldeskripts oder anderen Tools kann geprüft werden, ob dieser Eintrag auf den Computern in Ihrem Unternehmen vorhanden ist. Wenn dieser Registrierungswert auf dem Computer eines Benutzers vorhanden ist, dann hat er/sie EFS schon einmal verwendet. Dieser Wert zeigt jedoch nicht unbedingt an, dass jemand derzeit EFS verwendet oder dass Daten dieses Benutzers verschlüsselt wurden. Deshalb sollte ein Computer näher untersucht werden, um zu bestimmen, ob er derzeit verschlüsselte Daten enthält, falls dieser Registrierungswert auf dem Computer eines Benutzers festgestellt wird.
Durch die Verwendung von cipher.exe und die Übergabe der /U- und /N-Schalter wird die Verschlüsselung angewiesen, einen Bericht über den Verschlüsselungsstatus der Dateien und Verzeichnisse auf einem Computer zu erstellen. Wenn Sie zum Beispiel bestimmen wollen, ob Daten auf einem System verschlüsselt wurden, können Sie den folgenden Befehl ausführen:
cipher /U /N
Die Registrierungsüberprüfung und der Verschlüsselungsbericht könnten in einem einzigen Skript kombiniert werden, sodass sie prüfen, ob der Registrierungswert vorhanden ist, und falls er vorhanden ist, einen Bericht über derzeit verschlüsselte Dateien auf dem Computer generieren. Nachdem diese Berichte generiert sind, wissen Sie, welche Dateien von welchen Benutzern verschlüsselt wurden, und Sie sind bereit, sie zu einem zentral verwalteten Entwurf zu migrieren.
Um die Anwendung von Gruppenrichtlinien während der Bereitstellung zu steuern, ist es nützlich, zwei Sicherheitsgruppen in Ihrer Domäne zu erstellen, um die Computer, auf denen EFS verwendet wird, von denjenigen zu trennen, auf denen EFS nicht verwendet wird. Zum Beispiel würde „SG-ComputersUsingEFS“ die Computerkonten der Computer enthalten, auf denen EFS bereits verwendet wird, während „SG-ComputersNotUsingEFS“ alle Computer enthalten würde, auf denen EFS derzeit nicht verwendet wird.

Steuern der EFS-Verwendung mittels Gruppenrichtlinien
Nachdem erst einmal bekannt ist, von wem EFS verwendet bzw. nicht verwendet wird, besteht der nächste Schritt in Ihrer Clientbereitstellung darin, die eigenständige EFS-Verwendung für alle Benutzer, die EFS derzeit nicht verwenden, zu deaktivieren. Dies ist ein wichtiger Schritt im Bereitstellungsprozess, weil es leichter ist, EFS beim ersten Mal ordnungsgemäß zu aktivieren und zu konfigurieren, statt Benutzer zu migrieren, die selbstsignierte Zertifikate verwenden. Dieser Schritt sollte nur dann ausgeführt werden, nachdem feststeht, welche Benutzer EFS bereits verwenden, denn dadurch, dass EFS durch Gruppenrichtlinien deaktiviert wird, können die Benutzer auf keine derzeit verschlüsselten Dateien mehr zugreifen. Sie finden diese Richtlinie im Gruppenrichtlinienobjekt-Editor unter Computerkonfiguration\Windows-Einstellungen\Sicherheitseinstellungen\Richtlinien öffentlicher Schlüssel\Verschlüsselndes Dateisystem.
Wie bereits erwähnt sollte dieser Wert nur auf Computern aktiviert werden, auf denen EFS derzeit nicht verwendet wird, um die Arbeit derjenigen, die bereits mit EFS arbeiten, nicht zu unterbrechen. In diesem Beispiel wird deshalb von der Zugriffssteuerungsliste (ACL) des Gruppenrichtlinienobjekts (GPO), von dem das EFS deaktiviert wird, nur die Gruppe „SG-ComputersNotUsingEFS“ dazu berechtigt, die Gruppenrichtlinie anzuwenden.

Verschlüsseln: Ja oder Nein?
Nachdem erst einmal feststeht, welche Systeme derzeit EFS verwenden, und nachdem Sie EFS auf allen anderen Systemen deaktiviert haben, bis die verwaltete Bereitstellung erfolgt ist, müssen Sie als Nächstes festlegen, was in der verwalteten Bereitstellung verschlüsselt werden soll. Je nachdem, wie Ihre Clientsysteme verwaltet werden, kann sich der Verlauf dieses Prozesses einfach oder aber auch recht schwierig gestalten.
Bei der Frage, welche Dateien verschlüsselt werden sollen, muss als Erstes die Überlegung angestellt werden, ob Ihre Benutzer die Administratoren ihrer Systeme sind. Falls Ihre Benutzer lokale Administratoren sind, können Sie sie eigentlich nur darin schulen und dazu ermutigen, vertrauliche Daten zu verschlüsseln. Sie können dies jedoch nicht wirklich in einer verwalteten Weise kontrollieren. Der Grund dafür ist einfach: Ein lokaler Administrator kann Dateien und Verzeichnisse an einem beliebigen Ort auf dem Dateisystem erstellen. Folglich können Sie allgemein verwendete Speicherorte verschlüsseln, wie z. B. „Eigene Dateien“. Wenn der Benutzer jedoch ein neues Verzeichnis an einem anderen Speicherort erstellt und vertrauliche Informationen dort speichert, ist es sehr schwer sicherzustellen, dass diese Daten ebenfalls geschützt werden. Abgesehen von allen anderen Sicherheitsvorteilen, die erzielt werden, wenn es sich bei Endbenutzern nicht um lokale Administratoren handelt, trägt dies außerdem dazu bei, dass EFS weit überschaubarer und sicherer wird.
Als nächsten wichtigen Aspekt müssen Sie bei ESF bedenken, dass es sich um eine benutzerspezifische Verschlüsselung handelt. Mit anderen Worten kann alles, was von einem bestimmten Benutzer verschlüsselt wird, nur von demselben Benutzer und keinem anderen entschlüsselt werden, einschließlich des Systemkontos. Davon ist der Datenwiederherstellungs-Agent (Data Recovery Agent, DRA) natürlich ausgenommen. Das heißt: Wenn eine EXE- oder DLL-Datei mit dem Schlüssel eines Benutzers verschlüsselt wurde und ein anderer Prinzipal auf dem System versucht, darauf zuzugreifen, erhält der andere Prinzipal eine Fehlermeldung, dass der Zugriff verweigert wurde. Im Allgemeinen sollen Sie deshalb Dateien oder Verzeichnisse mit ausführbarem Code, auf den möglicherweise mehrere Prinzipale auf einem System zugreifen müssen, nicht verschlüsseln. Windows verhindert die Verschlüsselung von Dateien in %SystemRoot% oder von Dateien, die das Systemattribut aufweisen, doch es kommt oft vor, dass Softwarehersteller für Dienste, die möglicherweise vom Systemkonto ausgeführt werden, Binärdateien in %ProgramFiles% installieren. Dies ist zum Beispiel ein Verfahren, das Laptophersteller allgemein anwenden, wenn sie eine als ein Dienst ausgeführte Leistungs- und Geräteverwaltungssoftware installieren.
Was sind also die Best Practices für EFS-Verschlüsselungsziele, wenn diese beiden Aspekte in Betracht gezogen werden? Die Antwort ist darin zu finden, wie die Systeme Ihrer Benutzer normalerweise konfiguriert sind. In einer gut verwalteten Umgebung mit einem standardisierten Abbild des Betriebssystems können Sie wahrscheinlich den Verschlüsselungsprozess für Benutzer aufgrund der vordefinierten Datenspeicherorte in Ihrem Abbild automatisieren. Wenn Benutzer zum Beispiel nur Daten in %userprofile%\Eigene Dateien speichern können, müssen Sie möglicherweise nur dieses Verzeichnis verschlüsseln. (Hinweis: Gehen Sie beim Verschlüsseln von „Eigene Dateien“ vorsichtig vor, wenn Sie die Ordnerumleitung verwenden. Wenn „Eigene Dateien“ zu einem Server umgeleitet wird, muss für den Server die Option „Für Delegierungszwecke vertraut“ aktiviert und die Zugriffsberechtigung für das Benutzerprofil erteilt werden. In solchen Fällen ist es gewöhnlich leichter, einfach nur den Offlinedateien-Cache zu verschlüsseln (dies wird weiter unten behandelt).
In einer weniger überschaubaren Umgebung (in der Benutzer möglicherweise an viele Orte auf dem Dateisystem schreiben) können Sie die Verschlüsselung von ein paar gemeinsamen Speicherorten automatisieren und anschließend die Benutzer darin schulen, wie sie andere Orte selbst verschlüsseln. Ganz unabhängig von Ihrer Umgebung sollen Sie statt auf Dateiebene immer auf Verzeichnisebene verschlüsseln. Dadurch wird gewährleistet, dass alle Dateien, die in diesem Verzeichnis erstellt werden, einschließlich temporärer Dateien, immer verschlüsselt sind.

Empfohlene Verschlüsselungsorte
Im Allgemeinen sollten folgende Orte verschlüsselt werden: %userprofile%\Eigene Dateien, %userprofile%\Anwendungsdaten\Microsoft\Outlook (es wird davon ausgegangen, dass Sie Microsoft Office Outlook® als Ihren Messaging-Client verwenden) und %userprofile%\Desktop. Das Verschlüsseln von „Eigene Dateien“ schützt den Standardspeicherort für Dateien unter Windows XP. Das Sichern des Outlook-Verzeichnisses stellt sicher, dass vertrauliche E-Mails, die lokal zwischengespeichert werden, ebenfalls verschlüsselt werden. Dies ist insbesondere für Benutzer wichtig, die Outlook 2003 standardmäßig im Cachemodus ausführen. Abschließend ist anzumerken, dass der Desktop oft als eine Art temporäres Verzeichnis verwendet wird, in dem die Benutzer derzeit bearbeitete Dokumente oder oft benutzte Präsentationen ablegen können. Es kann natürlich sein, dass Sie in Ihrer Organisation die Standardorte einiger dieser Verzeichnisse geändert haben, deshalb sollten Ihre Entscheidungen in puncto EFS-Verschlüsselung die normalerweise in Ihrer Organisation verwendeten Speicherorte widerspiegeln.
Zusätzlich zu diesen allgemeinen Best Practices empfiehlt es sich zu untersuchen, ob Anwendungen vorhanden sind, in denen vertrauliche Informationen an alternativen Orten gespeichert sein könnten. Einige Anwendungen speichern Benutzerinformationen zum Beispiel in %ProgramFiles%\AppName statt im Benutzerprofil. Es ist wichtig festzustellen, ob solche Anwendungen auf Ihren Clientsystemen vorhanden sind, damit Sie alle Daten, die diese Systeme verwenden, ordnungsgemäß schützen können. Bestenfalls könnte die Anwendung so konfiguriert werden, dass die Änderungen in einem anderen benutzerprofilspezifischen Pfad (wie z. B. „Eigene Dateien“) gespeichert werden, in dem keine weiteren EFS-Änderungen erforderlich sind. Schlimmstenfalls, d. h. wenn die Anwendung erfordert, dass Daten im Verzeichnis „Programme“ gespeichert werden, könnte EFS dazu verwendet werden, um nur dieses eine Unterverzeichnis von „Programme“ zu verschlüsseln.
Abschließend ist Folgendes anzumerken: Gehen Sie vorsichtig vor, falls Sie planen, das temporäre Verzeichnis (%TMP% und %TEMP%) zu verschlüsseln. Viele Anwendungsinstallationsprogramme verwenden dieses Verzeichnis für die Erweiterung des Installationspaketinhalts und führen dann Dateiverschiebungen für die erweiterten Dateien aus, um sie im richtigen Pfad in %ProgramFiles% zu platzieren. Da eine auf dem gleichen Volume verschobene Datei ihre ursprünglichen Attribute beibehält, ist die Datei weiterhin verschlüsselt, nachdem sie nach %ProgramFiles% verschoben wurde. Wenn ein anderer als der das Installationsprogramm ausführende Benutzer versucht, diese Datei zu verwenden, wird der Zugriff verweigert. Oft treten solche Probleme nicht in Form von deutlichen Anwendungsfehlermeldungen auf, in denen die Hauptursache angezeigt wird. Deshalb empfiehlt sich im Allgemeinen, dass %TMP% nur in gut verwalteten Umgebungen verschlüsselt wird, in denen die Endbenutzer die Anwendungen nicht eigenständig installieren.

Schützen von Offlinedateien
„Offlinedateien“ ist ein Feature in Windows 2000 und höher, mit dem die Benutzer eine lokale Kopie der Daten, die auf einem Dateiserver gespeichert sind, erstellen können. Es ermöglicht das Bearbeiten dieser Daten, wenn keine Verbindung zum Server besteht, und das Synchronisieren von Änderungen mit dem Server, sobald er wieder verbunden wird. Bei Offlinedateien handelt es sich jedoch nicht einfach um ein Verzeichnis, das vom Server stammende Kopien der Dateien enthält. Vielmehr ist es eine Datenbank, die systemübergreifend freigegeben ist und im Kontext des Systemkontos ausgeführt wird. In Windows XP kann diese Datenbank mit EFS geschützt werden. Bedenken Sie, was dies angesichts des weiter oben behandelten Aspekts, dass EFS benutzerspezifisch ist, bedeutet. Wie kann EFS, das benutzerspezifisch ist, eine Datenbank verschlüsseln, die von mehreren Sicherheitsprinzipalen verwendet wird?
Wenn ein Benutzer, der Windows XP ausführt, die Option in Windows Explorer zur Verschlüsselung von Offlinedateien auswählt, unterscheidet sich die Verschlüsselungsroutine von derjenigen, die der Benutzer möglicherweise für andere Verschlüsselungsvorgänge verwendet. Statt für den Prozess das persönliche EFS-Schlüsselpaar des Benutzers zu verwenden (was den Zugriff des Systems auf die Dateien verhindern würde), generiert das Systemkonto selbst ein Schlüsselpaar für die Verwendung mit EFS und verwendet dieses Schlüsselpaar, um den clientseitigen Cache zu verschlüsseln. Dies hat eine ernsthafte Sicherheitsimplikation zur Folge, denn wenn jemand nachträglich einen Code abrufen kann, um das System auszuführen, können die Daten im Cache entschlüsselt werden. Nach dem Diebstahl eines Laptops ist es für einen Angreifer einfach, das Administratorkennwort zurückzusetzen und sich als Administrator anzumelden. Wenn jemand sich bereits als Administrator angemeldet hat, ist es ebenso einfach, einen Code zur Ausführung als System durchzusetzen und dann auf den Cache zuzugreifen. (Beachten Sie, dass dieses Verhalten in Windows Vista™ geändert wurde. Windows Vista verwendet jetzt den Schlüssel der einzelnen Benutzer, um benutzerspezifische Offlinedateien zu verschlüsseln.)
Um sich gegen diese Art von Angriff zu schützen, kann der Laptop so konfiguriert werden, dass der Verschlüsselungsschlüssel für die Datenbank der Sicherheitskontenverwaltung (Security Accounts Manager, SAM) offline gespeichert wird, und zwar entweder als Kennworteingabe zur Startzeit (Modus 2) oder auf einer Diskette während des Startvorgangs (Modus 3). Beide Methoden können umständlich sein, da sie eine nicht automatisierbare Interaktion mit dem Computer während des Startvorgangs erfordern, was möglicherweise zu Problemen mit einer automatisierten Verwaltung von Systemen führt. Wenn EFS jedoch auf einem Computer mit Offlinedateien verwendet werden soll, ist es wichtig, dass eine dieser Optionen verwendet wird, um die Daten im Cache zu sichern. Normalerweise empfiehlt sich die Verwendung der Kennworteingabe zur Startzeit (siehe Abbildung 1). Der Grund ist: Wenn ein Laptop samt Tasche gestohlen wird, befindet sich der Datenträger entweder bereits im Laptop oder aber mit großer Wahrscheinlichkeit zusammen mit dem Laptop in der Tasche.
Abbildung 1 Automatisieren der EFS-Vorgänge
Abbildung 1 Automatisieren der EFS-Vorgänge

Aktivieren von EFS
Wenn feststeht, was auf Ihrem Client verschlüsselt werden soll, wird als Nächstes der eigentliche Verschlüsselungsvorgang durchgeführt. Dieser Prozess kann durch ein Anmeldeskript oder einen anderen Prozess erzielt werden, bei dem ein Skript auf dem Client ausgeführt wird, das cipher.exe zum Durchführen des Verschlüsselungsvorgangs aufruft. Falls sich in Ihrer Umgebung eigenständige EFS-Benutzer befinden, empfiehlt sich wie weiter oben ausgeführt, dass sie zuerst migriert werden.
Zum Migrieren dieser eigenständigen Benutzer müssen die Clientsysteme als Erstes mit verwalteten Zertifikaten ausgestattet werden (siehe Artikel dieser Rubrik vom Februar 2007 unter http://www.microsoft.com/technet/technetmag/issues/2007/02/SecurityWatch/). Nachdem sich alle Systeme für diese verwalteten Zertifikate registriert haben, sollte die Verschlüsselung mit dem /U-Schalter ausgeführt werden, um alle vorhandenen Dateien mit der neuen Verschlüsselung und den Schlüsseln der Wiederherstellungs-Agents zu aktualisieren. An diesem Punkt nutzen alle Systeme in der SG-ComputersUsingEFS-Gruppe EFS im verwalteten Modus, einschließlich zentral veröffentlichter (und möglicherweise archivierter) Schlüssel und zentral verwalteter Wiederherstellungs-Agents.
Zum Bereitstellen von EFS für die Benutzer, die EFS derzeit nicht verwenden, müssen Sie zuerst die Gruppenrichtlinie, die die EFS-Verwendung verhindert, entfernen. Sobald dies abgeschlossen ist und die Benutzer sich für verwaltete Zertifikate registriert haben, kann ein Anmeldeskript ausgeführt werden, um die weiter oben behandelten Schlüsselpfade zu verschlüsseln. Hier ist ein vereinfachtes Skriptbeispiel:
cipher /e /s /a "%userprofile%\My Documents"

cipher /e /s /a "%userprofile%\Application Data\Microsoft\Outlook"

cipher /e /s /a "%userprofile%\Desktop"
Nachdem Sie EFS für die gewünschten Verzeichnisse aktiviert haben, sollten Sie erwägen, zwei zusätzliche Optionen festzulegen, um die Sicherheit Ihrer EFS-Bereitstellung zu erhöhen. Beide Optionen beziehen sich auf Daten, die vom Speicher auf Datenträger ausgelagert werden. Beachten Sie, dass bei jedem dieser Szenarios die Datenmenge, die von einem Angreifer gegebenenfalls wiederhergestellt werden kann, sich darauf beschränkt, was bei legitimer Verwendung im Speicher enthalten war bzw. auf Datenträger umgelagert wurde. Anders gesagt, wenn ein Benutzer vertrauliche EFS-geschützte Daten auf dem Computer hat, die er/sie noch nicht angezeigt hat (und die sich deshalb noch nicht im Speicher befinden), dann sind diese Daten durch diese Angriffsmethoden nicht gefährdet.
Die Auslagerungsdatei wird von Windows als virtueller Arbeitspeicher verwendet (in anderen Betriebssystemen oft Auslagerungsbereich genannt) und enthält unverarbeitete speicherinterne Daten, die als Klartext auf die Festplatte geschrieben werden. Dies kann vertrauliche Daten auf einem EFS-geschützten System gefährden. Denn wenn ein Angreifer die Auslagerungsdatei wiederherstellen kann, können mit forensischen Tools aus dieser Datei brauchbare Daten extrahiert werden. Da die Auslagerungsdatei selbst in Windows XP nicht verschlüsselt werden kann (beachten Sie, dass sie in Windows Vista verschlüsselt werden kann) ist die beste Option, dass Windows gezwungen wird, sie beim Herunterfahren zu löschen. Dies kann über eine Gruppenrichtlinie erreicht werden (siehe Abbildung 2).
Abbildung 2 Einstellen einer Gruppenrichtlinie
Abbildung 2 Einstellen einer Gruppenrichtlinie (Klicken Sie zum Verkleinern auf das Bild)
Abbildung 2 Einstellen einer Gruppenrichtlinie
Abbildung 2 Einstellen einer Gruppenrichtlinie (Klicken Sie zum Vergrößern auf das Bild)
Der Nachteil dieser Einstellung ist die beachtliche zeitliche Verzögerung beim Herunterfahren eines Computers, insbesondere wenn der Computer über viel Speicherplatz verfügt. (Standardmäßig bezieht sich die Größe der Auslagerungsdatei direkt auf die Größe des physischen Speichers im Computer.) Dies liegt daran, dass Windows vor dem Herunterfahren physisch in jede Seite auf dem Datenträger schreiben muss, um die Auslagerungsdatei zu löschen.
Die Ruhezustanddatei in Windows enthält ein Speicherabbild des physischen Speichers des Computers, wenn der Energieverwaltungsmodus so eingestellt ist, dass er den Ruhezustand aktiviert. Wenn der Ruhezustand eintritt, schreibt Windows den vollständigen Inhalt des physischen Speichers auf Datenträger in der Ruhezustanddatei, sodass der Computer in genau dem gleichen Zustand wiederhergestellt werden kann, wenn der Benutzer bereit ist, die Arbeit fortzusetzen. Ebenso wie die Auslagerungsdatei kann die Ruhezustanddatei in Windows XP nicht verschlüsselt werden. Im Unterschied zur Auslagerungsdatei kann der Ruhezustand jedoch nicht direkt von einem GPO aus deaktiviert werden. Es muss stattdessen ein Skript verwendet werden, um powercfg.exe mit dem /HIBERNATE-Schalter aufzurufen, um den Ruhezustand zu deaktivieren (bzw. zu aktivieren).
Nach dem Abschließen Ihrer anfänglichen Verschlüsselungs- und Konfigurationsaufgaben sollten Sie erwägen, den Pufferbereich auf Datenträgern in Ihrer Bereitstellung zu löschen. Dieser Prozess kann sehr aufwändig sein und zu Ausfallzeiten führen, hat jedoch einen Sicherheitsvorteil in Hochsicherheitsumgebungen. Der Pufferbereich ist der Bereich auf dem Datenträger, der keine aktuell im System verwendete Dateien enthält, jedoch aufgrund der Funktionsweise von Festplatten einige vertrauliche Informationen von zuvor verwendeten Dateien enthalten kann. Das heißt: Da beim Löschen einer Datei nicht wirklich alle Sektoren überschrieben werden, die diese Datei auf dem Datenträger beansprucht (es wird nur der Zeiger aus der Dateitabelle entfernt), sind die gelöschten Daten möglicherweise weiterhin auf diesem Datenträger vorhanden. In solch einem Fall können die Daten durch forensische Tools den Pufferbereich lesen und die Dateien daraus wieder zusammensetzen können, wiederhergestellt werden. Führen Sie die Verschlüsselung mit dem /W-Schalter aus, um diese Restdaten sicher zu löschen. Dies zwingt die Verschlüsselung, alle Sektoren, die auf dem Datenträger als verfügbar gekennzeichnet sind, wiederholt zu überschreiben. Solange alle zukünftigen Dateivorgänge im Hinblick auf vertrauliche Daten in EFS-geschützten Verzeichnissen stattfinden, ist es nicht notwendig, diesen Befehl regelmäßig auszuführen.

Verbesserungen in Windows Explorer bezüglich EFS
Standardmäßig sind die Verschlüsselungs- und Entschlüsselungsoptionen für Dateien und Verzeichnisse sozusagen in den erweiterten Eigenschaftenmenüs in Windows Explorer vergraben. Sie können die Benutzerfreundlichkeit von EFS verbessern, indem Sie „Verschlüsseln“ und „Entschlüsseln“ im Kontextmenü von Windows Explorer platzieren (wird durch Klicken mit der rechten Maustaste eingeblendet). Außerdem kann Windows Explorer so konfiguriert werden, dass EFS-geschützte Dateien und Verzeichnisse in einer anderen Farbe (Grün) als andere Dateien angezeigt werden. So werden Benutzer darüber informiert, ob eine Datei bzw. ein Verzeichnis verschlüsselt ist, ohne bis zum erweiterten Eigenschaftenmenü navigieren zu müssen. Abschließend ist anzumerken, dass Sie bei Bedarf eine Option hinzufügen können, um zu definieren, welche Benutzer über eine Zugriffsberechtigung für die Datei oder das Verzeichnis verfügen. Um diese Optionen zu aktivieren, nehmen Sie
following changes in the registry via a script calling reg.exe:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced]

"EncryptionContextMenu"=dword:00000001

"ShowCompColor"=dword:00000001

[HKEY_CLASSES_ROOT\*\Shell\Encrypt To User...\Command]
@="rundll32 efsadu.dll,AddUserToObject %1"

EFS in Windows Vista
EFS hat eine Anzahl wichtiger Verbesserungen in Windows Vista erfahren, die seine Bereitstellung und Verwaltung vereinfachen und zudem seine Sicherheit erhöhen. Eine der wichtigsten Verbesserungen ist die volle Unterstützung der Speicherung von EFS-Schlüsseln auf Smartcards. Dies ist ein besonders wertvolles Feature für Organisationen, die bereits eine Smartcardanmeldung verwenden, weil dieselbe Karte außerdem dazu verwendet werden kann, die EFS-Schlüssel von Benutzern zu speichern. Diese Unterstützung für Smartcards umfasst auch Zertifikate der Wiederherstellungs-Agents, sodass die vertraulichen DRA-Zertifikate gleichermaßen auf Karten gespeichert werden können.
Windows Vista unterstützt zudem die Verschlüsselung der Elemente, deren Verschlüsselung bisher in Windows XP entweder nicht möglich oder nur schwer durchführbar war. Windows Vista kann die Auslagerungsdatei verschlüsseln, was die Einstellung der Option „Auslagerungsdatei des virtuellen Arbeitspeichers löschen“ überflüssig macht. Der gesamte Entwurf von Offlinedateien ist in Windows Vista neu gestaltet worden. Abgesehen von der verbesserten Leistung und Stabilität (sowie einer allgemein benutzerfreundlicheren Oberfläche) ist das clientseitige Zwischenspeichern jetzt benutzerspezifisch, d. h. es ist möglich, den Cache ohne die Verwendung des SYSKEY-Modus 2 oder 3 zu verschlüsseln. Diese beiden Verbesserungen beseitigen die größten Bereitstellungsprobleme für die Windows XP-basierten Umgebungen von heute.
Abschließend ist anzumerken, dass Windows Vista Administratoren ermöglicht, die Verschlüsselung des Ordners „Eigene Dateien“ direkt durch eine Gruppenrichtlinie zu konfigurieren, ohne ein separates Skript verwenden zu müssen. Abbildung 3 illustriert die neuen EFS-Eigenschaften, die über GPO in Windows Vista verfügbar sind.
Abbildung 3 EFS-Eigenschaften in Windows Vista
Abbildung 3 EFS-Eigenschaften in Windows Vista (Klicken Sie zum Verkleinern auf das Bild)
Abbildung 3 EFS-Eigenschaften in Windows Vista
Abbildung 3 EFS-Eigenschaften in Windows Vista (Klicken Sie zum Vergrößern auf das Bild)

Zusammenfassung
EFS bietet Windows-Administratoren eine sehr sichere Option zum Schutz mobiler Daten. EFS ist skalierbar, verwaltbar und stellt flexible Methoden zur Datenwiederherstellung bereit. In Windows Vista wurde EFS mit erweiterten Funktionen für die leichtere Verwaltung und Bereitstellung sowie mit der Unterstützung für smartcardbasierte Schlüsselspeicherung weiter verbessert. Für Organisationen, die Daten sogar dann, wenn ein Computer physisch verloren gegangen ist, schützen wollen, stellt EFS eine starke Lösung bereit, die bereits Teil Ihrer vorhandenen Windows-Plattform ist.
Informationsquellen
Weitere Informationen zu den Themen, die in diesem Artikel behandelt werden, erhalten Sie in den folgenden Ressourcen:
  • Rubrik „Sicherheit auf dem Prüfstand“ vom Februar 2007
  • Encrypting File System in Windows XP and Windows Server 2003 (auf Englisch)
  • How to Use the SysKey Utility to Secure the Windows Security Accounts Manager Database (auf Englisch)

John Morello hat seine Promotion an der LSU mit Summa cum Laude abgeschlossen und ist seit sechs Jahren in verschiedenen Funktionen für Microsoft tätig. Als leitender Berater hat er Sicherheitslösungen für Fortune 100-Firmen sowie für US-amerikanische Kunden aus dem zivilen Bereich und dem Verteidigungswesen entworfen. Derzeit arbeitet er als Programm-Manager in der Windows Server Group an Sicherheits- und Remotezugriffstechnologien.


 Die Desktopdateien: Einstieg in PsTools
Die Desktopdateien
Einstieg in PsTools
Wes Miller
Laden Sie den Code für diesen Artikel herunter: MillerTheDesktopFiles2007_03.exe (150KB)

Bis zum letzten Jahr war ich bei Winternals Software beschäftigt (das Unternehmen wurde im Juli 2006 von Microsoft übernommen). Winternals verkaufte kommerzielle Software, aber die Unternehmensgründer Mark Russinovich und Bryce Cogswell waren auch Besitzer eines separaten Unternehmens namens Sysinternals, das viele Tools als Freeware vertrieb. Einige dieser Freewareanwendungen wurden
sogar Komponenten des Winternals Administrator’s Pak. Marke und Bryce lizenzierten diese Tools auch für Unternehmen, die sie außerhalb der üblichen Freewarelizenzbedingungen verwenden wollten.
Eines meiner Lieblingstools, bei dem es sich eigentlich um eine ganze Reihe von Tools handelt, ist die PsTools-Suite, die Sie jetzt unter microsoft.com/technet/sysinternals/utilities/pstools.mspx finden. Mark nannte die Tools ps nach dem UNIX-Prozesslisten-Dienstprogramm. Wie auf der Downloadsite für die Tools erwähnt, gibt es integrierte Windows®-Befehlszeilenprogramme, die zum Teil dieselben Funktionen wie diese Tools ausführen können. Doch neben der wichtigen einzigartigen Funktionalität besteht ein Hauptunterschied darin, dass die PsTools-Suite lokal oder von einem Remotestandort aus verwendet werden kann (vorausgesetzt, dass die Remotesysteme richtig konfiguriert sind). Noch besser ist, dass der Prozess zur Remoteausführung fast so einfach wie die lokale Ausführung ist.
Die PsTools-Suite umfasst mehrere einzelne Anwendungen, die in Abbildung 1 aufgeführt sind. Wie bei den übrigen Sysinternals-Dienstprogrammen gibt es kein Installationsprogramm, sondern nur Anwendungen. Stellen Sie die Anwendungen einfach in einen Ordner auf Ihrem Pfad, und los geht’s!
Figure 1 PsTools-Dienstprogramme (Close Figure 1)

Tool | Beschreibung
PsExec | Ermöglicht die Ausführung von Prozessen in beliebigen Benutzerkontexten.
PsFile | Zeigt die Dateien an, die von einem Remotestandort aus auf einem System geöffnet wurden.
PsGetSid | Zeigt die Windows-Sicherheits-ID (SID) eines Computers oder Benutzers an.
PsInfo | Listet Informationen zu einem Windows-System auf.
PsKill | Beendet Prozesse anhand des Namens oder der Prozess-ID.
PsList | Führt ausführliche Informationen zu Prozessen auf, die gerade ausgeführt werden.
PsLoggedOn | Zeigt alle lokal angemeldeten Benutzer an, sowie alle Benutzer, für die Remoteressourcen freigegeben wurden.
PsLogList | Bildet Windows-Ereignisprotokolldatensätze ab.
PsPasswd | Ändert die Kennwörter von Benutzerkonten.
PsService | Zeigt Windows-Dienste an und steuert sie.
PsShutdown | Fährt einen Computer herunter, startet ihn neu, versetzt ihn in den Ruhezustand oder hält ihn an.
PsSuspend | Hält Prozesse an, die gerade ausgeführt werden.
Möglicherweise haben Sie festgestellt, dass ein Teil dieser Funktionalität (speziell PsLogList) über die Windows-Verwaltungsinstrumentation (WMI) und eine komplexe Skriptprogrammierung ausgeführt werden könnte. Das Besondere an der PsTools-Suite ist jedoch, dass jedes Dienstprogramm zur einfachen Durchführung einer bestimmten Aufgabe entwickelt wurde.
Ich werde Ihnen die einzelnen Tools vorstellen und jeweils anhand eines einfachen Beispiels zeigen, warum und wie Sie das jeweilige Tool verwenden könnten. Doch zuerst finden Sie hier eine kurze Einführung, wie die Tools selbst arbeiten und welche Voraussetzungen vorhanden sein müssen, damit sie funktionieren.

Wie funktionieren die Tools?
Die Tools funktionieren im Allgemeinen auf gleiche Weise. Auf dem Hostsystem starten Sie das gewünschte PsTool. Obwohl viele dieser Tools lokal ausgeführt werden können, werden Sie feststellen, dass sie in der Regel den größten Nutzen bieten, wenn sie für ein Remotesystem oder mehrere Systeme auf einmal ausgeführt werden. (PsExec bildet eine Ausnahme, wie Sie unten in meinem Beispiel sehen werden.) Bei Verwendung des von Ihnen bereitgestellten Befehlszeilenarguments kopiert sich das Dienstprogramm selbst in die administrative Freigabe des Remotesystems, die dieselbe wie %SystemRoot% (Windows-Verzeichnis) auf dem Remotesystem ist.
Nach dem Kopieren in das Remoteverzeichnis startet die Anwendung von sich aus und installiert einen Windows-Dienst. Dieser Windows-Dienst führt den von Ihnen gewünschten Task anhand der Anmeldeinformationen aus, die Sie zur Startzeit bereitgestellt haben. Wenn eine Endbenutzer-Benutzeroberfläche auf dem Clientsystem für das betreffende Tool erforderlich ist, startet dieser Dienst eine zusätzliche Binärdatei im Kontext des Benutzers. (Wie Sie wissen, können Dienste keine direkten interaktiven Benutzeroberflächen generieren.) Der Dienst gibt notwendige Informationen an die Konsole zurück, von der aus er gestartet wurde. Schließlich deinstalliert der Dienst sich selbst.
Wie Sie sehen, sind die Tools leistungsfähig und eigenständig. Obwohl mehrere Binärdateien und Prozesse beteiligt sind, müssen Sie sich als Benutzer nicht darum kümmern – führen Sie einfach das gewünschte Tool aus, und es funktioniert.
Zum Verwenden der Tools müssen folgende Voraussetzungen erfüllt sein: entweder Windows NT®, Windows 2000, Windows XP oder Windows Server ® 2003 (x86- und x64-Versionen von Windows werden unterstützt, aber keine Itanium-Versionen); die standardmäßige administrative Netzwerkfreigabe, die auf dem Remotesystem aktiviert ist, auf dem Sie die Tools ausführen (admin$); die Ports für die Datei- und Druckerfreigabe, die auf dem Remotesystem geöffnet sind (unabhängig davon, ob Sie die Windows-Firewall, die Internetverbindungsfirewall oder ein anderes Firewallprodukt verwenden).

PsExec
PsExec ist mein persönlicher Favorit unter den Tools, aber wahrscheinlich nicht aus dem von Ihnen erwarteten Grund. Seit fast zwei Jahren verwende ich meine Systeme als Benutzer ohne Administratorrechte, also als Benutzer und nicht als Administrator. Stattdessen verwende ich ein kurzes Skript namens run.vbs, mit dessen Hilfe ich Anwendungen als lokaler Administrator ausführe (sie könnten auch von jedem beliebigen Benutzer ausgeführt werden). Abbildung 2 zeigt den Inhalt des Skripts (das auch auf der TechNet Magazin-Website unter technetmagazine.com/code07.aspx zur Verfügung steht). Das Skript geht davon aus, dass sich die PsTools in der Systemvariablen „Pfad“ befinden.
Figure 2 Run.vbs (Close Figure 2)
SET WshShell = WScript.CreateObject("WScript.Shell")
SET WshSysEnv = WshShell.Environment("SYSTEM")
SET FSO = CreateObject("Scripting.FileSystemObject")
IF WScript.Arguments.Count <> 0 Then
    FOR EACH arg IN WScript.Arguments
        iArgCount = iArgCount + 1
        strCmdArg = (arg)
        strCmdArray = Split(strCmdArg, " ", 2, 1)
        IF iArgCount = 1 THEN
        strExe = strCmdArray(0)
        ELSEIF iArgCount = 2 THEN
        strRun = strCmdArray(0)
        ELSE
        strParams = strParams&" "&strCmdArray(0)
        END IF
    NEXT
END IF
'/t:0A && title ***** Admin *****
        strExt = LCase(Right(strExe, 3))

IF strExt <> "exe" AND strExt <> "bat" AND strExt <> "cmd" THEN
WshShell.Run "psexec.exe -d -i -e -u COMPUTERNAME\USER -p PASSWORD  cmd /c start "&strExe&"
    "&strRun&" "&strParams, 0, FALSE
ELSE
WshShell.Run "psexec.exe -d -i -e -u COMPUTERNAME\USER -p PASSWORD "&strExe&" "&strRun&"
    "&strParams, 0, FALSE
END IF

    SET WshShell = NOTHING
    SET WshSysEnv = NOTHING
    SET FSO = NOTHING
Dieses einfache Skript ist ein Beispiel für die Verwendung von PsExec mit einer Funktion, die von Mark hinzugefügt wurde, als wir bei Winternals an unserem Protection Manager-Produkt arbeiteten: die Möglichkeit für einen Benutzer mit eingeschränkten Rechten, privilegiertere Anmeldeinformationen bereitzustellen, um PsExec lokal zu starten. Häufiger wird PsExec natürlich von einem Remotestandort ausgeführt, beispielsweise zur Ausführung eines Dienstprogramms, das kein eigenes Remote-, Skripting- oder Automatisierungsframework bereitstellt. Einige der Hauptfeatures von PsExec umfassen die Möglichkeit, eine Binärdatei, die ausgeführt werden soll, in Remotesysteme zu kopieren, sowie die Möglichkeit, Prozessorzugehörigkeit festzulegen. Ein weiteres praktisches Feature von PsExec ist die Möglichkeit, das Skripting für viele Computer gleichzeitig durch Bereitstellen einer Skriptdatei durchzuführen.
Dies ist die vereinfachte Verwendung von PsExec:
PsExec \\computer -u username -p password command
Sie können sie durch Verwendung der in Abbildung 3 dargestellten Schalter erweitern.
Figure 3 PsExec-Schalter (Close Figure 3)

Schalter | Beschreibung
-a | Gibt die Prozessorzugehörigkeit an.
-c | Zeigt an, ob die Anwendung auf das Remotesystem kopiert werden sollte.
-d | Gibt an, dass vor dem Beenden nicht auf das Ende des Prozesses gewartet werden soll (es wird nicht auf eine Erfolgs- oder Fehlermeldung gewartet).
-e | Lädt unter Verwendung des angegebenen Kontoprofils.
-f | Kopiert die Anwendung, selbst wenn diese auf dem Remotesystem vorhanden ist. Stellt sicher, dass Sie die aktuelle (oder eine bestimmte) Version ausführen.
-i | Führt die Anwendung interaktiv auf dem Remotesystem aus (erforderlich, wenn einem Endbenutzer jede beliebige Benutzeroberfläche von der Anwendung aus angezeigt werden soll).
-l | Führt die Anwendung als Benutzer mit eingeschränkten Rechten aus. Entfernt das Administratorgruppentoken und reduziert Prozessberechtigungen auf eine Ebene, die für ein Mitglied der Benutzergruppe vorhanden wäre. Praktisch, um risikoreiche, mit dem Internet verbundene Anwendungen mit minimalen Berechtigungen auszuführen.
-n | Gibt das Zeitlimit an, das abgewartet werden muss, bevor eine Verbindung zu Remotecomputern fehlschlägt.
-priority | Führt den Prozess mit der angegebenen Priorität aus. D. h. es wird angegeben, wie Windows die Prozesspriorität für eine bestimmte Aufgabe festlegen soll (-low, -belownormal, -abovenormal, -high oder -realtime).
-s | Führt den Prozess mithilfe des Systemkontos aus (praktisch zur Ausführung von Regedit, um auf privilegierte Registrierungsschlüssel zuzugreifen).
-v | Kopiert die Anwendung nur dann, wenn die Anwendung, die kopiert wird, neuer ist.
-x | Zeigt die Benutzeroberfläche auf dem sicheren Winlogon-Desktop (dies funktioniert nur auf dem lokalen System).
@file | Führt den Befehl auf allen Computern aus, die in der Textdatei angegeben werden.

PsFile
PsFile ist ein stärker fokussiertes Tool als PsExec. Es wird speziell verwendet, um zu prüfen, welche Dateien auf dem Remotesystem geöffnet sind und wer sie geöffnet hat. Dies kann nützlich sein, wenn Sie nachverfolgen wollen, welche Dateien geöffnet sind, bevor Sie einen Server neu starten. Wenn Sie herausfinden müssen, welcher Benutzer die Datei gesperrt hat, sodass sie möglicherweise nicht bearbeitet oder gelöscht werden kann, können Sie den Betreffenden manuell benachrichtigen oder die Datei über PsFile schließen. Nachstehend ist die Verwendung von PsFile aufgeführt:
PsFile \\computer -u username -p password
Dies gibt einfach eine Liste der geöffneten Dateihandles auf dem Remotesystem zurück. Über die Standardverwendung hinaus können Sie auch einen ID-Parameter der Anweisung hinzufügen, indem Sie den Namen der Datei angeben, über die Sie Informationen suchen oder die Sie schließen wollen. Sie können auch den -c-Schalter einschließen, der die mit dem ID-Parameter angegebene Datei schließt.

PsGetSid
PsGetSid ist ebenfalls ein stark fokussiertes Tool. Es teilt Ihnen die Sicherheits-ID (SID) eines Computers, eines Benutzers oder einer Gruppe mit. Dies kann nützlich sein, wenn Sie sicherstellen wollen, dass die Systeme in Ihrer Domäne keine doppelten SIDs haben, oder wenn Sie einfach nur die SIDs aller Benutzer oder Gruppen auf einem System überprüfen wollen. Die Verwendung von PsGetSid erfolgt wie nachstehend aufgeführt:
PsGetSid \\computer -u username -p password account
Beachten Sie, dass für das Konto einen Benutzer, Computer oder eine Gruppe angegeben werden kann. Obwohl die Syntax von PsGetSid einfach ist, sind einige zusätzlichen Parameter verfügbar. Der SID-Parameter gibt das Konto an (Gruppe oder Computer), das eine angegebene SID erhalten hat, und @file führt den Befehl auf allen in der angegebenen Textdatei aufgeführten Computern aus.

PsInfo
PsInfo dient zur Bereitstellung ausführlicher Systeminformationen. Dies wäre offensichtlich am nützlichsten beim Skripting für mehrere Remotesysteme, wobei die Ausgabe an eine Datei (wie z. B. eine Excel®- und datenbankfreundliche CSV-Datei) gesendet wird. Beachten Sie, dass dieses Dienstprogramm ein wichtiges Konzept anwendet, das sich von den meisten anderen Tools unterscheidet. Wenn Sie keinen Computernamen bereitstellen, versucht PsInfo standardmäßig, alle Computer in der Domäne abzufragen. PsInfo wird folgendermaßen verwendet:
PsInfo  \\computer -u username -p password
Obwohl die Syntax einfach ist, sind zusätzliche Schalter und Parameter verfügbar (siehe Abbildung 4).
Figure 4 PsInfo-Schalter (Close Figure 4)

Schalter | Beschreibung
-h | Zeigt alle Windows-Updates an.
-s | Zeigt alle auf dem System installierten Anwendungen an.
-d | Zeigt Datenträger-/Volumeinformationen für das System an.
-c | Gibt die Ergebnisse im CSV-Format aus.
-t | Gibt ein anderes Trennzeichen für die CSV-Datei als den Standardwert \t an.
Filter | Zeigt nur Daten an, die einem vorgegebenen Filter entsprechen.
@file | Führt den Befehl auf allen Computern aus, die in der angegebenen Textdatei aufgeführt werden.

PsKill
PsKill ist ein hervorragendes Dienstprogramm zum Beenden von Prozessen auf einem lokalen System oder Remotesystem. Die Verwendung ist sehr einfach, und Sie können einen Prozess zusammen mit allen seinen untergeordneten Prozessen beenden. Die Verwendung von PsKill ähnelt im Großen und Ganzen der Verwendung der anderen Tools, die ich erörtert habe:
PsKill -t \\computer -u username -p password process id | process name
Beachten Sie, dass Sie entweder die ID oder den Namen des Prozesses angeben können, den Sie beenden wollen.

PsList
Ich verwende PsList nicht oft, weil ich ein Anhänger von Process Explorer bin (weitere Informationen finden Sie unter microsoft.com/technet/sysinternals/ProcessesAndThreads/ProcessExplorer.mspx). Aber da es keine Version von Process Explorer gibt, die von einem Remotestandort ausgeführt werden kann, ist PsList ein angemessener Ersatz für einige der von Process Explorer bereitgestellten Schlüsselfunktionen. PsList ist praktisch eine von einem Remotestandort ausführbare Liste eines oder mehrerer Prozesse, die auf einem Remotesystem ausgeführt werden.
Die Verwendung von PsList ist recht einfach:
PsList \\computer -u username -p password account
Wie bei den anderen Tools kann der Kontoparameter einen Benutzer, Computer oder eine Gruppe angeben. Zusätzliche Parameter sind in Abbildung 5 dargestellt.
Figure 5 PsList-Schalter (Close Figure 5)

Schalter | Beschreibung
-t | Zeigt Informationen auf Threadebene an.
-m | Stellt ausführliche Speicherinformationen für alle Prozesse bereit.
-x | Zeigt Prozess-, Speicher- und Threadinformationen an.
-t | Zeigt Informationen als Prozessstruktur an (ähnlich wie die Process Explorer-Strukturansicht).
-s [n] | Wird für die angegebene Anzahl von Sekunden im Task-Manager-Modus ausgeführt. Dies ermöglicht das Anzeigen der Remoteprozessinformationen fast in Echtzeit.
-r [n] | Gibt an, wie oft (in Sekunden) aktualisiert werden soll, wenn die Ausführung im Task-Manager-Modus erfolgt.
Name | Zeigt Informationen zu Prozessen an, die mit dem angegebenen Namen beginnen.
-e | Entspricht dem Prozessnamen genau.
pid | Zeigt Informationen zu einem bestimmten Prozess an.
PsList ist leistungsfähig, aber dennoch leicht zu verwenden. Ohne Remotedesktop zu verwenden, können Sie die Remoteprozesse sehr detailliert sehen. Mithilfe dieser Informationen könnten Sie mit PsKill oder PsSuspend fortfahren, wenn beispielsweise ein Prozess vorhanden ist, der eingeschränkt werden muss.

PsLoggedOn
Das Tool PsLoggedOn erklärt sich praktisch von selbst. Das Dienstprogramm zeigt Ihnen, wer in einem System angemeldet ist. Dabei kann es sich um lokale (interaktive) Anmeldungen oder um Netzwerkfreigabeanmeldungen handeln. Ähnlich wie PsFile kann diese Funktion nützlich sein, um zu bestimmen, wer einen Server verwendet, den Sie warten müssen. Die Verwendung ist sehr einfach:
PsLoggedOn \\computer
PsLoggedOn hat nur zwei optionale Parameter: -l zeigt nur lokale Anmeldungen (keine Netzwerkanmeldungen) an, und -x schließt die Anmeldezeit aus.
Obwohl das Tool recht einfach ist, ermöglich PsLoggedOn die einfache Anzeige von Informationen, für die Sie normalerweise ein paar Windows-Speicherorte untersuchen müssten.

PsLogList
Dieses Tool ist eines der allgemein nützlichsten Dienstprogramme. PsLogList bilden die Windows-Ereignisprotokolle im Textformat ab, das dann von Protokollleseprogrammen, Datenbanken oder ganz nach Wunsch von vielen anderen Programmen verwendet werden kann. Der Hauptvorteil besteht darin, dass es die Ereignisprotokolleinträge aus dem binären Format in ein Format konvertiert, das leicht transformiert oder automatisiert werden kann. (Selbstverständlich stehen Ereignisprotokolle in Windows Vista™ systemintern im XML-Format zur Verfügung, doch das ist Thema für einen anderen Artikel.)
Die Verwendung von PsLogList sieht folgendermaßen aus:
PsLogList \\computer -u username -p password
Eine Anzahl zusätzlicher Schalter und Parameter steht ebenfalls zur Verfügung (sieh Abbildung 6).
Figure 6 PsLogList-Schalter (Close Figure 6)

Schalter | Beschreibung
-a | Sichert nur Ereignisse nach dem angegebenen Datum.
-b | Sichert nur Ereignisse vor dem angegebenen Datum.
-c | Löscht das Ereignisprotokoll permanent nach Sichern der gewünschten Ausgabe.
-d | Zeigt nur Informationen für die angegebene Anzahl von Tagen an.
-e | Schließt Ereignisse mit der angegebenen Ereignis-ID aus (es können bis zu 10 angegeben werden).
-f | Filtert Ereignistypen (Warnung, Fehler und so weiter).
-g | Exportiert das Ereignisprotokoll als EVT-Datei, wofür der -c-Schalter erforderlich ist.
-h | Zeigt nur Informationen für die angegebene Anzahl von Stunden an.
-l | Speichert aus der angegebenen EVT-Datei.
-m | Zeigt nur Informationen für die angegebene Anzahl von Minuten an.
-n | Zeigt nur die angegebene Anzahl der aktuellsten Ereignisse an.
-o. | Zeigt nur Ereignisse aus einer vorgegebenen Quelle an (-o SRService für den Windows-Systemwiederherstellungsdienst beispielsweise).
-q | Schließt Ereignisse aus einer vorgegebenen Quelle aus (das Gegenteil von -o).
-r | Kehrt die Reihenfolge der Speicherung von Protokollereignissen vom am wenigsten aktuellen bis zum aktuellsten Ereignis um.
-s | Führt Einträge in jeder Zeile in getrennten Feldern auf.
-t | Gibt etwas anderes als ein Komma als Trennzeichen für die -s-Ausgabe an.
-w | Wartet darauf, dass neue Ereignisse aufgefüllt und in Echtzeit gespeichert werden. Dies gilt nur für das lokale System.
-x | Sichert erweiterte Daten aus Ereignisprotokollen.
eventlog | Gibt an, welches Ereignisprotokoll gesichert werden soll. Dies ist standardmäßig das System.
@file | Führt den Befehl auf allen Computern aus, die in der Textdatei angegeben werden.
Windows-Ereignisprotokolle können ein äußerst leistungsfähiges diagnostisches Tool sein, doch das Schwierige daran ist, die Daten in eine Form zu bringen, die bearbeitet oder konsolidiert werden kann. PsLogList hilft dabei.

PsPasswd
PsPasswd ist ein einfaches, aber dennoch leistungsfähiges Dienstprogramm mit etwa der gleichen Leistungsstärke wie Net.exe, wobei die Verwendung von Remotestandorten und die Automatisierung im Mittelpunkt stehen.
PsPasswd  \\computer -u username -p password Username Newpassword
Sie können einen Computer oder keinen Computer (das lokale System) angeben. Wenn Sie den Computer als \\* angeben, wird das Dienstprogramm für alle Computer in der aktuellen Domäne ausgeführt. Bei PsPasswd steht nur ein zusätzlicher Parameter zur Verfügung: @file führt den Befehl auf allen Computern aus, die in der Textdatei angegeben werden. Auch dieses ist ein sehr elementares, aber äußerst leistungsstarkes Dienstprogramm für mehrere Systeme.

PsService
PsService ermöglicht das Anzeigen und Bearbeiten von Dienststeuerungs-Manager-Informationen auf einem oder mehreren Systemen auf Ihrem Netzwerk. Sie können sogar nach einem bestimmten Dienstnamen auf Systemen in Ihrem Netzwerk suchen.
PsService \\computer -u username -p password command options
Wenn Sie PsService ausführen, repräsentiert „command“ einen der in Abbildung 7 aufgeführten Befehle, und „options“ steht für ein Attribut, das für einen bestimmten Befehl gilt. Wenn keine zusätzlichen Befehlsschalter bereitgestellt werden, gibt PsService vollständige Dienststeuerungs-Manager-Informationen aus.
Figure 7 PsService-Befehle (Close Figure 7)

Befehl | Beschreibung
query | Fragt einen bestimmten Dienst ab.
config | Fragt die Konfigurationsinformationen für einen bestimmten Dienst ab.
setconfig | Legt die Konfigurationsinformationen für einen bestimmten Dienst fest.
start | Startet einen Dienst.
stop | Beendet einen Dienst.
restart | Startet einen Dienst neu (hält ihn an und startet ihn).
pause | Hält einen Dienst an.
cont | Setzt einen angehaltenen Dienst fort.
depend | Zeigt an, welche Dienste von einem bestimmten Dienst abhängen.
find | Sucht in Ihrem Netzwerk nach einer bestimmten Instanz des Diensts.
security | Stellt die Sicherheitsinformationen für einen bestimmten Dienst bereit.
Man kann sich PsService also als eine leistungsfähige, von einem Remotestandort ausführbare Befehlszeilenversion von Services.msc vorstellen, die jedoch die netzwerkweite Anzeige von Diensten (die möglicherweise gefährlich sind) und die Festlegung von Konfigurationsinformationen ermöglicht.

PsShutdown
PsShutdown gehört ebenfalls zu meinen Lieblingsfunktionen. Obwohl man hin und wieder hört, dass Microsoft ein Tool liefert, das diese Aufgabe handhabt (shutdown.exe), sind die Tools doch unterschiedlich. Der wesentliche Unterschied besteht in der Leistungsstärke von PsShutdown: Das Tool kann nämlich ein Remotesystem herunterfahren oder neu starten. Außerdem kann es ein System in den Standbymodus oder Ruhezustand versetzen (also nicht nur herunterfahren oder neu starten), ein System sperren und ein System neu starten, nachdem dem Benutzer für eine bestimmte Zeitdauer eine Nachricht angezeigt wurde.
PsShutdown \\computer -u username -p password
Zur Verwendung mit PsShutdown steht eine ebenfalls Anzahl zusätzlicher Parameter zur Verfügung (siehe Abbildung 8).
Figure 8 PsShutdown-Schalter (Close Figure 8)

Schalter | Beschreibung
-a | Bricht ein Herunterfahren ab, das bereits im Gange ist und von PsShutdown initiiert wurde.
-c | Ermöglicht einem interaktiven Benutzer, das Herunterfahren abzubrechen.
-d | Hält den Computer an (Standby).
-e | Codes für Ursachen des Herunterfahrens. Ich empfehle Ihnen, dabei die Anleitungen auf der Microsoft-Website zu nutzen, da ihre Verwendung mit PsShutdown und der integrierten Datei „shutdown.exe“ problematisch sein kann. Weitere Informationen finden Sie unter msdn2.microsoft.com/en-us/library/aa376885.aspx (auf Englisch).
-f | Erzwingt die Beendigung aller Anwendungen, die ausgeführt werden.
-h | Versetzt den Computer in den Ruhezustand.
-k | Schaltet den Computer ab (startet ihn neu, wenn der Abschaltvorgang nicht unterstützt wird).
-l | Sperrt den Computer.
-m | Legt die Nachricht fest, die für beliebige interaktive Benutzer angezeigt werden soll.
-n | Gibt das Zeitlimit an, das abgewartet werden muss, bevor eine Verbindung zu Remotecomputern fehlschlägt.
-o. | Meldet den Konsolenbenutzer ab.
-r | Startet den Computer neu.
-s | Fährt den Computer herunter, aber schaltet ihn nicht aus.
-t | Countdownzeit, bevor der Befehl zum Herunterfahren ausgeführt wird, oder konkrete Zeit zum Abschalten.
-v | Zeigt bis zum Herunterfahren die Nachricht für die Benutzer an.
@file | Führt den Befehl auf allen Computern aus, die in der Textdatei angegeben werden.
Sie sehen, dass PsShutdown ein sehr leistungsfähiges, stark konfigurierbares Steuerdienstprogramm für die Systemsleistungsstärke ist, das sich verhältnismäßig leicht verwenden lässt.

PsSuspend
PsSuspend ist ein praktisches Dienstprogramm, wenn Sie einen nicht autorisierten Prozess vorübergehend unter Kontrolle bringen wollen oder wenn ein Prozess mit hoher CPU-Auslastung vorübergehend angehalten werden soll, ohne dass dabei Daten oder Anwendungskontext verloren gehen.
PsSuspend \\computer -u username -p password process ID
Sie können die Prozess-ID mithilfe von PsList abrufen. Wenn Sie einen Prozess angehalten haben, können Sie ihn mithilfe des -r-Schalters wieder fortsetzen. Beachten Sie, dass das Konzept des Anhaltens und Fortsetzen eines Prozesses auch von Process Explorer implementiert wird, obwohl dies nur lokal funktioniert. Offensichtlich kann PsSuspend sowohl Remoteprozesse als auch lokale Prozesse anhalten und fortsetzen, sodass das Tool leistungsfähiger als die integrierte Implementierung im Process Explorer ist.

Schlussbemerkung
Meiner Meinung nach ist die PsTools-Suite eine äußerst nützliche Sammlung von Dienstprogrammen. Zusammen mit den übrigen Sysinternals-Dienstprogrammen (nämlich Regmon, Filemon, Process Explorer und jetzt auch Process Monitor) sind PsTools die ersten Programme, die ich in meinen Pfad stelle, wenn ich Windows auf irgendeinem meiner Systeme neu installiere. Ich hoffe, dass Sie durch diese Rubrik mit den PsTools vertraut geworden sind, wenn Sie die Tools zuvor nicht kannten. Wenn sie Ihnen bereits bekannt waren, hoffe ich, dass Sie ein paar zusätzliche Kenntnisse gewonnen haben. Mein Dank geht natürlich an Mark Russinovich, der diese Tools all die Jahre kostenlos zur Verfügung gestellt und mich bei diesem Artikel unterstützt hat.

Wes Miller ist Entwicklungsmanager bei Pluck (www.pluck.com) in Austin, Texas. Davor arbeitete er bei Winternals Software in Austin und bei Microsoft als Programm-Manager und Produktmanager für Windows. Sie können Wes erreichen unter technet@getwired.com.


 Inside Microsoft.com: Erste Schritte mit der Datenbankspiegelung
Inside Microsoft.com
Erste Schritte mit der Datenbankspiegelung
Saleem Hakani

Wenn Ihre Datenbank offline geschaltet wird, haben Sie wahrscheinlich ein großes Problem. Doch wenn Sie SQL Server 2005 mit SP1 verwenden, kann das Feature zur Datenbankspiegelung eine Katastrophe verhindern. Diese neue Technologie mit hoher Verfügbarkeit ermöglicht die Verwendung Ihrer Datenbank im „Hot Standby“-Modus, wenn Ihr Produktionsdatenbankserver
aus irgendeinem Grund nicht zur Verfügung steht. Beim Datenbankspiegelungsfeature werden Transaktionsprotokoll-Datensätze für eine Datenbank vom primären Server auf den sekundären Server übertragen, der als „Hot Standby“ dient. Bei der Datenbankspiegelung werden Datenänderungen im Transaktionsprotokoll aufgezeichnet, bevor Änderungen an den eigentlichen Datenseiten durchgeführt werden, also genau so, wie SQL Server™-Aktualisierungen immer funktionieren. Die Protokolle werden zuerst in den Protokollpuffer der Prinzipaldatenbank im Speicher gestellt und dann auf dem Datenträger beibehalten. Diese Transaktionsprotokolle werden in die Datenbank des Spiegelservers kopiert und werden dort wiedergegeben. Dadurch werden die Datenbankänderungen des Prinzipals in der Spiegeldatenbank dupliziert. Es ist zu beachten, dass nur die Prinzipaldatenbank für Clientverbindungen zugänglich ist. Wenn die Prinzipaldatenbank von Clients angeforderte Änderungen empfängt, sendet der Prinzipal diese aktiven Änderungen an den Spiegelserver. Der Spiegelserver trifft keine dieser Entscheidungen. Wenn die Datenbankspiegelung aktiviert ist und die Prinzipaldatenbank versagt, steht die gespiegelte Datenbank zur Verfügung.

Funktionsweise der Datenbankspiegelung
Die Datenbankenspiegelung funktioniert bei beliebiger Standardhardware, die SQL Server 2005 unterstützt, und sorgt dafür, dass bei einem Datenbankfehler keine Daten verloren gehen. Die Spiegeldatenbank wird immer mit der aktuellen Transaktion aktualisiert, die auf dem primären Datenbankserver verarbeitet wird. Abbildung 1 stellt den Datenfluss dar.
Wenn Ihr Hauptserver versagt, können Sie sichergehen, dass der Spiegelserver über eine genaue Kopie der letzten übernommenen Transaktion der Prinzipaldatenbank zu einem bestimmten Zeitpunkt verfügt. Der Spiegel ist also immer bereit, die Rolle des Prinzipalservers zu übernehmen.
Abbildung 1 Datenreplikation zum Spiegel
Abbildung 1 Datenreplikation zum Spiegel (Klicken Sie zum Verkleinern auf das Bild)
Abbildung 1 Datenreplikation zum Spiegel
Abbildung 1 Datenreplikation zum Spiegel (Klicken Sie zum Vergrößern auf das Bild)
In der Datenbankspiegelungstopologie brauchen Sie einen dritten, als Zeuge bezeichneten Server, wenn Sie automatisches Failover vom Prinzipal- auf den Spiegelserver und umgekehrt ermöglichen wollen. Bei einem Zeugenserver kann es sich um einen beliebigen Computer handeln, der SQL Server 2005 unterstützen kann.

Betriebsmodi
Die von Ihnen verwendete Datenbankspiegelungstopologie hängt von der von Ihnen gewählten Transaktionssicherheit und den Betriebsmodi ab. Die von der Datenbankspiegelung unterstützten Betriebsmodi umfassen hohe Sicherheit (mit oder ohne automatisches Failover) und hohe Leistung.
Hohe Sicherheit (mit automatischem Failover). Dieser Modus unterstützt maximale Datenbankverfügbarkeit mit synchroner Datenübertragung und automatischem Failover zur Spiegeldatenbank. Dieser Betriebsmodus wird am besten dann verwendet, wenn Sie über eine schnelle und sehr zuverlässige Kommunikation zwischen dem Prinzipal- und dem Spiegelserver verfügen und automatisches Failover für eine einzelne Datenbank brauchen. Bei diesem Schema wartet die Prinzipaldatenbank mit einer Transaktion, bis sie eine Nachricht vom Spiegelserver empfängt, dass der Spiegelserver das Protokoll der Transaktion auf dem Datenträger abgesichert hat.
Hohe Sicherheit (ohne automatisches Failover). Dieser Modus unterstützt maximale Datenbankverfügbarkeit mit synchroner Datenübertragung, aber ohne automatisches Failover zur Spiegeldatenbank. Wenn die Spiegelserverinstanz in diesem Modus nicht mehr verfügbar ist, funktioniert die Prinzipalserverinstanz weiter, kann jedoch die Daten nicht spiegeln. Wenn der Prinzipalserver ausfällt, wird die Datenbankspiegelung angehalten, aber Sie können manuell ein Failover des Diensts durchführen.
Hohe Leistung. In diesem Betriebsmodus erfolgt die Übertragung der Daten asynchron. Der Prinzipalserver wartet nicht auf eine Bestätigung des Spiegelservers wie bei den beiden vorangehenden Modi. Der Spiegelserver versucht, mit dem Prinzipalserver mitzuhalten, doch es wir zu keinem Zeitpunkt garantiert, dass die neuesten Transaktionen vom Prinzipal im Transaktionsprotokoll des Spiegelservers abgesichert werden. Wenn der Prinzipalserver ausfällt, wird die Datenbankspiegelung angehalten, aber Sie können manuell ein Failover des Diensts durchführen.

Schaffen der Grundlagen
Das Einrichten der Datenbankspiegelung ist ein einfacher Prozess, wenn Sie mit den empfohlenen Vorgehensweisen eine starke Grundlage schaffen:
Server Edition Überprüfen Sie, dass dieselbe Edition von SQL Server 2005 sowohl auf dem Prinzipal- als auch auf dem Spiegelserver ausgeführt wird. Sie können die Standard oder die Enterprise Edition verwenden.
Verfügbarkeit des Zeugenservers Wenn Sie die Verwendung von hoher Sicherheit mit automatischem Failover planen, sollten Sie sicherstellen, dass der Zeugenserver zur Verfügung steht und eine beliebige Edition von SQL Server 2005 installiert ist. Der Zeugenserver kann auf jedem beliebigen zuverlässigen Computersystem ausgeführt werden, das SQL Server 2005 unterstützen kann.
Spiegelbild Stellen Sie sicher, dass die Spiegelserverinstanz über die identischen Aufträge, Anmeldungen, SSIS-Pakete (SQL Server Integration Service), Datenträgerpartitionen, Dateispeicherorte und Serverkonfiguration wie die Prinzipalserverinstanz verfügt. Wenn der Spiegelserver genau wie der Prinzipalserver konfiguriert wird, kann der Spiegelserver genau wie der Prinzipalserver funktionieren.
Vollständige Wiederherstellung Es ist wichtig, dass alle Datenbanken, die an der Datenbankspiegelung beteiligt sind, auf das vollständige Wiederherstellungsmodell eingestellt sind.
Master und TempDB Überprüfen Sie, dass alle Serverinstanzen in einer Spiegelungstopologie dieselbe Master- und TempDB-Sortierung und Codeseite verwenden. Unterschiedliche Sortierung und Codeseiten können während der Einrichtung der Datenbankspiegelung Probleme verursachen.
Sicherung Wenn die zu spiegelnde Datenbank groß ist, müssen Sie zuerst eine komplette Sicherung der Datenbank durchführen und sie dann auf der Spiegelserverinstanz mithilfe der NORECOVERY-Option wiederherstellen.
Vorausplanung Legen Sie alle Servernamen, Portnummern, Sicherheitskonten und Speicherorte fest, wo Datenbanken gespeichert werden, und dokumentieren Sie diese. In der Randleiste „Best Practices für die Datenbankspiegelung“ finden Sie eine Prüfliste.
Nach Durchführung dieser grundlegenden Arbeiten können Sie die Einrichtung der Datenbankspiegelung in Ihrer Umgebung in Angriff nehmen.
Best Practices für die Datenbankspiegelung
  1. Verwenden Sie Partnerserver, deren CPU, Arbeitsspeicher, Speicher und Netzwerkkapazität identisch sind.
  2. Stellen Sie sicher, dass beide Partner dieselbe SQL Server- und Betriebssystemedition sowie dieselben Service Packs und Updates haben.
  3. Installieren Sie SQL Server auf der Prinzipal- und der Spiegelserverinstanz in einem identischen Verzeichnis und einer identischen Laufwerkstruktur.
  4. Wenn Leistung wichtig ist, könnten Sie eine dedizierte Netzwerkkarte zum Trennen der Last in Betracht ziehen.
  5. Wie bei den Serverpartnern stellen Sie sicher, dass sowohl die Prinzipal- als auch die Spiegelserverinstanz in Bezug auf CPU, Arbeitsspeicher, Speicher und Netzwerkkapazität identisch sind. Durch Sicherstellen derselben Verzeichnisstruktur, desselben Datenträger-Partitionierungsschemas und derselben SQL Server-Konfiguration bei beiden Servern wird dafür gesorgt, dass während oder nach dem Failover am Spiegelpartner keine Änderungen vorgenommen werden müssen.
  6. Stellen Sie sicher, dass sich all Ihre Anwendungen verbinden lassen, dass sie alle notwendigen Aktionen ausführen und dass alle aktiven SQL Server-Anmeldungen (und ihre Berechtigungen) der Prinzipalserverinstanz auch auf der Spiegelserverinstanz vorhanden sind. Zu diesem Zweck können Sie den Task „Anmeldungen übertragen“ für SQL Server 2005 Integration Services verwenden.
  7. Kopieren Sie SQL Server Agent-Aufträge, Warnungen, SSIS-Pakete, Supportdatenbanken, verknüpfte Serverdefinitionen, Sicherungsgeräte, Wartungspläne, Datenbank-E-Mail-Profile und so weiter vom Prinzipalserver zum Spiegelserver.
  8. Legen Sie ein Verfahren fest, mithilfe dessen Sie jedes Mal, wenn Sie Änderungen auf dem Prinzipalserver vornehmen (wie z. B. Änderungen an Hardware, Software, SQL Server-Einstellungen oder Datenbankenobjekten), diese Änderungen automatisch wiederholen oder replizieren und sie auf die Spiegelserverinstanz übertragen.
  9. Führen Sie mehrere Testfailovers durch, bevor Sie das System bereitstellen.

Setup
Nun geht es um das Setup der Datenbankspiegelung mithilfe des Betriebsmodus für hohe Sicherheit mit automatischem Failover. (Wie bereits erwähnt, bedeutet dies, dass eine Zeugenserverinstanz erforderlich ist.) Für mein Beispiel hier verwende ich die in Abbildung 2 dargestellten Server- und Datenbanknamen. Die Abbildung gibt auch die Rolle der einzelnen Server an.
Die Konfiguration kann sich auf die Leistung auswirken, da das ausstehende Transaktionsprotokoll vom Prinzipalserver zum Spiegelserver kopiert wird. Aus diesem Grund könnte es angebracht sein, die anfängliche Konfiguration der Datenbankspiegelung außerhalb der Hauptgeschäftszeiten durchzuführen.
Das Einrichten des Spiegels besteht aus drei Schritten: dem Erstellen von Endpunkten auf den teilnehmenden Servern, dem Durchführen der Sicherung und Wiederherstellen Ihrer Prinzipaldatenbank und dem Aktivieren von Spiegelungssitzungen auf allen teilnehmenden Servern.
Vor dem Einrichten einer Datenbankspiegelungssitzung müssen Sie den Kommunikationsmechanismus zwischen allen an der Datenbankspiegelung teilnehmenden Servern einrichten. Dazu erstellen Sie Endpunkte auf allen Servern, indem Sie diese Anweisung auf ServerA und ServerB ausführen:
Create Endpoint Mirroring_Endpoint
State= Started as TCP (Listener_Port=5001)
For Database_Mirroring (Role=Partner);
Für ServerC (der als Zeuge dient) ändern Sie (Role=Partner) in (Role=Witness), bevor Sie die Anweisung ausführen. Dies steuert den TCP-Port, den die jeweilige Instanz überwacht.
Beim nächsten Schritt sollten Sie eine vollständige Datenbanksicherung gefolgt von einer Protokollsicherung der DBM_Demo-Datenbank vom Prinzipalserver durchführen und diese dann auf der Spiegelserverinstanz mit der NORECOVERY-Option wiederherstellen. (Die Verwendung von NORECOVERY stellt sicher, dass sich die Spiegeldatenbank im Wiederherstellungsstatus befindet, sodass die Transaktionsprotokolle angewendet werden können.)
Dies ist die T-SQL-Anweisung zur Durchführung einer vollständigen Datenbanksicherung der DBM_Demo-Datenbank von ServerA (der Prinzipalserverinstanz):
Backup Database DBM_Demo to DISK='E:\MSSQL\Bak\DBM_Demo_FULL.bak';
Wenn nach Durchführen der vollständigen Datenbanksicherung Änderungen an der Datenbank vorgenommen werden, müssen Sie möglicherweise eine Protokollsicherung der Datenbank durchführen. Andernfalls ist dies nicht erforderlich.
Falls erforderlich, können Sie folgende T-SQL-Anweisung zur Durchführung einer Protokollsicherung der DBM_Demo-Datenbank von ServerA verwenden:
Backup Log DBM_Demo to Disk='E:\MSSQL\Bak\DBM_Demo_Log.bak';
Nach Durchführung aller Sicherungen verschieben Sie die Sicherungsdateien zu ServerB oder zu einem freigegebenen Speicherort, damit Sie diese Sicherungen auf ServerB wiederherstellen können. Anschließend sollten Sie zusätzlich alle Transaktionsprotokollsicherungen wiederherstellen, die Sie seit der letzten vollständigen Datenbanksicherung von ServerA durchgeführt haben.
Sie können folgende T-SQL-Anweisung zur Wiederherstellung der vollständigen Sicherungen und Protokollsicherungen auf ServerB mithilfe der NORECOVERY-Option verwenden:
--Restore full database backup on the mirror --server instance
Restore Database DBM_Demo from Disk='E:\MSSQL\Bak\DBM_Demo_FULL.bak' with NORECOVERY;
Schließlich verwenden Sie folgende T-SQL-Anweisung zur Wiederherstellung der Protokollsicherung auf dem Spiegelserver mithilfe der NORECOVERY-Option:
Restore Log DBM_Demo from Disk='E:\MSSQL\Bak\DBM_Demo_Log.bak' with NORECOVERY;
Nach der Wiederherstellung aller Sicherungen können Sie den letzten Schritt durchführen – die Aktivierung Ihrer Datenbankspiegelungssitzung auf allen teilnehmenden Servern.
Zum Einrichten einer Datenbankspiegelungssitzung ist eine Servernetzwerkadresse für jede Serverinstanz erforderlich. Diese Adresse muss die Instanz durch Bereitstellen einer Systemadresse und der Portnummer identifizieren, die von der Instanz überwacht wird. Die Syntax für eine Servernetzwerkadresse sieht folgendermaßen aus:
TCP://<System-address>:<port>
<Systemadresse>: ist ein vollqualifizierter Domänenname oder eine IP-Adresse. Sie erhalten diese Informationen durch Ausführen von IPCONFIG auf dem lokalen Computer von einer Eingabeaufforderung aus.
Sie haben den <Port> eingerichtet, als Sie die Endpunkte erstellt haben.
Sie können die Datenbankspiegelungssitzung auf ServerB wie folgt starten:
Alter Database DBM_Demo
Set Partner= 'TCP://ServerA.com:5001';
Dann führen Sie folgende T-SQL-Anweisung aus, um die Sitzung auf ServerA zu starten:
Alter Database DBM_Demo
Set Partner='TCP://ServerB.com:5001';
Als Nächstes aktivieren Sie die Spiegelungssitzung auf ServerC (dem Zeugenserver) folgendermaßen:
Alter Database DBM_Demo
Set Witness='TCP://ServerC.com:5001';
Die Datenbankspiegelung kann jetzt in Ihrer Umgebung ausgeführt werden. Datenbankobjekte, die in der DBM_Demo-Datenbank hinzugefügt oder geändert wurden, werden in die ServerB-Kopie übertragen. Wenn jedoch die Datenbank von ServerA nicht verfügbar ist, kann ein Failover stattfinden, das die Rolle der gespiegelten Datenbank in die Prinzipalrolle ändert.
Mit der Datenbankspiegelung steht ihnen immer ein „Hot Standby“ zur Verfügung, falls Ihre Produktionsdatenbank einmal ausfallen sollte.

Saleem Hakani ist Senior Database Engineer bei Microsoft und verfügt über mehr als 14 Jahre Erfahrung mit Datenbanksystemen. Er hat die Microsoft SQL Community gegründet, die er jetzt leitet, und ist verantwortlich für die Bereitstellung von SQL Server-Standards und die Automatisierung in der gesamten Windows Live-Organisation. Saleem hat MCTS-, MCDBA- und MCSA-Zertifizierungen. Sie erreichen ihn unter Saleem@sqlcommunity.net.


 Berichte aus der Praxis: Der IT-Spezialist als Arzt?
Berichte aus der Praxis
Der IT-Spezialist als Arzt?
Matt Hester

VOR KURZEM kam mir der Gedanke, dass die Tätigkeit als IT-Spezialist mit der eines Arztes zu vergleichen ist. Zu diesem Zeitpunkt benutzte ich das erste Mal Windows Vista™ und hatte mit Netzwerkkonnektivitätsproblemen zu kämpfen. Nachdem ich stundenlang Pinganforderungen gesendet, ipconfig-Befehle eingegeben und sogar einige Neustarts ausgeführt hatte, sah ich ein Wort, das bei mir die natürliche Neugierde auslöste, die allen IT-Profis gemein ist: „Diagnose“. Während der Arbeit mit Betriebssystemen sind wir an Wörter und Ausdrücke wie „Reparatur“, „Status“, „Task-Manager“ und „Fehlerbericht senden“ gewöhnt. Sie sind uns bei der Navigation durch das Betriebssystem behilflich. Das Wort „Diagnose“ veranlasste mich jedoch, über die Ähnlichkeit zwischen den beiden Berufen nachzudenken.
An erster Stelle haben Ärzte sowie IT-Profis eine Qualifizierung erlangt, die ihnen erlaubt, ihre Namen mit Titeln und Abkürzungen zu schmücken. Diese Abkürzungen identifizieren ihre Fachgebiete und beeindrucken auf den Urkunden oder Visitenkarten möglicherweise andere Personen.
Wie Ärzte verfügen auch IT-Profis über viele Ressourcen, mit denen sie Probleme lösen können. Ärzte beraten sich mit ihren Kollegen und durchsuchen Fachzeitschriften und das Internet nach Informationen. IT-Profis tauschen sich auch mit Kollegen aus und recherchieren im Internet und in Fachpublikationen (insbesondere natürlich im TechNet Magazin), um Probleme zu lösen.
Darüber hinaus verlassen sich IT-Profis wie die Ärzte auf vertrauenswürdige Werkzeuge. Die Ärzte verfügen über erprobte Instrumente wie das Stethoskop. IT-Profis haben den Ping. Mit beiden Werkzeugen können Vorgänge abgehört werden.
Die letzte Gemeinsamkeit ist sozialer Natur. Bei festlichen Anlässen ist es für Ärzte sowie IT-Profis häufig wichtig, ihre berufliche Identität zu verheimlichen. Wenn andere sie dennoch herausfinden, entsteht dadurch nicht selten eine gewisse Popularität. Aber diese Popularität kann auch ihren Preis haben: Die Identität als charmanter Privatmensch geht verloren. Jetzt bin ich einfach nur noch der „PC-Typ“ und unfreiwilligerweise der Supportspezialist vor Ort für alle Partygäste. „Können Sie mir sagen, warum mein Computer heute Morgen abgestürzt ist?“ „Wo befindet sich der Any-Schlüssel?“, „Könnten Sie meinen Mac reparieren?“ Zu meinen schlimmsten Erlebnissen zählte es, als ein Arzt am anderen Ende des Raumes mich breit und wissend anlächelte, während er ohne Unterbrechung weitertanzte.
Aber zurück zum Konnektivitätsproblem: Nach ungefähr drei Stunden fehlgeschlagener Versuche, eine Verbindung herzustellen, habe ich auf die neu entdeckte Schaltfläche für Diagnose und Reparatur geklickt. Sie können sich denken, wie peinlich es mir war, als ich die folgende Antwort erhielt:

(Klicken Sie zum Verkleinern auf das Bild)
Mit offenem Mund und rotem Kopf sah ich mich um, um sicherzustellen, dass mich niemand beobachtete. Dann griff ich hinter meinen PC und schloss das Kabel an. Seit diesem glücklichen Tag arbeite ich weiterhin mit Windows Vista und verwende die Diagnosefunktion ausgiebig. Sie hat mir bei der Suche nach der Hauptursache einiger Probleme viel Zeit gespart. Sie funktioniert zudem sehr gut zusammen mit der Systemsteuerung „Problemberichte und -lösungen“, mit der Sie online nach weiteren Informationen suchen können. Testen Sie diese Funktionen, bevor Sie zu verzweifeln beginnen.
Zu einem späteren Zeitpunkt an diesem Abend und zufrieden, dass ich mein Netzwerkkonnektivitätsproblem gelöst hatte, stellte ich mir beim Einschlafen die Frage: Bedeutet dies, dass ich jetzt mehr Golf spielen und einen schicken neuen Sportwagen fahren kann?

Matt Hester ist ein TechNet-Vortragender im Microsoft Across America-Team. Erfahren Sie mehr über seine Präsentationen unter technetevents.com/mhester. Sie können ebenso seinen Blog unter blogs.technet.com/matthewms besuchen.


 Windows Confidential: Durch Dummheit klug aussehen
Windows Confidential
Durch Dummheit klug aussehen
Raymond Chens

WENN SIE eine CD in Ihren Computer einlegen, könnte Windows® Sie fragen, was das Programm tun soll, obwohl Sie dies bereits beim letzten Mal angegeben haben. Warum vergisst Windows Ihre Einstellungen für die automatische Wiedergabe? Nein, stimmt ja gar nicht – Windows überprüft Ihre Angaben nur noch einmal.
Bei der Art und Weise, wie Windows XP mit der automatischen CD-Wiedergabe umgegangen ist, gab es zwei Probleme. Zum einen stellten viele Benutzer fest, dass sie nach dem Installieren eines Programms, das die automatische CD-Wiedergabe unterstützt, nicht wussten, wie sie dieses Programm zu ihrem neuen Standardprogramm zur automatischen CD-Wiedergabe machen konnten. Wenn sie vorher ein Programm ausgewählt und „Always perform this action“ (Diese Aktion immer durchführen) markiert hatten, war nicht gleich offensichtlich, wie die Option „Immer“ rückgängig gemacht werden konnte, damit das Dialogfeld für die automatische CD-Wiedergabe wieder angezeigt und der Benutzer die Möglichkeit haben würde, das neue Programm als Standardprogramm auszuwählen.
Zum Zweiten zerstörten gewisse Programme mit schlechten Manieren nach der Installation insgeheim die nicht dokumentierten Einstellungen für die automatische CD-Wiedergabe, um sich selbst als das entsprechende Standardprogramm einzurichten, wodurch die Wahl des Benutzers außer Kraft gesetzt wurde.
Einfach ausgedrückt, sahen die beiden Probleme für Benutzer folgendermaßen aus: „Ich habe gerade dieses Programm installiert und möchte, dass es mein Programm für die automatische CD-Wiedergabe wird“, und umgekehrt: „Ich habe gerade dieses Programm installiert und möchte nicht, dass es mein Programm für die automatische CD-Wiedergabe wird.“
Windows Vista behandelt die Einstellungen für die automatische Wiedergabe global
Windows Vista behandelt die Einstellungen für die automatische Wiedergabe global (Klicken Sie zum Verkleinern auf das Bild)
Windows Vista behandelt die Einstellungen für die automatische Wiedergabe global
Windows Vista behandelt die Einstellungen für die automatische Wiedergabe global (Klicken Sie zum Vergrößern auf das Bild)
Windows XP Service Pack 2 (SP2) hat ein neues Verhalten für die automatische CD-Wiedergabe eingeführt, das diese Probleme behebt. Wenn das Programm sieht, dass ein neuer Handler für die automatische CD-Wiedergabe verfügbar ist, zeigt Windows Ihnen nun das Dialogfeld für die automatischen CD-Wiedergabe noch einmal. So haben Sie die Möglichkeit, das gerade von Ihnen installierte neue Programm auszuwählen bzw. nicht auszuwählen, wenn es so unverschämt war und sich als neuen Standardplayer eingerichtet hat.
Das Dialogfeld für die automatische CD-Wiedergabe wird auch angezeigt, wenn Sie nach der Aktualisierung auf Windows XP SP2 zum ersten Mal eine CD einlegen. Dieses „Besser spät als gar nicht“-Dialogfeld richtet sich an alle Handler, die vor der Aktualisierung auf Windows XP SP2 installiert wurden.
Früher musste das Betriebssystem nur Entwicklern helfen, die eine Schnittstelle zu einem Feature brauchten. Doch in der derzeitigen Softwarelandschaft muss es auch Programmierer daran hindern, diese Schnittstelle zu missbrauchen.
Es gibt einen weiteren Fall, wo es den Anschein haben könnte, dass Windows Ihre Einstellungen für die automatische Wiedergabe vergessen hat. Wenn Sie einen Wechseldatenträger einlegen, wie z. B. ein USB-Laufwerk, könnte eine Aufforderung angezeigt werden, obwohl Sie bereits eine Option ausgewählt und „Always perform this action“ (Diese Aktion immer durchführen) aktiviert haben. Dies ist nicht darauf zurückzuführen, dass Windows Ihre Einstellungen vergessen hat, sondern darauf, dass sie in zu guter Erinnerung sind.
Wenn Sie eine Option für einen Wechseldatenträger auswählen, erinnert sich Windows an die entsprechende Einstellung. Wenn Sie ein anderes Gerät anschließen, wird eine neue Aufforderung angezeigt, da Sie nicht angegeben haben, wie sich dieses andere Gerät verhalten soll. Die Absicht bei diesem Entwurf besteht darin, dass Sie festlegen können, dass Ihre Digitalkamera standardmäßig „Bilder anzeigen“, während Ihr Musikplayer standardmäßig „Musik wiedergeben“ soll. (Wenn das Gerät keine Seriennummer hat und über einen anderen USB-Anschluss angeschlossen wird, wird es wie ein anderes Gerät behandelt).
Als Reaktion auf die Verwirrung, die vom Windows XP-Entwurf verursacht wurde, hat sich das Verhalten in Windows Vista™ geändert. Die Einstellungen für die automatische Wiedergabe werden nun global und nicht für jedes Gerät behandelt. Wenn Sie angeben, dass keine Aktion durchgeführt werden soll, hält sich Windows Vista daran, egal, welches Gerät Sie über welchen Anschluss anschließen. Manchmal gibt das Betriebssystem den Anschein, klüger zu sein, wenn es in Wirklichkeit dümmer ist.

Raymond ChensWebsite The Old New Thing (blogs.msdn.com/oldnewthing) und ein Buch mit demselben Titel (Addison-Wesley, 2007) befassen sich mit der Geschichte von Windows und der Win32-Programmierung. In seiner Freizeit korrigiert er Aufsätze von Siebtklässlern.