Blog

Hallo zusammen,

in dem heutigen Blogeintrag möchte ich euch zeigen wie Ihr Debian basierende Software-Distributionen, dazu gehören Debian 8, Linux Mint und Ubuntu an das Microsoft Active Directory 2012 anbinden könnt.

In der Vergangenheit habe ich bereits ein paar Blogeinträge zu dem Thema gemacht:

Ubuntu 11.10/12.04 Desktop in das Microsoft Active Directory einbinden
Debian 7 an das Active Directory anbinden

Im großen und Ganzen hat sich nicht viel verändert, außer das wir diesmal auf der Microsoft Seite nichts mehr verändern und hinzufügen müssen.
Unter Active Directory 2008 R2 mussten wir noch die „Identity Management für UNIX“ Features installieren und die Gruppenrichtlinien anpassen, dies fällt unter 2012 R2 weg, da Microsoft das „Identity Management für UNIX“ Feature nicht mehr mit an Board hat.

Alles was wir auf der Linux Seite benötigen ist NTP, Kerberos 5, Samba und Winbind und ein paar Tools für das testen der Verbindung.

Ich starte hier mit der Linux Mint 17.1 Distribution.

1

 

 

 

 

 
Nachdem das Betriebssystem installiert wurde, bringen wir das System mit update/upgrade auf den neusten Stand.

apt-get update && apt-get upgrade

Mit folgender Kommandozeile installieren wir uns alle passenden Pakete dir wir für die Verbindung zu Active Directory benötigen.

NTP für die Zeitsynchronisation
Kerberos 5 für das Kerberos Ticket und die ADS Authentifizierung
Winbind für die NT-Kontenverwaltung
Samba um der Domain beitreten zu können
LDAP Utilites für einen LDAP Test gegen das Active Directory

apt-get install ntp ntpdate krb5-user libpam-krb5 krb5-doc winbind libnss-winbind libpam-winbind samba smbclient ldap-utils

Wenn alle Paket sauber installiert wurden, beginnen wir auch schon mit der Konfiguration.

Im ersten Schritt passe ich die /etc/hosts an

nano /etc/hosts
127.0.0.1 localhost.localdomain localhost
192.168.178.105 mint01.htdom.local mint01
192.168.178.101 ads01.htdom.local ads01 htdom.local

1_1

 

 

 

 

 
#Kerberos 5 konfigurieren

cp /etc/krb5.{conf,old} && rm /etc/krb5.conf
nano /etc/krb5.conf
[logging]
        default = FILE:/var/log/krb5/krb5.log
        kdc = FILE:/var/log/krb5/krb5kdc.log
        admin_server = FILE:/var/log/krb5/kadmind.log

[libdefaults]
        default_realm = HTDOM.LOCAL
        clockskew = 300
        kdc_timesync = 1
        ccache_type = 4
        forwardable = true
        proxiable = true

[realms]
        HTDOM.LOCAL = {
                kdc = ads01.htdom.local
                default_domain = htdom.local
                admin_server = ads01.htdom.local
        }

[domain_realm]
        .htdom.local = HTDOM.LOCAL
        htdom.local = HTDOM.LOCAL

# Samba konfigurieren

cp /etc/samba/smb.{conf,old} && rm /etc/samba/smb.conf
nano /etc/samba/smb.conf
[global]
security = ads
realm = HTDOM.LOCAL
password server = 192.168.178.101
workgroup = HTDOM
netbios name = MINT01
server string = %h server
load printers = no
local master = no
domain master = no
preferred master = no
dns proxy = no
winbind uid = 10000-20000
winbind gid = 10000-20000
winbind use default domain = yes
interfaces = eth0 lo
syslog = 0
log file = /var/log/samba/log.%m
max log size = 1000
panic action = /usr/share/samba/panic-action %d
invalid users = root
template homedir = /home/%D/%U
template shell = /bin/bash
winbind offline logon = yes
winbind refresh tickets = yes
/etc/init.d/samba restart

Nach dem diese beiden Dateien konfiguriert wurden, starten wir den Client neu.

Danch überprüfen wir ob wir zur Domain eine Verbindung herstellen können

kinit administrator@HTDOM.LOCAL (Passwort)
klist

2

 

 

 

 

ldapsearch -h 192.168.178.101 -b DC=htdom,DC=local -D administrator@htdom.local -W -x (Passwort)

3

 

 

 

 

 
Wenn das der Fall ist, können wir der Domain beitreten

net ads join -U Administrator (Passwort)

Nach erfolgreichen Domain Join sollte der Computer im AD unter Computers auftauchen

4

 

 

 

 

 
Nun können wir noch folgende Abfragen testen.

wbinfo -u (Gibt eine Lister alle Domain Benutzer aus)
wbinfo -g (Gibt eine Lister alle Domain Gruppen aus)

In der nsswitch.conf nehmen wir die Konfiguration der Authentication vor

# nsswitch konfigurieren

cp /etc/nsswitch.{conf,old} && rm /etc/nsswitch.conf
nano /etc/nsswitch.conf
# Example configuration of GNU Name Service Switch functionality.
 
passwd:         compat winbind
group:          compat winbind
shadow:         compat
 
hosts:          files dns wins
networks:       files
 
protocols:      db files
services:       db files
ethers:         db files
rpc:            db files
 
netgroup:       nis

Und in der common-session legen wir fest, das ein Homelaufwerk automatisch angelegt wird, wenn sich ein neuer Domain Benutzer am Linux Client anmeldet.

# common-session konfigurieren für die Automatische Home Verzeichnis anlage

cp /etc/pam.d/common-session /etc/pam.d/common-session.old
nano /etc/pam.d/common-session
session required pam_mkhomedir.so umask=0022 skel=/etc/skel

5

 

 

 

 

 
6

 

 

 

 

 
Das war es auch schon, nun kann ich mich als Domänenbenutzer am Linux Client anmelden.

Viel Spaß
Gruß Helmut Thurnhofer

Seit der Version Windows 8/8.1 hat Microsoft zwei sehr gute Features eingebaut die bei Problemen von Betriebssystemfehlern helfen können.
Wenn man das Windows Standard Refresh Image nutzen möchte, würden bei einem Refresh alle Programme verloren gehen, die bis zu diesen Zeitpunkt installiert wurden. Die Persönlichen Daten des Benutzers bleiben jedoch erhalten.

Bild1

 

 

 

 

 
Gerade am Anfang beim Testen von Windows 10 Preview und Office 2016 Preview, kann es durchaus vorkommen das man sich das komplette System verkonfiguriert und es gibt nichts Zeitaufwändigeres wie das Ganze neu installieren zu müssen.

Daher zeige ich euch heute wie man sich sein eigenes Refresh Image erstellen kann, hier muss dann nichts mehr neu installiert werden. Einfach Refresh fertig. 🙂

Wir nutzen das Windows eigene Kommandozeilentool recimg

Mit diesen sogenannten Custom Refresh Image bleiben alle Programme und Benutzerdaten erhalten, das einzige was verloren geht sind die Persönlichen Einstellungen, wie z.B. Desktop und Programm Einstellungen.

Vor dem Refresh:
Bild2

 

 

 

 

 
Wir öffnen für diesen Vorgang eine CMD Konsole als Administrator und geben folgenden Befehl für die Erstellung des Costum Refresh Image ein.

"recimg /createimage C:\RefreshImage" oder "recimg /createimage C:\RefreshImage\Ordner1(Ordner2)"

