Testen von Powershell Skripts in Powershell v1 wenn Version 2 oder v3 installiert sind

Posted by O.Sommer

Man kann verhältnismäßig einfach testen ob Skripte unter älteren Powershell Versionen laufen indem man den Version Parameter bei Starten der Powershell.exe verwendet

Powershell.exe –version 2.0

siehe auch: http://nathanhoneycutt.net/blog/running-powershell-2-scripts-after-installing-powershell-3/

How to use Powershell to remotely disable a networkadapter on an array of computers

Posted by O.Sommer

Today I had the challenge to disable a specifically named NIC on a larger number of Hyper-V hosts, because that card was causing issues with the cluster compatibility check when joining those Nodes to a Windows Hyper-V Cluster.
I found that disabling 64 Networkadapters on 64 Servers would take a while if you use RDP to remote into each server, so I wrote this little script to automate this using Remote Powershell, which is enabled by default if those computers are Part of a domain, or I enabled it during the deployment phase, which I can not remember right now:

# ask for Admin password
$cred = Get-Credential -Credential hypercluster\Administrator
# run through all i nodes and disable USB NIC
for ($i = 1;$i -le 64;$i++){
Echo Node$i
Enter-PSSession -ComputerName Node$i -Credential $cred
$usbnic = Get-WmiObject win32_networkadapter | where {$_.name -eq "IBM USB Remote NDIS Network Device"}
$usbnic.disable()
}
# exit remote Powershell
exit


EDIT:
This is an optimized version of the upper script and I also added a line that disables all disconnected networkcards:

# ask for Admin password
$cred = Get-Credential -Credential hypercluster\Administrator
# run through all i nodes and disable USB NIC
for ($i = 1;$i -le 64;$i++){
Echo Node$i
Enter-PSSession -ComputerName Node$i -Credential $cred
(Get-WmiObject win32_networkadapter -ComputerName Node$i | where {$_.name -eq "IBM USB Remote NDIS Network Device"}).Disable()
# use the following lien to disable all disconnected (unpluged networkcable) NICs
# (Get-WmiObject win32_networkadapter -ComputerName Node$i -Filter 'NetConnectionStatus= 7').Disable()

 

Edit2:
To shutdown an array of servers via Powershell i used this version of the script:

# ask for Admin password
$cred = Get-Credential -Credential hypercluster\Administrator
# run through all i nodes and shutdown each one
for ($i = 1;$i -le 64;$i++){
Echo Node$i
stop-Computer –ComputerName node$i –Credential $cred –force

Rechte in öffentlichen Ordnern per Powershell vergeben

Posted by o.sommer

Mit dem Powershell Befehl

get-publicfolder –recurse

kann man den Namen des Ordners bestimmen:

image

Dann kann man den gewünschten Ordner inkl. Unterordner, mittels “get-publicfolder –recurse” an den Befehl Add-PublicFolderClientPermission übergeben (pipen, | ) und die gewünschten Rechte anwenden lassen.

get-publicfolder \NameDesÖffentlichenordners -recurse | Add-PublicFolderClientPermission -AccessRights EditAllItems –User Benutzerkonto

image

Allerdings bekommt ein User auch damit nicht vollständige Rechte, einzelne Berechtigungen müssen wie in http://technet.microsoft.com/de-de/library/bb310789(EXCHG.80).aspx angegeben einzeln zugewiesen werden.

z.B.

get-publicfolder \NameDesÖffentlichenordners -recurse | Add-PublicFolderClientPermission -AccessRights DeleteAllItems –User Benutzerkonto

Auf der TechNet Site gibt es eine Liste der Berechtigungen, allerdings mit einem Tippfehler in der ersten Zeile bei ReatItems die ich hier deshalb korrigiert angebe:

  • ReadItems Der Benutzer hat das Recht, Elemente in dem angegebenen Öffentlichen Ordner zu lesen.
  • CreateItems Der Benutzer darf im angegebenen Öffentlichen Ordner Elemente erstellen und E-Mail-Nachrichten an den Öffentlichen Ordner senden, wenn dieser für E-Mails aktiviert ist.
  • EditOwnedItems Der Benutzer hat das Recht, Elemente im angegebenen Öffentlichen Ordner zu bearbeiten, deren Eigentümer er ist.
  • DeleteOwnedItems Der Benutzer hat das Recht, die Elemente im angegebenen Öffentlichen Ordner zu löschen, deren Eigentümer er ist.
  • EditAllItems Der Benutzer hat das Recht, alle Elemente in dem angegebenen Öffentlichen Ordner zu bearbeiten.
  • DeleteAllItems Der Benutzer hat das Recht, alle Elemente in dem angegebenen Öffentlichen Ordner zu löschen.
  • CreateSubfolders Der Benutzer hat das Recht, Unterordner in dem angegebenen Öffentlichen Ordner zu erstellen.
  • FolderOwner Der Benutzer ist der Eigentümer des angegebenen Öffentlichen Ordners. Der Benutzer ist zum Anzeigen und Verschieben des Öffentlichen Ordners, zum Erstellen von Unterordnern und zum Festlegen von Berechtigungen für den Ordner berechtigt. Der Benutzer darf keine Elemente lesen, bearbeiten, löschen oder erstellen.
  • FolderContact Der Benutzer ist der Kontakt für den angegebenen Öffentlichen Ordner.
  • FolderVisible Der Benutzer kann den angegebenen Öffentlichen Ordner anzeigen, kann jedoch in diesem Ordner keine Elemente lesen oder bearbeiten.

Powershell und Server-Manager Verknüpfungen in der Taskbar ausblenden

Posted by T.Brinkmann

Seit Windows 7 bzw. Server 2008R2 wurde die Taskleiste durch die Taskbar ersetzt. Die Taskbar ist ein ziemlicher Fortschritt was die Bedienbarkeit anbelangt. In jedem Fall ist die Taskbar nach der Ersteinrichtung eines Windows Server 2008R2 mit Verknüpfungen vorbelegt, unter anderem zur Powershell und zum Server-Manager. Für Admins durchaus sinnvoll.

Erhält jedoch ein Server 2008R2 die Rolle “Remotedesktop-Sessionhost” (ehemals Terminalservices) werden diese Verknüpfungen auch bei den Usern direkt nach der ersten Anmeldung zugewiesen. Klickt ein normaler RDS Benutzer auf “Server-Manager” erhält er zwar die Meldung “Zugriff verweigert” – schöner wäre es wenn die Verknüpfungen gar nicht erst erscheinen.

Warum erscheinen die Verknüpfungen? – Bei der Anmeldung eines Users an den RD-Sessionhost werden die Verknüpfungen aus dem Ordner “%Allusersprofile%\Microsoft\Start Menu\Programs\Administrative Tools” ins %APPDATA% des Users kopiert, und dann in die Taskbar eingebunden. – Sofern der User Zugriff auf die Dateien unter %Allusersprofile% hat.

Mit diesem Wissen ist es ziemlich einfach die Verknüpfungen für neue User nicht automatisch in der Taskbar stehen zu haben:

Am einfachsten per GPO, welches entweder per Sicherheitsfilterung auf die entsprechenden RDS-Hosts angewandt werden, oder aber direkt auf die den RDS-Host beinhaltenden OU greift. Den “normalen” Benutzern wird schlichtweg der Zugriff auf die Verknüpfungen entfernt. Administratoren bekommen weiterhin die Links.image

Bei der Gelegenheit kann auch noch der Punkt “Verwaltung” im Start-Menü für die User ausgeblendet werden. Das wird am einfachsten über einen Registry-Eintrag bei “HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced” eingestellt.

StartMenuAdminTools REGDWORD  = 0

Start_AdminToolsRoot REGDWORD = 0image

SBS2008 + SBS2011 Exchangepostfachgrößen anzeigen bzw. aufzeichnen

Posted by t.brinkmann

Eine Möglichkeit um das wachsen der verschiedenen Exchangepostfächer über einen längeren Zeitraum nachzuverfolgen kann ein geplanter Task sein, der z.Bsp. wöchentlich oder monatlich ausgeführt wird, und dabei alle Postfächer incl. deren Größe in eine Textdatei schreibt. Folgende Schritte sind dazu notwendig:

Eine Datei %windir%\Mailboxsize.ps1 erstellen. Folgender Inhalt:

1.) $Date = Get-Date -format yyyy-M-d
2.) $Logfile = "MailboxSize_$Date.txt"
3.) Get-MailboxStatistics –server <SERVERNAME SBS-SERVER>| sort-object TotalItemsize | FT DisplayName, @{label="Postfachgröße(MB)"; expression={$_.TotalItemSize.Value.ToMB()}} > $Logfile

