Archive for Mai 2011

Diskpart.exe durch Powershell ersetzen mittels Virtual Disk Service

31 Mai 2011

Eine der wenigen Bastionen in denen Powershell in vielen Beispielen noch auf Kommandozeilenbefehle zurückgreifen muss, anstatt über Cmdlets oder direkte COM-Schnittstellen-Aufrufe zu glänzen, ist sicherlich DISKPART.

Bei Artikeln, wo man mittels Diskpart einen USB-Stick einrichten muss, wie z. B. hier: https://newyear2006.wordpress.com/2009/09/19/windows-vista-windows-7-usb-boot-stick-erstellen/, stellt sich regelmäßig das Problem, dass Diskpart zu sperrig ist und unbedarfte Benutzer schnell großen Schaden anrichten können.

Aber Dank dieses genialen Artikels: http://esotericalstuff.wordpress.com/2010/11/18/vds-under-powershell-2/, sollte dieses Thema bald aus der Welt geschafft sein. Denn mittels Virtual Disk Service kann man Diskpart sicherlich umgehen.

Entscheidend sind diese Zeilen:

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.Storage.Vds") | Out-Null 
$VdsServiceLoader = New-Object Microsoft.Storage.Vds.ServiceLoader 
$VdsService = $VdsServiceLoader.LoadService($null) 
$VdsService.WaitForServiceReady() 
$VdsService.Reenumerate() 

#Build up a collection of all disks presented to the os 
$Disks = ($VdsService.Providers |% {$_.Packs}) |% {$_.Disks} 

Allerdings weißt dieser MS-Mitarbeiter darauf hin, dass die Sache vielleicht nicht von Dauer sein könnte (siehe Method2): http://blogs.msdn.com/b/taylorb/archive/2010/07/01/getting-more-information-about-you-cluster-lun-s-part-3-of-3.aspx. Es sind bereits auch die Links für die älteren Artikel für VDS und Powershell nicht mehr aufrufbar. Ein Zeichen?

Hier die zugrunde liegende MSDN-Doku zu VDS: http://msdn.microsoft.com/en-us/library/bb986750(v=VS.85).aspx

Hier noch eine Lösung in C#, was möglich ist: http://stackoverflow.com/questions/2755458/retrieving-virtual-disk-file-name-from-disk-number

Advertisements

Ich weiß wo dein Router wohnt

31 Mai 2011

Google hat Wardriving professionalisiert. Jedes Android Handy und davon gibts ja mittlerweile massenhaft, telefoniert nach Hause und liefert Daten über umliegende WLANs.

Eine tolle Seite um einzusehen, ob man bereits registriert ist, gibt es hier: http://samy.pl/androidmap/

Zu jeder bekannten MAC Adresse gibt es die genaue Anschrift.

IIS7 oder IIS7.5 mit alten Classic ASP Seiten ans Laufen bekommen, diesmal in Powershell

28 Mai 2011

Dieser Artikel bezieht sich auf den Artikel: https://newyear2006.wordpress.com/2010/07/05/iis7-oder-iis7-5-mit-alten-asp-seiten-ans-laufen-bekommen/. Damit man eine Ahnung hat, worum es geht, sollte man diesen zuerst lesen.

Diesmal soll alles mittels Powershell konfiguriert werden. Dazu werden zuerst die ServerManager-Cmdlets aktiviert:

Import-Module ServerManager

Prüfen ob Classic-ASP schon installiert ist:

Get-WindowsFeature Web-ASP | fl installed

Wenn nicht, also installieren:

Add-WindowsFeature Web-ASP

Dann IIS-Powershellprovider laden

Import-Module WebAdministration

zum IIS wechseln

CD IIS:\

Um die Scriptfehlermeldungen angezeigt zu bekommen, verwendet man diesen Befehl:

set-WebConfigurationProperty /system.webserver/asp/.
-name scriptErrorSentToBrowser -Value $true

den aktuellen Wert abfragen, kann man mit

Get-WebConfigurationProperty /system.webserver/asp/.
-name scriptErrorSentToBrowser

Eine kleine Einführung in Get/Set-WebConfiguration* gibt es hier: http://learn.iis.net/page.aspx/436/powershell-snap-in-changing-simple-settings-in-configuration-sections/