Hier ein bisschen Geduld mitbringen, es kann bis zu 10 Minuten dauern bevor der Prozess überhaupt das Image beginnt zu schreibt.

Bild3

 

 

 

 

 
Nach dem das Refresh Image erstellt wurde kontrolliert man mit folgenden Befehl welche Refresh Image aktiv ist.

Der Standardname CustomRefresh.wim sollte auf keinen Fall umbenannt werden, ansonsten fällt Microsoft auf das eigene Standard Image zurück und alle Programme die installiert wurden sind weg!

recimg /showcurrent

\\?\GLOBALROOT\device\harddisk0\partition2\RefreshImage
RecImg: Vorgang erfolgreich abgeschlossen

Wenn man mehrer Refresh Images nutzen möchte, kann man mit folgenden Befehl das passende Refresh Image aktivieren.

recimg /setcurrent C:\RefreshImage\Ordner1

oder bei einem zweitem 

recimg /setcurrent C:\RefreshImage\Ordner2

Wenn jetzt irgendwas nicht mehr sauber läuft, kann man jederzeit sein Betriebssystem refreshen.

Bild5

 

 

 

 

 
Dazu klickt man mit der Rechten Maustaste unten links auf das Windows Icon und wählt den Punkt Suchen/Windows Update aus.

Bild1

 

 

 

 

 
Klicken links in der Navigation aus Wiederherstellung und auf den Button „Los geht’s“

Bild6

 

 

 

 

 
In der Übersicht kann man nun sehen was im Anschluss alles passiert, nur die letzten beiden Punkte passen nicht mehr, da wir ein eigenes Refresh Image erstellt haben und somit die installierten Programme erhalten bleiben.

Bild8

 

 

 

 

 
Der Computer wird neu gestartet und der refresh wird durchgeführt.

Nach dem Refresh:
Bild9

 

 

 

 

 
Nach dem Refresh erstrahlt Windows wieder im neuem Gewand mit all meinen installierten Programmen und Eigenen Dateien. Die persönlichen Konfiguration meiner Desktop Umgebung sind verloren gegangen aber ich muss nicht Aufwendig wieder alles neu installieren.
Auf meiner C:\ Partition gibt es nach dem Refresh zwei unschöne Ordner, diese lasse ich vom System entfernen.

Bild10

 

 

 

 

 
Eigenschaften des Datenträgers C:\ –> Bereinigen –> Systemdateien bereinigen –> Vorherige Windowsinstallation(en).

Viel Spaß beim testen von Windows 10 Preview und Office 2016 Preview.

Viele Grüße
Helmut Thurnhofer

MDT2013_WDS2012_Logo

 

 

 

 

 

 

In diesem Howto möchte ich euch zeigen, wie man das Windows 8.1 Master Image vorbereitet, um es im späteren Verlauf über das Netzwerk zu verteilen. Dieser Schritt ist mitunter der schwierigste und zugleich auch der wichtigste im Deployment Prozess.

Howto Serie wird folgende Punkte abdecken:

 

Howto Download –> Windows 8.1 Master Image Erstellung und Verteilung mit Microsoft Deployment Toolkit 2013 – Teil 2

 

Viel Spaß damit

Gruß
Helmut Thurnhofer

MDT2013_WDS2012_Logo

 

 

 

 

 

 

In diesem Howto möchte ich euch zeigen, wie man das Microsoft Deployment Toolkit 2013 und den Windows Deployment Services 2012 nutzt, um Windows 8.1 bzw. Windows 10 Preview im Netzwerk zu verteilen. Es sind einige Vorkenntnisse in der Software Verteilung bzw. Windows Image Erstellung/Software Scriptierung erforderlich. Die Tools und Begriffe wie sysprep, dism, imagex, WinPE Lite Touch (LTI), Zero Touch (ZTI), Slipstreaming und vieles mehr, sollten also keine Fremdwörter für euch sein.

http://de.wikipedia.org/wiki/Softwareverteilung

Dieses Howto kann man auch als Anregung für kleinere Unternehmen einsetzen. Für eine Anzahl von ca. 15 – 20 Client Computer ist die Art und Weise der Softwareverteilung wie ich Sie hier beschreibe in Ordnung, ab 25 Client Computer sollte man aber in Erwägung ziehen, ob es nicht sinnvoller ist, eine geeignete Softwareverteilung dafür einzusetzen. Besonders wenn man den PC Lifecycle im Auge behalten möchte. Anbei drei gute Beispiele, mit denen ich sehr gute Erfahrung sammeln durfte:

Hier ein paar alte Blogeinträge, die sich um das Thema rund um die Softwareverteilung beschäftigen:

 Server Vorbereitungen

  • Server 2012 R2, Active Directory und Root CA – (ads01.htdom.local)
  • Server 2012 R2, MDT 2013, WDS 2012, DHCP, SQL Express 2012 – (mdt01.htdom.local)
  • Auf dem MDT Server sollte die Firewall deaktiviert werden, für die spätere PXE Phase.
  • WSUS Server ist optional, da ich derzeit keine Windows 10 Updates verteilen kann.
  • Windows ADK 10
  • Windows ADK 8.1
  • Microsoft Deployment Toolkit (MDT) 2013

Howto Serie wird folgende Punkte abdecken:

 

Hier kommt ihr wieder zum Howto –> Softwareverteilung mit MDT 2013 und WDS 2012

 

Viel Spaß damit

Gruß
Helmut Thurnhofer

Hier in diesen Howto möchte ich euch zeigen, wie man die Zertifikatssperrliste(n) im Active Directory veröffentlicht. Das ganze wurde wieder in einer Virtuellen Umgebung mit Oracle – VirtualBox nachgestellt.

Die erste Frage die sich stellt, was ist eigentliche eine Zertifikatssperrliste?

  • Eine Zertifikatsperrliste (certificate revocation list, CRL) ist eine Liste, die die Ungültigkeit von Zertifikaten beschreibt. Sie ermöglicht es, festzustellen, ob ein Zertifikat gesperrt oder widerrufen wurde und warum.
  • Zertifikate werden gesperrt oder widerrufen, wenn deren zugehöriger Schlüssel z. B. nicht mehr sicher ist, weil sie in die falsche Hände geraten sind oder kompromittiert wurden – in solchen Fällen muss das Zertifikat noch vor dem eigentlichen Ablaufdatum gesperrt werden.

Hier geht es wieder zum Howto – Zertifikatssperrliste im Active Directory veröffentlichen

Viel Spaß damit

Gruß Helmut Thurnhofer

Hallo zusammen,

in dem heutigen Post zeige ich euch, wie Ihr mit Windows Boardmittel Remotecomputer administrieren könnt.

Folgende Zusatztools kommen in dem Skript zum Einsatz:
PsTools von Windows Sysinternals –> http://technet.microsoft.com/de-de/sysinternals/bb896649.aspx
FreeCommander XE Portable –> http://www.freecommander.com/de/fc_downl_de.htm

Wenn man sich Tag täglich, mehrmals auf entfernte Computer schalten muss, um Administrative Aufgaben zu erledigen. Versucht man sich die Arbeit so einfach wie möglich zu machen.
Persönlich wird es sehr nervig, wenn man am Tag bis zu 100 Mal Domänen Admin + Passwort eingeben muss.

Das folgende Skript erleichtert mir hier sehr viel Tipparbeit.

