Archiv für die Kategorie ‘Windows’

Ereignisprotokollierung beim Herunterfahren anzeigen

Im Standard wird unter Windows 7 der Dialog beim Herunterfahren nicht angezeigt, in dem man einen Grund angeben muss, warum der Rechner heruntergefahren wird. Viele werden diesen Dialog von Windows Server Betriebssystemen kennen. Will man diesen auch unter Windows 7 anzeigen, so ist dies ganz einfach zu realisieren.

Bei dieser Einstellung handelt es sich um eine lokale Gruppenrichtlinie, die über den Gruppenrichtlinien-Editor verändert werden kann. Hierzu ruft man »gpedit.msc« auf.

Im Gruppenrichtlinien-Editor muss man die Einstellung »Ereignisprotokollierung für Herunterfahren anzeigen« auf »Aktiviert« ändern.

Beim nächsten Versuch den Computer herunterzufahren wird der entsprechende Dialog anzeigt.

PowerShell: E-Mail an mehrere Empfänger verschicken

Will man, wie hier beschrieben, eine E-Mail verschicken und dies an mehrere Empfänger, so kann man diese auch in einer “externen” Datei ablegen. Sinnvoll ist dies bspw. wenn ein Script im Fehlerfall bestimmte Empfänger benachrichtigen soll und man diese Empfänger nicht codiert im PowerShell Skript hinterlegen will.
Zu diesem Zweck legt man die E-Mail Adressen der Empfänger einfach zeilenweise in einer Textdatei ab und lässt diese dann vom PowerShell Skript einlesen und übergibt das Ergebnis an den Send-MailMessage Befehl.

1
2
3
4
5
6
7
8
9
10
11
12
13
$i = 1;
$Recip = "";
$RecipientFile = (Get-Content C:\Temp\test.txt);
foreach ($Recipient in $RecipientFile)
{
	if ($i -gt 1)
	{ $Recip = $Recip + "," }
	$Recip = $Recip + $Recipient 
	$i++;
}
$Recip = $Recip.TrimEnd();
$toAddress = $Recip.Split(",")
Send-MailMessage -To $toAddress -From sender@example.com -Subject MultipleRecipients -SmtpServer smtp@example.com

PowerShell: E-Mail mit Sonderzeichen verschicken

Will man mittels PowerShell eine E-Mail versenden, so kann man hierfür die eingebaute Funktion »Send-MailMessage« verwenden. Will man hierbei auch Sonderzeichen im Text der Email verwenden, so muss man die Option »-Encoding« anhängen und den Zeichensatz UTF8 definieren. Ein einfaches Beispiel hierfür sieht wie folgt aus.

Send-MailMessage -Body 'Ein paar Sonderzeichen: äöüß' -Encoding ([System.Text.Encoding]::UTF8) -To receipient@example.com -From sender@example.com -SmtpServer smtp@example.com -Subject TestSubject

Muss man weitere Parameter übergeben, wie bspw. eine Authentifizierung gegenüber dem SMTP-Server, so findet man diese bei Microsoft im TechNet.

Send-MailMessage @ Microsoft TechNet

Shortcut für neue Debug-Instanz in Visual Studio

Wenn man in Visual Studio mehrere Projekte in einer Projektmappe hat, so hat man das Problem, dass immer nur ein Projekt als Startprojekt definiert sein kann. Dies hat zur Folge, dass, auch wenn man eine Datei eines anderen Projekts bearbeitet, bei Ausführung über »Debuggen starten« immer das aktuell definierte Startprojekt gestartet wird.
Genau aus diesem Grund wäre es schön, wenn es eine Möglichkeit gibt, mit der man immer das Projekt starten kann, in dem man auch gerade eine Datei bearbeitet.

Genau für diesen Zweck muss man einfach einen neuen Shortcut in Visual Studio definieren. Der entsprechende Eintrag in den Optionen heißt »KlassenansichtKontextmenüs.KlassenansichtProjekt.Debuggen.NeueInstanzstarten«, wie man auch im folgenden Screenshot sehen kann.

In meinem vorliegenden Beispiel habe ich hierfür einfach den Shortcut »Strg + Umschalt + Alt + F5« gesetzt. Somit kann ich immer das Projekt starten, in dem ich gerade eine Datei editiere. Unschön hierbei ist, dass wenn man ein Klassenbibliothek bearbeitet, man diese natürlich nicht ausführen kann. Somit passiert nichts bzw. man erhält dann eine Fehlermeldung , dass eine Klassenbibliothek nicht direkt ausgeführt werden.
Hierfür gibt es auch noch eine Lösung. Diese ist allerdings nur mittels eines Makro zu realisieren. Mir persönlich zu aufwendig aber vielleicht für den oder anderen dennoch interessant. Daher hier der Link zur Lösung: Visual Studio -> Debug – Start new instance shortcut

Google Chrome mit Proxy verwenden

Grundsätzlich verwendet Google Chrome unter Windows die gleichen Netzwerkeinstellungen, die auch der Internet Explorer verwendet. Wenn man also nur für Chrome einen Proxy einstellen möchte, der für Chrome gilt, für den IE aber nicht, so ist man mit Bordmitteln aufgeschmissen.