Um die Unterstützung von Access-Datenbanken wieder ans Laufen zu bekommen, muss der 32Bit Modus aktiviert werden:

set-WebConfigurationProperty /system.applicationhost/applicationPools/
applicationPoolDefaults -Name enable32BitAppOnWin64 -Value $true

Die Parent Path Unterstützung wird darüber aktiviert:

set-WebConfigurationProperty /system.webserver/asp/.
-name enableParentPaths -Value $true

Um die Fehlerseiten für die passende Website anzupassen verwendet man

Set-WebConfigurationProperty "/system.webserver/httpErrors/error[@statusCode=’404′]" -pspath "iis:\sites\Default Web Site" -name path -value ‚/fehler/404b.asp‘
Set-WebConfigurationProperty "/system.webserver/httpErrors/error[@statusCode=’404′]" -pspath "iis:\sites\Default Web Site" -name responseMode -value ‚executeURL‘

Die Abfrage, ob alles korrekt gesetzt ist, bekommt man mit

Get-WebConfiguration "/system.webserver/httpErrors/error[@statusCode=’404′]" -pspath "iis:\sites\Default Web Site"

Um das Directory Browsing für die Website zu aktivieren, verwendet man

Set-WebConfigurationProperty "/system.webserver/directoryBrowse" -pspath "iis:\sites\Default Web Site" -name enabled -value $true

 

Eine Seite die ungemein hilfreich zum Finden der richtigen Befehle ist, mit Tonnen von Beispielen: http://blogs.iis.net/jeonghwan/archive/2008/07/30/iis-powershell-user-guide-comparing-representative-iis-ui-tasks.aspx

1&1 Dynamic Cloudserver Firewall und ungebräuchliche Ports

28 Mai 2011

Wer einen Dynamic Cloudserver bei 1&1 (1und1) hat, der benötigt für die eine oder andere Situation einen abweichenden Kommunikationsport.

Bei einem Windows 2008 R2 Web Server ist die Windows Firewall z. B. von Hause aus ausgeschaltet. Statt dessen hat 1&1 eine eigene Firewall davor gesetzt, welche man in seinen Servereinstellungsbereich konfigurieren kann. Hat man dies getan, so kommen aber ungebräuchliche Ports immer noch nicht durch!

Woran liegts? Bei Windows Servern müssen noch zusätzlich IP Sicherheitsfilter verändert werden. Dazu startet man MMC und lädt sich das Snapin “IP Security Policy Manager” oder “IP-Sicherheitsrichtlinienverwaltung” dort fügt man dann bei den Packetfilter-Eigenschaften einen neuen Filter hinzu.

Hier die 1&1 Beschreibung: http://hilfe-center.1und1.de/search/go.php?t=e727340

Übrigens für Scripter: Der passende Bereich kann über “netsh ipsec static” konfiguriert werden.

IIS 7 oder 7.5 und FTP Service Benutzer einrichten

28 Mai 2011

Nicht immer ganz offensichtlich ist, wie der FTP-Dienst unter IIS 7 bzw. 7.5 verwendet wird. Deshalb hier ein paar Notizen, damit es einfacher geht.

FTP installieren: http://learn.iis.net/page.aspx/263/installing-and-configuring-ftp-on-iis-7/

Einer Webseite fügt man FTP-Möglichkeiten hinzu indem man per Rechtsklick auf der Website “Add FTP Publishing” auswählt.

FTP-Benutzer legt man als lokale Benutzer unter Windows an (NET USER /ADD), bei FTP User Isolation verwendet man “User name directory (disable global virtual directories)”, zusätzlich muss auf der Rootfolder das Verzeichnis LocalUser angelegt werden, darunter legt man dann Verzeichnisse mit Benutzernamen an. Basic Authentication muss aktiviert werden. Bei “Authorization Rules” fügt man entweder Gruppen oder den einzelnen Benutzer mit den jeweiligen Rechten hinzu. Bei “FTP Directory Browsing” müssen evtl. noch die “virtual directories” aktiviert werden.