Die PsTools lade ich mir aus dem Internet und kopiere alle *.exe Dateien in mein C:\Windows\System32 Verzeichnis.
Den FreeCommander XE Portable lade ich mir ebenfalls aus dem Internet und lege diesen zu meinem Batch Skript.
Für alle meine Batch und Powershell Skripte lege ich mir unter D:\ einen passenden Ordner an.

ScriptOrdner

 

 

 

 

 

So sieht es aus, wenn man die Batch Datei Remote-Verwaltung.cmd das erste Mal startet.

Remoteverwaltung

 

 

 

 

 

Folgendes sollte im Batch Skript angepasst werden:

REM ------------------------------------------------------------
:: Variablen definieren (Diese Varaiablen sollten angepasst werden)
REM ------------------------------------------------------------
set NetShare=Z:
set DomainAdminUser=DomainAdminUser
set Path "D:\Scripts\Remoteverwaltung\FreeCommander;%PATH%"
REM ------------------------------------------------------------

Für die Remote C$ Freigabe habe ich mir einen Netzlaufwerksbuchstaben als Variable definiert.
Mein Domänen Admin Konto wird ebenfalls als Variable definiert.
Der Skriptpfad für FreeCommander wird in die Variable %PATH% hinzugefügt.

Warum nutze ich den FreeCommander Portable und nicht den Windows eigenen Explorer, habe sehr viel ausprobiert bei der Skripterstellung. Leider ist es nicht möglich die explorer.exe über das Kontextmenü „Als anderer Benutzer ausführen“ oder auch über RunAs Befehlen zu starten. Sobald man als Normaler Domänenbenutzer am Computer angemeldet ist, lässt sich die explorer.exe nicht in einem Domänen Administrator Kontext starten. Das Problem hier, ist die (UAC) User Access Control von Windows 7/8. Leider habe ich noch keinen Weg gefunden wie man das umgeht, außer natürlich man meldet sich als Domänenadministrator am Computer an.

Um nun mit dem Skript arbeiten zu können, startet man die Batch Datei als Domänen Administrator, dazu klickt man mit gedrückter SHIFT Taste + rechter Maustaste auf die CMD Datei und wählt im Kontextmenü „Als anderer Benutzer ausführen“

Nun bekommt man folgenden Prompt angezeigt, bitte hier Remote Computername oder IP-Adresse eingeben.
Im zweiten Schritt wird man nach dem Domänen Administrator Kennwort gefragt um das Netzlaufwerk zu verbinden.
Zusätzlich wird noch eine Textdatei angelegt, in dem der Remote Computername eingetragen wird, dieses benötigt man, wenn man eine weitere CMD Konsole öffnen will und die Variable %RemoteHost% benötigt.

BatchStart

 

 

 

 

 

REM ------------------------------------------------------------
:: Eingabe des zu verwaltenden Computers
REM ------------------------------------------------------------
echo =====================================================================================================
echo Bitte Remote Computername oder IP-Adresse eingeben um das Skript starten zu koennen (z.B. localhost)
echo =====================================================================================================
set /p RemoteHost=Computername oder IP-Adresse eingeben:
echo RemoteHost=%RemoteHost% > %ScriptPath%\RemoteHostVar.txt

REM ------------------------------------------------------------
:: C$ Freigabe vom Remote Computer verbinden
REM ------------------------------------------------------------
if exist %NetShare% net use /delete %NetShare% /yes
net use %NetShare% "\\%RemoteHost%\c$" /persistent:no /user:%USERDOMAIN%\%DomainAdminUser%

Die wichtigste Sprungmarke ist die :START, die Batch Datei ist so geschrieben, dass sie in einen Loop steckt, solange bis man sie mit Exit verlässt.
Mit title und mode wird die CMD Konsole angepasst (mode 80 ist die Breite und 50 ist die Höhe der Konsole)

 

:START
title Computer Remoteverwaltung mit %RemoteHost%
mode 80,50
cls

Bei manchen Befehlen wurde ein Pause eingebaut, diese Pause verlässt man mit drücken einer Taste.

BatchPause

 

 

 

 

 

Bei Befehl 9 und 12 gibt es noch eine Besonderheit. Um auf die Remote Registry vom Remote Computer zugreifen zu können, muss auf dem entfernten System der Dienst RemoteRegistry gestartet sein,
dies passiert mit dem Befehl sc \\%RemoteHost% start RemoteRegistry und zum zweiten kann man dem Regedit Editor keinen Computernamen mit geben. Die muss leider manuell passieren.

Damit der Befehl sc funktioniert, muss auf dem entfernten System die Firewall Ports freigeschaltet sein — RPC (Ports 137/138/139/445) oder man regelt das Ganze über Gruppenrichtlinien –> http://skatterbrainz.blogspot.de/2009/08/enabling-windows-7-remote-management.html

Bei Befehl 12 wird ein neues CMD Konsolen Fenster geöffnet, in dem die LogIn ID des angemeldeten Benutzers angezeigt wird, wenn man nun den Benutzer vom Remotesystem abmelden möchte, muss man noch manuell logoff [ID] eingeben und mit Enter bestätigen.

Alle anderen Befehle im Skript sind hoffentlich selbst erklärend, sollte dem nicht so sein, könnt ihr jederzeit einen Kommentar hinterlassen.

Hier das Skript

@echo off
cls
 
REM ------------------------------------------------------------
REM Name: Computer Remoteverwaltung
REM Autor: Helmut Thurnhofer
REM Datum: 28. Juli 2014
REM ------------------------------------------------------------
REM Zusätzliche Befehle für die Computer Remoteverwaltung
REM ------------------------------------------------------------
REM WMIMgmt = start mmc C:\Windows\System32\WmiMgmt.msc /computer:localhost
REM Aufganbenplanung start mmc C:\Windows\System32\taskschd.msc /computer:localhost
REM Perfmon = start mmc C:\Windows\System32\perfmon.msc /computer:localhost
REM Freigegebene Ordner = start mmc C:\Windows\System32\fsmgmt.msc /computer:localhost
REM ------------------------------------------------------------
REM Verwendete Administrative Tools
REM ------------------------------------------------------------
REM PsTools von Windows Sysinternals --> http://technet.microsoft.com/de-de/sysinternals/bb896649.aspx
REM FreeCommander XE Portable --> http://www.freecommander.com/de/fc_downl_de.htm
REM ------------------------------------------------------------


REM ------------------------------------------------------------
:: Variablen definieren (Diese Varaiablen sollten angepasst werden)
REM ------------------------------------------------------------
set NetShare=Z:
set DomainAdminUser=DomainAdminUser
set PATH "D:\Scripts\Remoteverwaltung\FreeCommander;%PATH%"
REM ------------------------------------------------------------


REM ------------------------------------------------------------
:: Eingabe des zu verwaltenden Computers
REM ------------------------------------------------------------
echo ====================================================================================================
echo Bitte Remote Computername oder IP-Adresse eingeben um das Skript starten zu koennen (z.B. localhost)
echo ====================================================================================================
set /p RemoteHost=Computername oder IP-Adresse eingeben:
echo RemoteHost=%RemoteHost% > D:\Scripts\Remoteverwaltung\RemoteHostVar.txt


REM ------------------------------------------------------------
:: C$ Freigabe vom Remote Computer verbinden
REM ------------------------------------------------------------
if exist %NetShare% net use /delete %NetShare% /yes
net use %NetShare% "\\%RemoteHost%\c$" /persistent:no /user:%USERDOMAIN%\%DomainAdminUser%