<SERVERNAME SBS-SERVER> muss natürlich durch den Computernamen des SBS-Servers ersetzt werden. Der Pfad für $Logfile kann ebenfalls angepasst werden, z.Bsp. $Logfile = “C:\Logs\Mailboxsize_$Date.txt”. Wenn die reine Anzeige der Postfachgröße ausreicht, also ohne Logdatei, können Zeile 1 + Zeile 2 + “> $Logfile” entfernt werden.

Nun  wird noch eine Batchdatei benötigt, welche das oben erstellte Powershellskript startet – Für diese Batchdatei kann später auch eine Aufgabe in der Aufgabenplanungbibliothek erstellt werden.

1.) @echo off
2.) title Postfachvolumen in MB

Für SBS2008 - 3.) powershell.exe -PSConsoleFile "C:\Program Files\Microsoft\Exchange Server\bin\exshell.psc1" –non-interactive -command ". '%windir%\MailboxSize.ps1'"


Für SBS2011 – 3.) powershell.exe –non-interactive -command ". 'C:\Program Files\Microsoft\Exchange Server\V14\bin\RemoteExchange.ps1'; Connect-ExchangeServer –auto ; %windir%\MailboxSize.ps1"

4.) exit

Wenn die Ausgabe einer Logdatei nicht gewünscht ist (also Zeile 1 + Zeile 2 + “> $Logfile” in dem Skript oben entfernt wurden), dann muss “-non-interactive” gegen “-noexit” ersetzt werden. Ggfs. die Skripte “Als Administrator ausführen” auswählen.