Die Möglichkeit besteht aber trotzdem. Man kann hierzu Chrome mit einem Parameter von der Kommandozeile aus starten. In der Regel liegt die ausführbaren Dateien von Chrome im Verzeichnis »C:\Users\Username\AppData\Local\Google\Chrome\Application\«

chrome.exe --proxy-server="localhost:1111"

Führt man das oben stehende Beispiel aus, so würde Chrome versuchen die Verbindungen über einen Proxy auf »localhost« mit Port »1111« durchzuführen.

Will man einen SOCKS-Proxy verwenden, so kann man dies wie im folgenden Beispiel machen:

chrome.exe --proxy-server="socks5://localhost:4444"

Quelle: How do I set Chrome up with my proxy?

Datei mittels PowerShell aktualisieren/kopieren

Will man eine Datei von einem Verzeichnis automatisch in anderes Verzeichnis kopieren, so kann man dies unter Windows relativ einfach mit einer Batch-Datei und der Aufgabenplanung erledigen.
Will man allerdings die Datei nur kopieren, wenn die Datei im Quellverzeichnis neuer ist als die Datei im Zielverzeichnis so geht dies mit einer Batch-Datei schon nicht mehr so einfach.

Zu diesem Zweck kann man sich aber ein PowerShell Skript schreiben, dass genau diese Funktionalität abbildet. Falls man bisher noch keine PowerShell Skripte auf seinem Rechner eingesetzt hat, muss man zunächst die sogenannte »ExecutionPolicy« ändern. Weitere Infos hierzu kann man dem folgenden Link entnehmen: Running Scripts From Within Windows PowerShell.
Abgekürtzt reicht es aus, wenn man eine Instanz der PowerShell als Administrator (also als Administrator ausführen) startet und den folgenden Befehl ausführt:

Set-ExecutionPolicy Unrestricted

Die Abfrage einfach mit »J« beantworten.

Auf einem Testsystem kann man diesen Befehl so verwenden, auf einem produktiven System (bspw. Server) sollte man dies nicht einsetzen, wenn man nicht weiß, welche Konsequenzen hieraus resultieren können.

$BackEndDir = "C:\PowerShellCopy\Backend\"
$BackEndFile = "ImportantInformation.txt"
$FrontEndDir = "C:\PowerShellCopy\Frontend\"
 