:START
title Computer Remoteverwaltung mit %RemoteHost%
mode 80,50
cls


REM ------------------------------------------------------------
:: Anzeigetext in der Batchdatei definieren
REM ------------------------------------------------------------
echo.
echo ============================================================
echo Derzeit verbunden mit %RemoteHost%
echo ============================================================
echo.
echo 1) Remote Computer wechseln
echo 2) Ping %RemoteHost%
echo 3) nslookup %RemoteHost%
echo 4) FreeCommander (Explorer) starten
echo 5) Dienste MMC von %RemoteHost% starten
echo 6) Computerverwaltung MMC von %RemoteHost% starten
echo 7) Ereignisanzeige MMC von %RemoteHost% starten
echo 8) Prozesse von %RemoteHost% anzeigen
echo 9) Registry Editor starten
echo 10) neue CMD Konsole starten
echo 11) Wer ist an %RemoteHost% angemeldet
echo 12) Benutzer am %RemoteHost%  abmelden
echo 13) Computer %RemoteHost% neu starten
echo 14) Remoteunterstuetzung starten
echo 15) Exit
echo.
echo ============================================================


REM ------------------------------------------------------------
:: Auswahl wird in die Variable %choice% geschrieben
REM ------------------------------------------------------------
set /p choice=Auswahl eingeben (1-16):
 
if "%choice%"=="1" goto CHANGECOMPUTER
if "%choice%"=="2" goto PING
if "%choice%"=="3" goto NSLOOKUP
if "%choice%"=="4" goto FREECOMMANDER
if "%choice%"=="5" goto SERVICES
if "%choice%"=="6" goto COMPMGMT
if "%choice%"=="7" goto EVENTMGMT
if "%choice%"=="8" goto PROCESS
if "%choice%"=="9" goto REGEDIT
if "%choice%"=="10" goto OPENCMD
if "%choice%"=="11" goto LOGGEDON
if "%choice%"=="12" goto LOGOFF
if "%choice%"=="13" goto REBOOT
if "%choice%"=="14" goto REMOTEHELP
if "%choice%"=="15" net use z: /delete %NetShare% /yes && exit


REM ===================================================
:CHANGECOMPUTER
set /p RemoteHost=Bitte neuen Computername oder IP-Adresse eingeben:
echo RemoteHost=%RemoteHost% > D:\Scripts\Remoteverwaltung\RemoteHostVar.txt

if exist %NetShare% net use /delete %NetShare% /yes
net use %NetShare% "\\%RemoteHost%\c$" /persistent:no /user:%USERDOMAIN%\%DomainAdminUser%

goto START
REM ===================================================


REM =================================================== 
:PING
ping -n 2 -4 %RemoteHost%
 
echo.
echo Bitte Taste druecken um zurueck zum Auswahlmenue zu kommen
pause >nul
goto START
REM ===================================================


REM =================================================== 
:NSLOOKUP
nslookup %RemoteHost%
 
echo.
echo Bitte Taste druecken um zurueck zum Auswahlmenue zu kommen
pause >nul
goto START
REM ===================================================


REM ===================================================
:FREECOMMANDER
FreeCommander.exe

goto START
REM ===================================================


REM ===================================================
:SERVICES
start mmc "%SystemRoot%\System32\services.msc" /computer:%RemoteHost% 

goto START
REM ===================================================


REM ===================================================
:COMPMGMT
start mmc "%SystemRoot%\System32\compmgmt.msc" /computer:%RemoteHost%

goto START
REM ===================================================


REM ===================================================
:EVENTMGMT
start mmc "%SystemRoot%\System32\eventvwr.msc" /computer:%RemoteHost%

goto START
REM ===================================================


REM ===================================================
:PROCESS
sc \\%RemoteHost% start RemoteRegistry
pslist -t -s -r 5 \\%RemoteHost%
 
echo.
echo Bitte Taste druecken um zurueck zum Auswahlmenue zu kommen
pause >nul
goto START
REM ===================================================


REM ===================================================
:REGEDIT
sc \\%RemoteHost% start RemoteRegistry
%SystemRoot%\System32\regedt32.exe && mshta "javascript:var sh=new ActiveXObject( 'WScript.Shell' ); sh.Popup('Bitte ueber [Datei] --> [Mit Netzwerkregistrierung verbinden], den Computernamen eingeben. Fenster schliesst automatisch nach 10 Sekunden.',10, 'Remote Registry', 64 );close()"

goto START
REM ===================================================


REM ===================================================
:OPENCMD
start /i %COMSPEC% /separate /k (for /f "tokens=*" %%i in (D:\Scripts\Remoteverwaltung\RemoteHostVar.txt) do set "%%i")2>nul

goto START
REM ===================================================


REM ===================================================
:LOGGEDON
sc \\%RemoteHost% start RemoteRegistry
psloggedon \\%RemoteHost%
 
echo.
echo Bitte Taste druecken um zurueck zum Auswahlmenue zu kommen
pause >nul
goto START
REM ===================================================


REM ===================================================
:LOGOFF
sc \\%RemoteHost% start RemoteRegistry
start /i %COMSPEC% /seperate /k psexec \\%RemoteHost% query session && mshta "javascript:var sh=new ActiveXObject( 'WScript.Shell' ); sh.Popup('Um den Remote User abzumelden, bitte (logoff [ID]) eingeben und mit [Enter] bestätigen. Fenster schliesst automatisch nach 10 Sekunden.',10, 'Remote User Logoff', 64 );close()"

 
echo.
echo Bitte Taste druecken um zurueck zum Auswahlmenue zu kommen
pause >nul
goto START
REM ===================================================


REM =================================================== 
:REBOOT
sc \\%RemoteHost% start RemoteRegistry
psshutdown -r -t 5 \\%RemoteHost%
 
echo.
echo Bitte Taste druecken um zurueck zum Auswahlmenue zu kommen
pause >nul
goto START
REM ===================================================


REM =================================================== 
:REMOTEHELP
msra.exe /offerRA %RemoteHost%
 
echo.
echo Bitte Taste druecken um zurueck zum Auswahlmenue zu kommen
pause >nul
goto START
REM ===================================================

Download –> Remote-Verwaltung.zip

Also viel Spaß mit dem Skript.

Gruß Helmut

Hallo zusammen,

in dem heutigen Howto zeige ich euch, wie Ihr euer Windows 8.1 Standard Image mit allen Microsoft Security Updates patchen könnt.

Um an alle Security Patches von Microsoft ranzukommen, gibt es zwei Möglichkeiten. Entweder man nutzt das Tool WSUS Offline Update –> http://download.wsusoffline.net/wsusoffline931.zip

wsusoffline

 

 

 

 

 

oder lädt sich von der Webseite http://winfuture.de/UpdatePack das passende UpdatePack herunter und extrahiert dieses in einen Ordner seiner Wahl.

winfuture

 

 

 

 

 

Bei den WSUS Offline Updates hat man immer den aktuellsten Stand. Bei WinFuture werden die Updates nur nach jedem Microsoft PatchDay (2. Dienstag im Monat) aktualisiert.
Was im Großen und Ganzen aber nicht wirklich eine Rolle spielt. Der Unterschied besteht maximal in zwei bis drei Updates, die bei WinFuture fehlen.

Auf meinem Windows 8.1 Test Rechner lege ich mir eine Ordnerstruktur an, die ungefähr so aussieht:

Windows_8_ISO
– Windows_8_Images (entweder ISO entpacken oder von Windows 8.1 DVD kopieren)
– Mount (Mountpoint für das Windows 8.1 Standard Image)
– Updates (alle extrahierten *.msu (WinFuture) oder *.msu/*.cab (WSUS Offline) Dateien kopieren)

OrdnerStruktur

 

 

 

 

 

Nun startet man eine CMD Konsole als Administrator und mounted das Windows 8.1 Standard Image in den Ordner „…\Mount“

dism /Mount-Image /ImageFile:"…\Setup\source\install.wim" /index:1 /MountDir:"…\Mount"

ImageMount

 

 

 

 

 

Im nächsten Schritt fügen wir alle Updates dem Windows 8.1 Standard Offline Image hinzu

dism /Image:"…\Mount" /Add-Package /PackagePath:"…\Updates"

ImageUpdate

 

 

 

 

 

Bei den WSUS Offline Updates hatte ich bei der Integration ein paar Fehler, diese traten bei WinFuture nicht auf.
Nach erfolgreichen Updates, speichern wir das Windows 8.1 Standard Offline Image

dism /Unmount-Wim /MountDir:”…\Mount” /commit

Mit dem Schalter /commit werden alle Änderungen im Image gespeichert
Mit dem Schalter /discard werden alle Änderungen für das Image verworfen

ImageSave

 

 

 

 

 

Wenn man das Ganze wieder auf eine DVD brennen möchte, muss eine neue ISO Datei erstellt werden.

Dazu gibt es wieder zwei Möglichkeiten, obwohl ich Möglichkeit Zwei nicht getestet habe.

Erste Möglichkeit ist das Tool „oscdimg.exe“, welches im Windows ADK zu finden ist.

Windows Assessment and Deployment Kit (ADK) für Windows 8 –> http://www.microsoft.com/de-de/download/details.aspx?id=30652

oscdimg -lWindows8_Ent_x64 -m -u2 -b"D:\Windows_8_ISO\Image\boot\etfsboot.com" "D:\Windows_8_ISO\Image" "D:\Windows8_Ent_x64.iso"

Oder folgender Artikel im Internet „Bootfähige Windows (7)8 ISO erzeugen“ –> http://huebauer4.bplaced.net/

Nachdem die ISO Datei erstellt wurde und wir einen PC damit neu installiert haben, kann man folgenden Unterschied feststellen.

Diese Anleitung funktioniert mit Windows 7/8/8.1 Images wie auch mit den Serverbetriebssystemen Windows Server 2008/2008 R2/2012/2012 R2 Images.

UpdatesVorher

 

 

 

 

 

UpdatesNachher

 

 

 

 

 

Viel Spaß damit

Gruß Helmut

Hallo zusammen,

in dem heutigen Howto zeige ich euch, wie Ihr SQLite mit Powershell nutzen könnt.
Um euch eine Alternative zu XML-Dateien aus meinem letzten Post vorzustellen, nutzen wir diesmal SQLite Datenbanken.

Für die XML-Dateien hatte ich mir eine Serverstruktur aufgebaut, die ich später abfragen konnte. Die gleiche Servestruktur werde ich nun in einer SQLite Datenbank abbilden, die wir wiederum später mit Powershell abfragen können.

Arbeitsdateien für das Howto

Um grundlegend mit SQLite Datenbanken zu arbeiten und die Datenbankstruktur anlegen, verwalten und ansehen zu können, benötigt man ein Management Tool.
Hierzu kann man folgende Software/Tools nutzen.

SQLite Database Browser
SQLite_Database_Browser

 

 

 

 

 
SQLite Manager (Firefox AddOn)
SQLite_Manager

 

 

 

 

 
Weitere Management Tools findet ihr bei SQLite.org –> http://www.sqlite.org/cvstrac/wiki?p=ManagementTools

Um überhaupt SQLite Datenbanken mit Powershell abfragen zu können, benötigt man die System.Data.SQLite Runtime bzw. die System.Data.SQLite.dll. Das passende Softwarepaket findet man auf folgender Webseite.

http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki
http://system.data.sqlite.org/downloads/1.0.92.0/sqlite-netFx451-setup-bundle-x64-2013-1.0.92.0.exe

Nach der Installation findet man lokal folgende Struktur vor. Mit dieser Struktur werden wir im nachfolgenden Howto arbeiten.
FileStruktur

 

 

 

 

 

 
Um die Datenbank schnell mit Informationen füllen zu können, habe ich euch ein Excelsheet mit ein paar Demo Einträgen vorbereitet, dazu das passende VB Script für den Export in eine TXT Datei.
Nach dem Export der TXT Datei müssen noch ein paar Anpassungen gemacht werden, damit der Import sauber funktioniert.
Export_Excel

 

 

 

 

 
Export_Import_Datei

 

 

 

 

 
Datenbank_vorbereiten

 

 

 

 

 
Datenbank_vorbereiten2

 

 

 

 

 
Nachdem die Datenbank vorbereitet ist, können wir uns den Powershellabfragen widmen.

Auch ich habe mich vorab im Internet informiert, wie so eine Abfrage funktioniert und habe drei gute Ansätze gefunden, die ich euch in dem Post vorstelle.

Erste Beispiel:
Gefunden bei http://thescriptingfrog.blogspot.de/2012/08/how-to-query-sqlite-database-with.html

### Pfad zur System.Data.SQLite.dll Datei
[string]$sqlite_library_path = "C:\Program Files\System.Data.SQLite\2013\bin\System.Data.SQLite.dll"

### Pfad zur SQLite Datenbank
[string]$db_data_source = "D:\PowershellScripte\Powershell_SQLite\Serverliste2.sqlite"

### SQL Query, hier muss man entscheiden ob man bereits hier die Abfrage auf die Datenbank eingrenzt oder später im Output mit Powershell
[string]$db_query = "SELECT * FROM Servername"
oder
[string]$db_query = "SELECT * FROM Servername WHERE Hostname Like '%ADS%'"
oder
[string]$db_query = "SELECT * FROM Servername WHERE Memory <= '4096 MB'"

### http://blog.lab49.com/archives/4844
### Assembly laden, um mit SQLLite arbeiten zu können, ohne diesen Befehl würde die Abfrage nicht funktionieren.
[void][System.Reflection.Assembly]::LoadFrom($sqlite_library_path)

### Dieser Befehl stellt einen speicherinternen Datencache dar
$db_dataset = New-Object System.Data.DataSet

### Füllt die db_data_adapter Variable mit der Information der Datenbank
$db_data_adapter = New-Object System.Data.SQLite.SQLiteDataAdapter($db_query,"Data Source=$db_data_source")
[void]$db_data_adapter.Fill($db_dataset)

### Mit folgenden Befehl wird der Input der Datenbank ausgegeben
$db_dataset.Tables[0]
oder
$db_dataset.Tables[0] | Sort-Object FQDN,IPAddress,OS | Format-Table FQDN,IPAddress,OS -AutoSize

Powershell_Abfrage_1

 

 

 

 

 
Zweite Beispiel:
Gefunden bei http://poshcode.org/2879

In diesem Beispiel werden zwei Funktionen benutzt, dieses Powershell Skript speichert man sich als z.B. MySQLite.ps1 ab und lädt es sich als Modul nach.

### Import des Powershell Skriptes, nach dem Import stehen die Funktionen querySQLite und writeSQLite für Abfragen zur Verfügung
Import-Module .\Powershell_SQLite\MySQLite.ps1

### SQL Query, auch hier muss man entscheiden, ob man bereits hier die Abfrage auf die Datenbank eingrenzt oder später im Output mit Powershell
$readQuery = "SELECT * FROM Servername"
##$readQuery = "SELECT * FROM Servername WHERE Hostname Like '%ADS%'"
##$readQuery = "SELECT * FROM Servername WHERE Memory <= '4096 MB'"

$dataArray = $SQLite.querySQLite($readQuery)
$dataArray
##$dataArray | Sort-Object FQDN,IPAddress,OS | Format-Table FQDN,IPAddress,OS -AutoSize

### SQL Datensätze schreiben
$writeQuery = "INSERT INTO Servername VALUES(11,'Server11','domain.de','Server11.domain.de','192.168.0.11','255.255.255.0','192.168.0.254','192.168.0.2','192.168.0.1','192.168.0.1','Dual Core 3.07 GHz Intel Core i7 950','11264 MB','80 GB','100 GB','100 GB','Windows Server 2012 R2 x64','');"
$SQLite.writeSQLite($writeQuery)

### erneute SQL Abfrage ob der Schreibvorgang erfolgreich war
$readQuery = "SELECT * FROM Servername"
$dataArray = $SQLite.querySQLite($readQuery)
$dataArray

### Modul entfernen
Remove-Module MySQLite

Powershell_Abfrage_2

 

 

 

 

 
Powershell_Abfrage_2_2

 

 

 

 

 
Dritte Beispiel:
Gefunden bei http://psqlite.codeplex.com/

Nachdem man sich das SQLite Modul heruntergeladen und entpackt hat, kopiert man sich den Ordner in folgendes Verzeichnis

C:\Windows\System32\WindowsPowerShell\v1.0\Modules
C:\Windows\SysWOW64\WindowsPowerShell\v1.0\Modules

### SQLite Modul laden
if(!(Get-Module SQLite)) {Import-Module SQLite}

### Neue Datenbank erstellen oder bereits existierende mounten
New-PSDrive -PSProvider SQLite -Name HTDOM_Server_DB -Root "DataSource=D:\PowershellScripte\Powershell_SQLite\Serverliste3.sqlite"
### Mount-SQLite -Name HTDOM_Server_DB -DataSource "D:\PowershellScripte\Powershell_SQLite\Serverliste3.sqlite"

### Tabellen anlegen
New-Item -Path HTDOM_Server_DB:/Servername -Value "ID INTEGER PRIMARY KEY, Hostname TEXT, Domain TEXT, FQDN TEXT, IPAddress TEXT, SubnetMask TEXT, Gateway TEXT, DNSServer1 TEXT, DNSServer2 TEXT, WINSServer TEXT, CPU TEXT, Memory TEXT, CPartition TEXT, DPartition TEXT, EPartition TEXT, OS TEXT, ServicePack TEXT"

#NONE
#TEXT
#TEXT NOT NULL
#NUMERIC
#INTEGER
#INTEGER PRIMARY KEY
#REAL
#BLOB

### Tabellen wieder löschen
# Remove-Item -Path HTDOM_Server_DB:/Servername

### Tabellen mit Inhalt füllen
New-Item -Path HTDOM_Server_DB:/Servername -ID "1" -Hostname "Server1" -Domain "domain.de" -FQDN "Server1.domain.de" -IPAddress "192.168.0.1" -SubnetMask "255.255.255.0" -Gateway "192.168.0.254" -DNSServer1 "192.168.0.1" -DNSServer2 "192.168.0.2" -WINSServer "192.168.0.1" -CPU "Dual Core 3.07 GHz Intel Core i7 950" -Memory "1024 MB" -CPartition "80 GB" -DPartition "100 GB" -EPartition "100 GB" -OS "Windows Server 2008 R2 x64" -ServicePack "SP1"

New-Item -Path HTDOM_Server_DB:/Servername -ID "2" -Hostname "Server2" -Domain "domain.de" -FQDN "Server2.domain.de" -IPAddress "192.168.0.2" -SubnetMask "255.255.255.0" -Gateway "192.168.0.254" -DNSServer1 "192.168.0.2" -DNSServer2 "192.168.0.1" -WINSServer "192.168.0.1" -CPU "Dual Core 3.07 GHz Intel Core i7 950" -Memory "2048 MB" -CPartition "80 GB" -DPartition "100 GB" -OS "Windows Server 2012 R2 x64"
...

### Tabelleneinträge updaten
Set-Item -Path HTDOM_Server_DB:/Servername/1 -Hostname "Server3" -Domain "domain.de" -FQDN "Server3.domain.de" -IPAddress "192.168.0.3"
Get-Item -Path HTDOM_Server_DB:/Servername/1

### Tabelleneinträge löschen
Remove-Item -Path HTDOM_Server_DB:/Servername/1

### Suchen und Filtern
Get-ChildItem -Path HTDOM_Server_DB:/Servername | Select-Object FQDN,IPAddress,OS
Get-ChildItem -Path HTDOM_Server_DB:/Servername -Filter "Hostname like '%Server%'" | Format-Table FQDN,IPAddress,OS -AutoSize

FQDN              IPAddress   OS
----              ---------   --
Server1.domain.de 192.168.0.1 Windows Server 2008 R2 x64
Server2.domain.de 192.168.0.2 Windows Server 2012 R2 x64

So das war es schon wieder von mir, wünsche euch viel Spaß damit.
Gruß Helmut

Hallo zusammen,

um ein wenig von dem Grundlagentraining weg zu kommen, zeige ich euch heute, wie Ihr XML-Dateien mit Powershell nutzen könnt.
Hier habe ich euch ein kleines Howto geschrieben wie man XML-Dateien mit Microsoft Excel und Notepad vorbereitet. Zusätzlich könnt ihr hier die XML-Templates herunterladen.

XML-Dateien für Powershell vorbereiten
XML-Dateien Templates Download

Wie fragt man nun die Struktur einer XML-Datei ab? Hier ein kleines Schaubild.

XML_Visualisierung

 

 

 

 

 

Fangen wir an, eine XML-Struktur mit Powershell abzufragen. 🙂

Um mit XML-Dateien in Powershell arbeiten zu können, muss man das vorangestellte PowerShell-XML-Objektadapter [xml]$VariablenName definieren.
Die Variable wird als .NET-Klasse – System.Xml.XmlDocument deklariert. Zu finden mit:

$xmlfile | Get-Member
##XML-Datei wird in folgende Variable geladen
[xml]$xmlfile = Get-Content .[Pfad zur XML-Datei]\serverliste3.xml ##serverliste3_template.xml aus dem Download
 
##Informationen aus der XML-Datei auslesen
 $xmlfile.firma
 $xmlfile.firma.land
 $xmlfile.firma.land.standorte
 $xmlfile.firma.land.standorte.standort
 $xmlfile.firma.land.standorte.standort.server
 $xmlfile.firma.land.standorte.standort.server.hostname
 $xmlfile.firma.land.standorte.standort.server.FQDN

serverliste1  serverliste2

 

 

 

 

##Die Land/Standorte/Server mit der Abfrage eingrenzen

$xmlfile.firma.land
$xmlfile.firma.land[0]
$xmlfile.firma.land[1]

serverliste3

 

 

 

 

 

$xmlfile.firma.land[0].standorte.standort
$xmlfile.firma.land[0].standorte.standort[0]
$xmlfile.firma.land[0].standorte.standort[1]
$xmlfile.firma.land[0].standorte.standort[0].server.FQDN
$xmlfile.firma.land[0].standorte.standort[1].server.FQDN
$xmlfile.firma.land[0].standorte.standort.server[0].FQDN
$xmlfile.firma.land[0].standorte.standort.server[1].FQDN

serverliste4

 

 

 

 

 

$xmlfile.firma.land.standorte[1].standort.server.FQDN
$xmlfile.firma.land.standorte.standort[2].server.FQDN
$xmlfile.firma.land.standorte.standort[3].server.FQDN
$xmlfile.firma.land.standorte.standort.server[1].FQDN
$xmlfile.firma.land.standorte.standort.server[2].FQDN

serverliste5

 

 

 

 

 

Um jetzt die Informationen von so einer XML-Datei nutzen zu können, habe ich hier mal zwei Abfragen gebaut, um meine Server anpingen zu können.

[xml]$xmlfile = Get-Content .[Pfad zur XML-Datei]\serverliste3.xml
Clear-Host

$PingMachines = $xmlfile.firma.land.standorte.standort.server.FQDN

ForEach($MachineName In $PingMachines)
	{$PingStatus = Gwmi Win32_PingStatus -Filter "Address = '$MachineName'" | 
Select-Object StatusCode 
if ($PingStatus.StatusCode -eq 0)
	{Write-Host $MachineName -Fore "Green"}
else
	{Write-Host $MachineName -Fore "Red"}}

Ping2

 

 

 

 

 

$path = D:\PowershellScripte\Powershell_XML
[xml]$xmlfile = Get-Content .[Pfad zur XML-Datei]\serverliste3.xml
Clear-Host

$PingMachines = $xmlfile.firma.land.standorte.standort.server | Foreach-Object {$_.'FQDN'} | Foreach-Object {

if (Test-Connection $_ -quiet -count 1){
	" " + $_  | out-file "$path\Ping_Success.txt" -append
} else {
	" " + $_ | out-file "$path\Ping_NotSuccess.txt" -append
}
 }

Ping1

 

 

 

 

 

Temporäre Änderung einer XML Struktur

[xml]$xmlfile = Get-Content .[Pfad zur XML-Datei]\serverliste3.xml

$xmlfile.firma.land.standorte[0].standort.server[0] | 
ForEach-Object {if ($_.FQDN -like "ADS01.de.htdom.local")
	{$_.FQDN = "ADS01.htdom.local"
  }
 if ($_.Domain -like "de.htdom.local")
	{$_.Domain = "htdom.local"
  }
 }

 $xmlfile.firma.land.standorte[0].standort.server

XML_aendern

 

 

 

 

 

Server Liste erstellen lassen – sortiert nach IP Adressen

[xml]$xmlfile = Get-Content .[Pfad zur XML-Datei]\serverliste3.xml

$xmlfile.firma.land.standorte.standort.server | Where-Object {$_."IP-Address" -gt "192.168.178.1"} | Sort-Object IP-Address | Format-Table FQDN,IPAddress,SubnetMask,Gateway,DNSServer1,DNSServer2,WINSServer -AutoSize

Servername + Domainname zusammenstellen lassen

[xml]$xmlfile = Get-Content .[Pfad zur XML-Datei]\serverliste3.xml

$xmlfile.firma.land.standorte.standort.server | ForEach-Object{$_.Hostname + "." + $_.Domain} | Sort-Object $_.Hostname

Servereinträge in einer XML-Datei clonen

Clone1

[xml]$xmlfile = Get-Content .[Pfad zur XML-Datei]\serverliste3.xml

$newsrv = $xmlfile.firma.land.standorte.standort[0].server.Clone()
$newsrv.Hostname = "ADS03"
$newsrv.FQDN = "ADS03.htdom.local"
$newsrv.IPAddress = "192.168.178.102"
$newsrv.DNSServer2 = "192.168.178.102"
$newsrv.Memory = "3072 MB"
$newsrv.CPartition = "50 GB"
$newsrv.DPartition = "100 GB"
$newsrv.OS = "Windows Server 2012 R2 x64"
$newsrv.ServicePack = "-"

$newsrv2 = $xmlfile.firma.land.standorte.standort[0].server.Clone()
$newsrv2.Hostname = "ADS04"
$newsrv2.FQDN = "ADS04.htdom.local"
$newsrv2.IPAddress = "192.168.178.103"
$newsrv2.DNSServer2 = "192.168.178.103"
$newsrv2.Memory = "3072 MB"
$newsrv2.CPartition = "50 GB"
$newsrv2.DPartition = "100 GB"
$newsrv2.OS = "Windows Server 2012 R2 x64"
$newsrv2.ServicePack = "-"

$xmlfile.firma.land.standorte.standort[0].AppendChild($newsrv)
$xmlfile.firma.land.standorte.standort[0].AppendChild($newsrv2)
$xmlfile.save("D:\PowershellScripte\Powershell_XML\test.xml")

Clone2

 

 

 

 

 

So das was erst mal wieder von mir.

Viele Spaß beim ausprobieren.
Gruß Helmut

Hallo zusammen,

Im fünften Teil meiner Grundlagenserie, zeige ich euch, wie Ihr mit Variablen umgehen könnt.
Über das Thema Variablen kann man sehr dicke Bücher verfassen, daher reiße ich das Thema nur kurz an, um euch einen kleinen Überblick zu geben was möglich wäre.

Sollte mal was unklar sein, könnt ihr hier nachschlagen.

Get-Help about_Variables
Get-Help about_Automatic_Variables
Get-Help about_Environment_Variables
Get-Help about_Preference_Variables
Get-Help about_CommonParameters

Um sich die Systemvariablen anzeigen zu lassen, kann man folgende Befehle nutzen:

Get-Variable

oder

Get-ChildItem Variable: | Format-Table Name, Description -AutoSize

Die Environment/Umgebungsvariablen zeigt man sich wie folgt an:

Get-ChildItem Env: | Sort-Object Name

Bestimmte Environment/Umgebungsvariablen kann man sich anzeigen lassen, indem man Env:“ gefolgt vom Variablenamen angibt oder das Dollarzeichen „$“ davorsetzt $Env:gefolgt vom Variablenamen

Get-ChildItem Env:Computername

oder

$Env:Computername

oder

Set-Location Env:
Get-ChildItem ComputerName

Um auf Verzeichnisvariablen zugreifen zu können, benutzt man folgende Befehle:

Get-ChildItem $Env:ProgramFiles
Get-ChildItem $Env:ProgramData
Get-ChildItem $Env:ALLUSERSPROFILE

Bei 64-Bit Systemen gibt es ein Ausgabeproblem bei der Variable %ProgramFiles(x86)%, wegen der beiden Klammern um x86.
Diese Abfrage fasst man einfach in geschweifte Klammern zusammen.

Get-ChildItem ${Env:ProgramFiles(x86)}

Wenn man bei Environment/Umgebungsvariablen etwas hinzufügen möchte, bestes Beispiel wäre die Path Variable, funktioniert das wie folgt. Dies gilt aber nur für die aktive Powershellsitzung.

$Env:Path
$Env:Path = $Env:Path + ";C:\Temp" + ";D:\PowershellScripte"

Wenn man feste Werte setzen möchte, muss man das über das PowerShell-Profil realisieren. Mit folgenden cmdlet wird die Path-Erweiterung gleich in die Profildatei geschrieben.

Add-Content -Path $Profile.CurrentUserAllHosts -Value '$Env:Path = $Env:Path + ";C:\Temp" + ";D:\PowershellScripte"'

Oder folgenden Eintrag an das Ende der Profildatei schreiben.

notepad $Profile.CurrentUserAllHosts
$Env:Path = $Env:Path + ";C:\Temp" + ";D:\PowershellScripte"

Um selbst Variablen für die jeweilige Powershellsitzung zu erstellen, schreibt man $VariableName = Zuordnung

$zahl = 5
$text = "Hallo Welt"

Um eine Variable fest zu definieren, dass heißt in dieser Variable dürfen z.B. nur Ganzzahlen [integer] geschrieben werden, setzt man vor den Variablenamen ein [int],
nachdem die Variable definiert wurde und man versucht diese z.B. mit Text [string] zu überschreiben, bekommt man einen Fehlermeldung angezeigt.

[int]$zahl = 5
$zahl
5

$zahl = "Hallo Welt"

Der Wert "Hallo Welt" kann nicht in den Typ "System.Int32" konvertiert werden. Fehler: "Die Eingabezeichenfolge hat das falsche Format."
In Zeile:1 Zeichen:1
+ $zahl = "Hallo Welt"

$zahl | Get-Member (TypeName: System.Int32)

Andersherum ist der String-Variable egal ob Text oder Zahlen enthalten sind, die Zahlen werden dann einfach als Text behandelt.

[string]$text = "Hallo Welt"
$text
Hallo Welt

$text = '123'
$text
123

$text | Get-Member (TypeName: System.String)

Folgende Datentypen können für Variablen definiert werden.

[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

Man kann natürlich auch kleine Rechenaufgaben mit Hilfe von Variablen erledigen lassen. 🙂

$rechnung = 100
$mwst = 100 * 0.19
$endsumme = $rechnung + $mwst
Write-Host "Mensch, das Abendessen hat heute $endsumme Euro gekostet!"

Oder ganze Abfragen in einer Variable schreiben lassen und diese später wieder auswerten oder weiterverarbeiten.

$timedate = Get-Date -Format "dd-MM-yyyy_HH-mm-ss"
$computers = Get-ADComputer -filter "Name -like '*'" -properties OperatingSystem,OperatingSystemServicePack,OperatingSystemVersion,IPv4Address,Created | Sort-Object

Spezielle Variablen kann man wie folgt definieren. Ob es Sinnvoll ist, muss jeder für sich selbst entscheiden. 🙂

${ein sonderbarer, aber */() möglicher Variablenname} = 12