Wenn man einen Admin mit Zugriff auf alle Verzeichnisse benötigt, ist dieser in seinem Homeverzeichnis gefangen. Aber durch Anlegen eines virtuellen Verzeichnis, dessen physikalischer Pfad auf das Root der Webseite zeigt, bekommt der Admin indirekt wieder zugriff auf die gesamte Web Seite.

Hier ein Artikel mit dem Einrichten eines Admins, damit dieser Zugriff auf alles bekommt: http://www.experts-exchange.com/Software/Server_Software/Web_Servers/Microsoft_IIS/
Q_26104650.html

Ein schöner Artikel wo die Leute sich über das komplizierte Einrichten von FTP-Benutzern auslassen: http://forums.iis.net/t/1157475.aspx

Eine bildliche Abhandlung wie man die FTP-Geschichte einrichtet: http://learn.iis.net/page.aspx/305/configuring-ftp-75-user-isolation/

Am Ende nicht vergessen die Firewall beim Hosting Provider aufzumachen, damit auch Port 21 durchkommt.

Eine weitere Möglichkeit FTP-Benutzer anzulegen und zu verwalten: http://learn.iis.net/page.aspx/321/configure-ftp-with-iis-7-manager-authentication/

Hier wird noch beschrieben, wie man die ApplicationHost.config Datei verändert, um eine Ftp-Site anzulegen: http://learn.iis.net/page.aspx/301/creating-a-new-ftp-site/

Und noch etwas Powershell um Ftp-Sites zu Administrieren, z. B. virtuelle Verzeichnisse anlegen und zuordnen:

http://social.technet.microsoft.com/Forums/en/winserverpowershell/thread/1dc6e285-9c92-4765-89cd-f0bafd1c7bb7

oder Authorization Rules verändern:

http://blogs.msdn.com/b/johan/archive/2008/10/02/powershell-advanced-configuration-editing-in-iis7.aspx

Teamviewer meldet “Keine Verbindung zum Masterserver” oder Proxy Fehlermeldung

25 Mai 2011

Ein Kunde bekam beim Teamviewer die Meldung "Keine Verbindung zum Masterserver", Bitte überprüfen Sie Ihre Internetverbindung. Wahrscheinlich nutzen Sie einen Proxyserver und müssen die entsprechenden Informationen im Optionendialog eintragen. Abbrechen/Proxy-Einstellungen/Wiederholen

Dem Kunden war nichts von einem Proxy bekannt, er ist bei der Telekom mit einem Standard-DSL-Anschluss.

Zum Einsatz kam die aktuelle Version 6. Da der Support leider nicht direkt weiterhelfen wollte und statt dessen erst einmal Logfiles anforderte, wurde die Sache nicht mehr weiter verfolgt.

Per Zufall kam nun aber heraus, dass die Fehlermeldung scheinbar auch dann auftritt, wenn kein DNS-Server zur Verfügung steht! Als weiteren Punkt muss man sicherlich aufführen, wenn eine Firewall ausgehende Verbindungen blockt und damit z. B. auch den Teamviewer blockt, dürfte ebenso diese Fehlermeldung daraus resultieren.

Microsofts go Links erklärt

25 Mai 2011

Microsoft verwendet die Subdomain go.microsoft.com mit dem Action-Eintrag fwlink und dem LinkID-Parameter um auf aktuelle Artikel im Hause Microsoft zu verweisen.

Laut diesem Artikel verwendet die Powershell-Hilfe diese Funktion um immer auf den aktuellen Stand der Online-Hilfe zu verlinken. http://blogs.msdn.com/b/powershell/archive/2011/04/22/keeping-help-helpful-use-online-and-redirectable-links.aspx

So verlinkt nun

http://go.microsoft.com/fwlink/?LinkID=113316

auf die Hilfe über Get-Help.

Wenn man diesen Link jetzt einfach aufruft, landet man abhängig von seinen Spracheinstellungen auf der deutschen oder englischen Fassung. Um beim Verlinken etwas mehr Einfluss zu haben, ob man den deutschen oder englischen Artikel angezeigt bekommt, kann man mittels dem Parameter LCID die gewünschte Sprache in der URL mitgeben.

Somit erhält man mit diesem Link die englische Fassung

go.microsoft.com/fwlink/?LinkID=113316&clcid=0x409
go.microsoft.com/fwlink/?LinkID=113316&clcid=1033