if ( !$BackEndDir.EndsWith("\") )
{ $BackEndDir = $BackEndDir + "\" }
if ( !$FrontEndDir.EndsWith("\") )
{ $FrontEndDir = $FrontEndDir + "\" }
 
$BackFile = $BackEndDir + $BackEndFile
$FrontFile = $FrontEndDir + $BackEndFile
 
if ( !(Test-Path $BackFile) )
{
    Write-Host("Datei im Backend ist nicht vorhanden")
    return
}
 
$objBackFile = get-item $BackFile
$objBackFileLWT = [datetime]$objBackFile.LastWriteTimeUTC
 
Write-Host ("BackEndDatei: " + $objBackFileLWT)
 
If ( (Test-Path $FrontFile) )
{
    echo "Datei vorhanden"
    $objFrontFile = get-item $FrontFile
    $objFrontFileLWT = [datetime]$objFrontFile.LastWriteTimeUTC
    Write-Host ("FrontEndDatei: " + $objFrontFileLWT)
    if ($objBackFileLWT -gt $objFrontFileLWT)
    {
        Write-Host ("Datei wird im FrontEnd aktualisiert")
        Copy-Item $BackFile $FrontEndDir
    }
    else
    {
        Write-Host ("Datei im FrontEnd ist gleich alt bzw. aktueller")
    }
}
Else
{
    Write-Host ("Datei nicht vorhanden")
}

Für die eigene Verwendung müssen im Grunde nur noch die Verzeichnispfade und der Dateiname in den ersten drei Zeilen angepast werden.

Führt man dann dieses PowerShell Skript mittels der Aufgabenplanung aus, so wird die Datei aus dem Backend-Verzeichnis immer dann in das Frontend-Verzeichnis kopiert, nur wenn diese auch wirklich aktueller ist. Somit ist man immer auf dem aktuellsten Stand, verhindert aber unnötige Kopieraktionen, was gerade bei großen Dateien ein Vorteil sein kann.

Quellen:
Converting the FileSystemObject’s FileExists Method
Using the Copy-Item Cmdlet
Verwenden des Cmdlet “Set-ExecutionPolicy”
Windows PowerShell Tip: The String’s the Thing

Spotlight für Windows – Launchy

Nachdem ich nun zu Hause schon einige Zeit einen Mac mini stehen habe und diesen auch von Zeit zu Zeit mal benutze, vermisse ich eine Funktion unter Windows am meisten. Und zwar Spotlight zum Starten von Programmen.
Unter Mac OS X einfach »Apfel-Leertaste« betätigt, Programmname eingegeben und »Enter« betätigt. Schon ist das gewünschte Programm gestartet.

Unter Windows kann man dies ganz einfach mit Launchy erreichen. Der Vorteil hierbei ist, dass im Gegensatz zum Mac hier nicht wie bei Spotlight alle Verzeichnisse überwacht werden, sondern Launchy nur für die in den Einstellungen definierten Verzeichnisse einen Index erstellt und somit nicht permanent eine Systemlast erzeugt.

Für den Zweck das einfachen Programmstart also genau richtig.

Wiederherstellungsmodell bei allen Datenbanken ändern

Will man alle Datenbanken, bspw. auf einem Testserver, in den Wiederherstellungsmodell »Einfach« versetzen, so kann man das ganz einfach per TSQL Statement vornehmen

use master  
SELECT 'ALTER DATABASE [' + name + '] SET RECOVERY SIMPLE' from master..sysdatabases where name not in ('master','model','msdb','tempdb')

Der obige SELECT erzeugt die Statements, die man dann ausführen muss, um das Wiederherstellungsmodell zu verändern.

Alternativ kann man so die Datenbank auch in die anderen beiden Wiederherstellungsmodi versetzen. Hierfür muss »SIMPLE« im obigen Statement nur durch »FULL« oder »BULK_LOGGED« ersetzt werden. Will man diesen Vorgang automatisieren, so kann man hierfür bspw. eine Stored Procedure erstellen, die Nachts automatisch als Auftrag vom SQL Server ausgeführt wird. So könnte hier ein simples Beispiel aussehen:

CREATE PROCEDURE SetRecoveryMode
AS
BEGIN
 
	SET NOCOUNT ON
 
	DECLARE @ToDo TABLE 
	( 
		ID int IDENTITY PRIMARY KEY,
		Statement nvarchar(max),
		Completed bit
	)
 
	INSERT INTO @ToDo (Statement, Completed)
	SELECT 'ALTER DATABASE [' + name + '] SET RECOVERY SIMPLE', 0
	from master..sysdatabases where name not in ('master','model','msdb','tempdb') 	
 
	DECLARE @CurrentID int
	DECLARE @CurrentStatement nvarchar(max)
 
	WHILE EXISTS (SELECT * FROM @ToDo WHERE Completed = 0)
	BEGIN
		SELECT TOP 1 @CurrentID = ID,
					 @CurrentStatement = Statement
		FROM @ToDo
		WHERE Completed = 0
		ORDER BY ID ASC
 
		EXEC (@CurrentStatement)
 
		UPDATE @ToDo
		SET Completed = 1
		WHERE ID = @CurrentID
	END
 
	SET NOCOUNT ON
END

defekte Beispieldatenbank zum experimentieren

Ist man auf der Suche nach einer Datenbank, die schon Fehler enthält, so muss man diese nicht mühselig, durch bspw. ausstellen des Servers erstellen, so kann unter dem folgenden Link fündig werden. Ganz praktisch wenn man bestimmte entwickeln möchte, für die man eine defekte Datenbank benötigt, weil man sonst gar keine Ergebnisse erhält.

Sample corrupt databases to play with

Inhalt von HTML Hilfe wird nicht angezeigt

Wird beim Aufruf einer Hilfedatei, die auf einem Netzlaufwerk abgelegt ist, unter Windows kein Inhalt dargestellt, so liegt dies in der Regel an zwei Sicherheitsupdates von Microsoft.

Dieses Problem tritt auf, da die Sicherheitsupdates 896358 und 890175 verhindern, dass HTML-Inhalt außerhalb der lokalen Zone eine Instanz des ActiveX-Steuerelements für die HTML-Hilfe erstellt. Diese Änderung sollen Sicherheitsanfälligkeiten in der HTML-Hilfe reduzieren. Quelle: Microsoft Support Center

Da es aber häufig Sinn macht bzw. Client/Server Programme die Dateien auch einfach auf dem Server ablegen, gibt es auch eine Möglichkeit die Inhalte wieder anzeigen zu lassen. Dazu muss man nur die folgenden Änderungen in seine lokale Registry importieren.

REGEDIT4
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\HTMLHelp]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\HTMLHelp\1.x\ItssRestrictions]
"MaxAllowedZone"=dword:00000004
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\HTMLHelp\1.x\HHRestrictions\]
"MaxAllowedZone"=dword:00000004

Ein Neustart des Rechner oder Ab-/Anmelden ist im Anschluss nicht nötig. Lediglich der Internet Explorer, sollte falls geöffnet, einmal neu gestartet werden.

Im Anschluss werden auch wieder die Inhalte von HTML Hilfedateien über ein Netzlaufwerk korrekt angezeigt.


Disclaimer

Bevor Änderungen an der Registry vorgenommen werden, sollte in jedem Fall ein Backup der Registry erstellt werden. Außerdem sollte geprüft werden, ob im Bedarfsfall ein Restore durchgeführt werden kann. Die unkorrekte Verwendung des Registry-Editors kann zu schwerwiegenden Problemen führen, die eine Neuinstallation des Betriebssystem erfordern.

Microsoft KB 141377: Differences between Regedit.exe and Regedt32.exe

Microsoft KB 322756: How to back up and restore the registry in Windows