Array’s definiert man wie folgt.

##Zahlen-Array's erstellen
$ZahlenArray = 1,2,3 ##Ausgabe des Array's = $ZahlenArray; $ZahlenArray[0]; $ZahlenArray[1]; $ZahlenArray[2]
$ZahlenArray = '4', '5', '6'
$ZahlenArray = "7", "8", "9"
$ZahlenArray = @("10", "11", "12")
$ZahlenArray

##String-Array's erstellen
$StringArray = 'Wert 1', 'Wert 2', 'Wert 3' 
$StringArray = Write-Output 'Wert 4' 'Wert 5' 'Wert 6' 
$StringArray = 'Wert 7,Wert 8,Wert 9'.Split(',')
$StringArray = @("Wert 10", "Wert 11", "Wert 12")
$StringArray

##Einträge im Array können wie folgt verändert werden
$StringArray[2] = "Wert 14"
$StringArray

##Möchte man die Ausgabe bestimmter oder aller Werte in einer Array manipulieren, hilft wieder das cmdlet Get-Member
$StringArray | Get-Member

$StringArray[1].ToLower()
$StringArray.ToUpper()
$StringArray.Replace("Wert 10", "Wert 15")

Sucht man nach bestimmten Strings oder Zeichenketten in einer Variable, helfen die Methoden (Get-Member)