der aktuell auf diese Seite verzweigt:
http://technet.microsoft.com/en-us/library/dd347639.aspx

und mit diesem Link die deutsche Fassung

go.microsoft.com/fwlink/?LinkID=113316&clcid=0x407
go.microsoft.com/fwlink/?LinkID=113316&clcid=1031

der aktuell auf diese Seite verzweigt:
http://technet.microsoft.com/de-de/library/dd347639.aspx

Eine Tabelle über mögliche aktuelle LCIDs findet man hier: http://msdn.microsoft.com/en-us/goglobal/bb964664

Die resultierenden technet-Links enthalten dann wiederum den culture-name, mit dem gezielt die Sprache gesetzt werden kann. Hier eine Liste der möglichen culture-names: http://msdn.microsoft.com/en-us/goglobal/bb896001

Wer ähnliche Infos zur Suche in der Knowledge Base sucht wird hier und in den weiteren Links fündig: https://newyear2006.wordpress.com/2011/05/09/effektive-microsoft-knowledge-base-suche-fr-sbs2011/

Oplocks oder Opportunistic Locking lässt einen nicht los oder wie man alte 16bit Clipper Programme mit Server 2008 R2 Fileshares ans Laufen bekommt

24 Mai 2011

Hier der passende KB Artikel für die Oplocks: http://support.microsoft.com/kb/296264

Zur Abfrage der Einstellung:

reg query "HKLM\System\CurrentControlSet\Services\lanmanserv
er\parameters"

Zum Abschalten am Server:

reg add "HKLM\System\CurrentControlSet\Services\lanmanserver
\parameters" /v EnableOplocks /t REG_DWORD /d 0

Damit aber nicht genug. Denn es muss gleichzeitig noch SMB2 abgeschaltet werden. Ob man dies nun am Server oder am Client macht hängt davon ab, welche Clients ein Problem haben.

Auf die Schnelle kann man SMB2 auf dem Server abschalten, wenn man laut diesem Artikel http://www.petri.co.il/how-to-disable-smb-2-on-windows-vista-or-server-2008.htm# mittels

reg add "HKLM\System\CurrentControlSet\Services\lanmanserver
\parameters" /v Smb2 /t REG_DWORD /d 0

abschaltet. Ein zusätzliches Abschalten auf den Clients sollte eigentlich nicht notwendig sein, denn damit SMB2 verwendet wird, muss dieses auf beiden Seiten aktiv sein.

Infos zu SMB2: http://blogs.technet.com/b/josebda/archive/2008/12/05/smb2-a-complete-redesign-of-the-main-remote-file-protocol-for-windows.aspx

In Verbindung mit SMB2 und dessen spezifische Registrierungseinträge dürfte dieser Forumeintrag noch interessant sein: http://social.msdn.microsoft.com/Forums/en/os_fileservices/thread/832d395b-6e6f-4658-8dbb-120138a4cd7c

Da werden so tolle Dinge wie

==============================================================================
Registry values

All listed settings are in the following registry location:

Key: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\LanmanWorkStation\Parameters

Value type:    REG_*
Value name: <name of value>
Default:        <value if note present>

==============================================================================
Vista, 2008, …

Value type: REG_DWORD
Value name: AllowGuestAuthWhenSigningRequired
Default:    FALSE

Group Policy settings are not applied on member computers that are running Windows Server 2008 or Windows Vista SP1 when certain SMB signing policies are enabled
http://support.microsoft.com/kb/950876

When a Server Message Block (SMB) version 1 client establishes a non-guest session or a non-anonymous session with a server, the client enables security signatures for the server. Later sessions then inherit the security signature sequence that is already established.

To improve security, Windows Server 2008 and Windows Vista SP1 prevent server authenticated connections from being maliciously downgraded to a guest session or to an anonymous session. However, this improved security does not address the scenario that is described in the "Symptoms" section (Event ID: 1058).

==============================================================================
Vista, 2008, …

Value type: REG_DWORD
Value name: FileInfoCacheLifetime
Default:    10 (seconds)

Used for increasing network file system performance.
The caches are consistent when changes are made by the client, but if changes are made from another client, they may not be reflected until the cache times out.

==============================================================================
Vista, 2008, …

Value type: REG_DWORD
Value name: FileNotFoundCacheLifetime
Default:    5 (seconds)

Used for increasing network file system performance. The caches are consistent when changes are made by the client, but if changes are made from another client, they may not be reflected until the cache times out.

==============================================================================
Vista, 2008, …

Value type: REG_DWORD
Value name: DirectoryCacheLifetime
Default:    10 (seconds)

Used for increasing network file system performance. The caches are consistent when changes are made by the client, but if changes are made from another client, they may not be reflected until the cache times out.

==============================================================================
Vista, 2008, …

Value type: REG_DWORD
Value name: DisableBandwidthThrottling
Default:    FALSE

Performance Tuning Guidelines for Windows Server 2008.
http://go.microsoft.com/fwlink/?LinkId=121171

The default is 0. This setting is available starting with Windows Server 2008 SP2. By default, the SMB redirector throttles throughput across high-latency network connections in some cases to avoid network-related timeouts. Setting this registry value to 1 disables this throttling, enabling higher file transfer throughput over high-latency network connections.

beschrieben.

Generell haben alle möglichen Leute Probleme damit: http://social.technet.microsoft.com/Forums/en-US/winservergen/thread/01ddd2c0-568d-457e-a229-8f51872610b0/

Dieser Hotfix http://support.microsoft.com/kb/2028965 ist im SP1 für Windows 7 und Server 2008 R2 enthalten. Die Frage ist nun aber bezüglich Windows Vista, welche Rolle er dort spielt?

Powershell für den einfachen Webzugriff um Dienste im Web aufzurufen oder XML-Dokumente zu laden

24 Mai 2011

Bei einem Kunden sollte in regelmäßigen Abständen eine bestimmte Webseite aufgerufen werden um einen bestimmten Prozess anzustoßen. Gleichzeitig sollte später hin und wieder ein XML-Dokument abgeholt werden. Dank Powershell und dem .Net-Framework lässt sich die Aufgabe sehr einfach realisieren.

Serverdienst aufrufen, einfache Methode

$url = "http://www.service-site-im-internet.de/blabla?usw"
# Endlosschleife
do {
  $html = "";
  $html = (New-Object  System.Net.WebClient).DownloadString($url);
  Write-Host($html.Replace("<BR>", "`n"));
  Start-Sleep –Seconds 360
} while ($true)

Der Aufruf bei Replace ersetzt einen HTML-Umbruch durch einen Zeilenumbruch in Powershell. Näheres zu den Escape-Sequenzen und Zeichen in Powershell findet man unter

get-help about_escape_charachters

und

get-help about_special_characters

Serverdienst aufrufen, mit mehr Kontrolle

Ein Problem mit der einfachen Methode über die WebClient-Klasse http://msdn.microsoft.com/de-de/library/tt0f69eh.aspx ist, dass man nicht so einfach bestimmte sinnvolle Parameter setzen kann. Es gibt noch eine bessere Möglichkeit den Dienst aufzurufen. Mittels WebRequest-Klasse: http://msdn.microsoft.com/de-de/library/5t9y35bd(v=VS.80).aspx

$request = [System.Net.WebRequest]::Create($url)

Jetzt bekommt man jede Menge Infos in $request zurück. Wichtig: $request ist vom Typ HttpWebRequest und nicht mehr WebRequest! Genauso bekommt man FtpWebRequest, wenn man anstatt http: eben ftp: verwendet. Nun kann man zusätzlich jede Menge Parameter für den Aufruf setzen, wie UserAgent oder Passwörter usw.

Mittels

$response = $request.GetResponse()

erfolgt der eigentliche Aufruf. In $response gibt das Property Statuscode den HTTP-Statuscode zurück. Allerdings ist jetzt OK nicht so prickelnd, also verwendet man [int] vorneweg um den Code in einem schönen Zahlenwert zu bekommen.

$response.Statuscode
[int]$response.Statuscode

Hinweis: Wenn es Probleme gibt und das Script scheint zu hängen, bitte den $request.Timeout Wert beachten, dieser ist in der Vorgabe auf 100 Sekunden eingestellt! Also Geduld oder den Wert vor dem Aufruf runtersetzen.