$uncPath = "\\Servername\Freigabe"
$uncPath

$uncPath.StartsWith("\\")
True

if ($uncPath.StartsWith("\\") -eq $True) {
	Write-Host "Der UNC Pfad beginnt mit '\\'"
} else {
	Write-Host "Der UNC Pfad beginnt leider nicht mit '\\'"
}

$uncPath.EndsWith("Freigabe")
True

$uncPath.EndsWith("e")
True

$uncPath.EndsWith("f")
False

Um Hash-Table’s erstellen zu können, benötigt man einen Namen und ein Value als Zuordnung. Es gibt verschiedene Möglichkeiten die Wertepaare in einer Hash-Table abzulegen.

$cplist1 = @{ComputerName = "CLN01"; IPAddress="192.168.100.111"; UserName="Peter Pan"; Standort="Berlin"; Domain="htdom.local"}

oder

$cplist2 = @{} #Leere Hash-Table erstellen

$cplist2.ComputerName = "CLN01" 
$cplist2.IPAddress = "192.168.100.111"
$cplist2.UserName = "Peter Pan"
$cplist2.Standort = @("Berlin")
$cplist2["Domain"] = "htdom.local"  

##Werte aus einer Hash-Table abfragen
$cplist2
$cplist2["UserName"]
$cplist2.UserName
$cplist2["UserName", "ComputerName", "Standort"]