Noch etwas mehr Kontrolle bei Fehlern

Tja leider ist das aber nur die halbe Wahrheit, denn wenn nun die durch $url angesprochene Ressource nicht verfügbar ist, dann wirbelt einem eine WebException entgegen und dann sieht ein Script schnell alt aus. Dies betrifft übrigens auch die erste einfache Variante.

Aus diesem Grund kapselt man den Aufruf von GetResponse() oder DownloadString() in einen try-catch Block.

Somit könnte obiger Aufruf so aussehen:

try {
  $response = $request.GetResponse()
}
catch [System.Net.WebException] {
  if ($_.Exception.Response.StatusCode –eq "404")
        {Write-Host "Seite nicht gefunden " + $_.Exception.Status}
}

#wichtig mit Close die Verbindung wieder freigeben!
$response.Close()

Nicht offensichtlich aber doch vorhanden, kann man die Response- sowie Status-Eigenschaften http://msdn.microsoft.com/de-de/library/system.net.webexception.response(v=VS.80).aspx bzw. http://msdn.microsoft.com/de-de/library/system.net.webexception.status(v=VS.80).aspx abfragen. Damit hat man die volle Kontrolle und kann auf alles reagieren.

XML-Dokument abholen

Ein XML-Dokument aus dem Internet abzuholen ist genauso einfach und erlaubt sogar den direkten Zugriff auf die einzelnen Elemente des XML-Dokuments.

$url = "http://www.infos-aus-dem-internet.de/hole-mir-die-datei.xml"
[xml]$xmldoc=(Net-Object System.Net.WebClient).DownloadString($url)

Wenn man z. B. folgendes XML-Dokument hat

<?xml version="1.0"?>
<COMPUTERNAME>
    TESTER
    <IP-ADDRESS>91.12.31.250</IP-ADDRESS>
    <PUBLISHED>
        <DATE>20.05.2011</DATE>
        <TIME>14:55:16</TIME>
    </PUBLISHED>
</COMPUTERNAME>

kann nachdem das Dokument geladen wurde, mittels

$xmldoc.COMPUTERNAME

auf das Element COMPUTERNAME zugegriffen werden. Auf die Ip-Adresse kann man mittels

$xmldoc.COMPUTERNAME.’IP-ADDRESS‘

zugreifen. Ein Zugriff auf

$xmldoc.COMPUTERNAME.IP-ADDRESS

ist nicht möglich, da der Bindestrich von Powershell anders interpretiert wird und sozusagen -ADDRESS als Parameter gesehen wird.

Daten zum Leben erwecken

Da die Daten aus der XML-Datei einfach nur leblose Daten, also Strings sind, kann man sie mittels einfachen Konvertierungsfunktionen zur vollen Blüte bringen.

Mittels

[DateTime]::Parse($xmldoc.COMPUTERNAME.PUBLISHED.DATE)

oder gleich

[DateTime]::Parse($xmldoc.COMPUTERNAME.PUBLISHED.DATE + " " + $xmldoc.COMPUTERNAME.PUBLISHED.TIME)

bekommt man ein Datumsobjekt geliefert, mit dem man nach Herzenslust danach arbeiten kann. Info zu Parse: http://msdn.microsoft.com/en-us/library/1k1skd40.aspx

Das gleiche Spiel kann man auch mit der IP-Adresse anstellen:

[IPAddress]::Parse($xml.COMPUTERNAME.’IP-ADDRESS‘)

Weitere Infos zu IPAddress.Parse() http://msdn.microsoft.com/de-de/library/system.net.ipaddress.parse(v=VS.80).aspx

Top Einführung in PNRP per NETSH

22 Mai 2011

Was man mit den Clouds von PNRP bei IPv6 alles anstellen, zeigt sehr einfach dieser Screencast: http://channel9.msdn.com/Blogs/SlickThought/Peer-to-Peer-Series-Part-1-Intro-to-PNRP

Daneben wird auch die komplette Programmierung über das .Net-Framework gezeigt:
http://channel9.msdn.com/Blogs/SlickThought/Peer-to-Peer-Series-Part-2-Registering-Names-with-PNRP-API