##Einträge aus einer Hash-Table wieder löschen
$cplist2.Remove("Domain")

##Hash-Table komplett leeren, zurück bleibt die leere Variable
$cplist2.Clear

Get-Variable
...
cplist2                         {}

##Diese leere Variable kann man mit Remove-Variable löschen
Remove-Variable cplist2

Noch ein Beispiel für eine Hash-Table

$hash = $null
$hash = @{}
$services = Get-Service | Sort-Object Name

ForEach ($service in $services) {$hash.add($service.Name,$service.Status)}
Clear-Host

$hash
$hash["BITS"]
$hash["BITS", "VSS"]

Und sollten mehrere Werte in das Value Feld eingetragen werden, würde es mit diesen Beispiel funktionieren.
Die Werte im Value Feld lassen sich aber nicht mehr so leicht verändern wie oben in den Beispielen gezeigt, hier müssten die kompletten Werten gelöscht und mit neuen Werten hinzugefügt werden.

$Users = @{}
$Users.Administrator += @("DOMAIN\Administrator")
$Users.Administrator += @("DOMAIN")
$Users.Administrator += @("S-1-5-21-3775395870-3833774050-3544682504-500")
$Users.Gast += @("DOMAIN\Gast")
$Users.Gast += @("DOMAIN")
$Users.Gast += @("S-1-5-21-3775395870-3833774050-3544682504-501")

$Users
Name                           Value
----                           -----
Administrator                  {DOMAIN\Administrator, DOMAIN, S-1-5-21-3775395870-3833774050-3544682504-500}
Gast                           {DOMAIN\Gast, DOMAIN, S-1-5-21-3775395870-3833774050-3544682504-501}

$Users["Administrator"]
DOMAIN\Administrator
DOMAIN
S-1-5-21-3775395870-3833774050-3544682504-500

$Users["Gast"]
DOMAIN\Gast
DOMAIN
S-1-5-21-3775395870-3833774050-3544682504-501

$Users.Remove("Gast")

$Users
Name                           Value
----                           -----
Administrator                  {DOMAIN\Administrator, DOMAIN, S-1-5-21-3775395870-3833774050-3544682504-500}

$Users.Clear

Get-Variable
...
Users                          {}

Remove-Variable Users

So das war es erst mal wieder von mir.

Wünsche viel Spaß und viele Grüße
Helmut