When network drives are blocking the Powershell

The following error can prevent powershell scripts from running properly.

Attempting to perform the InitializeDefaultDrives operation on the 'FileSystem' provider failed.

In order to get the powershell up and running again we will have to fix this.
This error is resulting from a network drive that is mounted by the user 'System'.

Running Net use, even on an elevated CMD, the network drive is not visible and cannot be removed.

To remove it we will have to open a cmd with system rights.
There are more then one way to do this but the most easy one is PsExec.

PsExec is one of the legendary PsTools.
https://technet.microsoft.com/de-de/sysinternals/pstools.aspx
Download them and navigate to the directory.

The PsTools have been written by Mark Russinovich and then later been bought by Microsoft.
So you shoud be fine using them on productive systems.

With PsExec you can Spawn a Process on a remote device if the $admin share is active.
If you do not specify a certain context for this process 'System' will be used.

psexec.exe \\localhost -s cmd.exe

Net use should now show the drive.
Now you can delete it using net use DRIVELETTER: /delete /yes.

Cheers,
Ori


Linux Subsystem installieren

Wie oft aber habe ich mir in Powershell die Core Utils gewünscht oder mich geärgert, dass ich nicht wie in Screen oder Byobu mit nested Sessions arbeiten kann oder, oder, oder...

Vor ein paar Tagen habe ich einen Blogpost von fefe gelesen, in dem er das "Linux Subsystem for Windows" erwähnt.
http://blog.fefe.de/?ts=a7172ae6

Warum nicht einfach mal ausprobieren.

 

Übersicht
Windows Subsystem für Linux ist im Kern eine Linux Shell für Windows.

Im Detail erklärt, findet Ihr Arbeitsweise in dem Microsoft Blogpost


https://blogs.msdn.microsoft.com/wsl/2016/04/22/windows-subsystem-for-linux-overview/

Installation

Die Installation ist recht einfach.
Ausführen (Windows + R): control /name Microsoft.WindowsUpdate

Dort dann den Entwicklermodus aktivieren.
Dies kann ein paar Minuten dauern.

Danach müsst ihr das Windows Feature "Windows-Subsystem für Linux (Beta)" aktivieren und den Host neu starten.

Nach dem Neustart könnt ihr die Bash aufrufen.

Beim ersten Start müssen noch einige Daten aus dem Microsoft Store heruntergeladen werden und man muss einen User mit Passwort anlegen.

Es werden euch ein paar mal Dialoge begegnen wo Dinge stehen wie "Dies kann ein paar Minuten dauern..." und der Vorgang scheint sich ewig hin zu ziehen.
Einfach nach ein paar Minuten mal Enter drücken ;)

Zum Schluss noch einmal die Shell updaten.
sudo apt-get update && sudo apt-get upgrade

 

Und Tadaa, einmal Bash auf Windows:

Ich bin bereits in einige limitierungen hineingelaufen, werde diesen aber einen eigenen Blogpost widmen.

Cheers,
Ori


Wenn Netzlaufwerke die Powershell blockieren

Folgende Fehlermeldung kann beim starten der PowerShell das Ausführen von Scripts verhindern.

Fehler beim Ausführen des InitializeDefaultDrives-Vorgangs für den Anbieter "FileSystem".

Damit die PowerShell wieder sauber arbeiten kann, muss die Fehlermeldung behoben werden.
Diese Fehlermeldung wird dadurch verursacht, dass ein Netzlaufwerk als User "System" eingebunden wurde.

Mit Net Use wird selbst mit administrativer CMD das Netzlaufwerk nicht angezeigt und kann nicht entfernt werden.

Um dem Problem Herr zu werden müsst ihr eine CMD mit Systemrechten öffnen.
Es gibt mehrere Wege nach Rom, der leichteste ist mit PsExec.

PsExec ist eines der Toos aus den legendären PsTools.
https://technet.microsoft.com/de-de/sysinternals/pstools.aspx
Ladet dieses herunter und navigiert dann in das Downloadverzeichnis.

Die PsTools wurden von Mark Russinovich geschrieben und später von Microsoft aufgekauft, sie sind also für Produktivsysteme zu gebrauchen.

Mit PsExec lassen sich Prozesse (z.b. cmd) auf entfernten Systemen starten, wenn auf dem Gerät der $admin Share aktiv ist.
Diese Prozesse werden, wenn nicht anders spezifiziert, mit Systemrechten ausgeführt.

psexec.exe \\localhost -s cmd.exe

Nun kann das Netzlaufwerk entfernt werden.

net use und net use LAUFWERKSBUCHSTABE: /delete /yes

Cheers,
Ori


Changing Terminalserverprofilepath using Powershell

In a Windows Active Directory Domain additionally to having userprofiles on a server you can have a seperate user profile.

This profile is called terminalserver-profile and hence the name is only used if the user is working on a terminal server.

This way you only have to have one account per user, have a personalized profile optimized for working on a terminal server and the user has to remember just one Account / Password. (!)

If you want to roll out this sort of profile in an existing domain, depending on its size, it can become a very tiring job.
Jobs like this are perfect for scripting and in Windows this means Powershell.

A sad fact is that this profile path cannot be set using Get-Aduser and Set-Aduser.

Powershell Fu

We define a variable $user and provide using [ADSI]“LDAP://“ the canonical name of the users an.
In my example I point to the AD-Account tstest in the OU SBSUsers.

$user = [ADSI]"LDAP://CN=tstest,OU=SBSUsers,OU=Users,OU=MyBusiness,DC=xxx,DC=local

If you do not want to read this value manually from the ADSI Editor, first save the ad user object to a variable using get-aduser.

$findme = get-aduser -Identity tstest

Another way to do this:

$findme = Get-ADUser -Filter {(Name -Like "tstest*")}

This object has the "DistinguishedName" property, access it:

$usersCN = ($findme.DistinguishedName)

Now we build the complete canonical name:

$user = [ADSI]"LDAP://$usersCN"

The property "terminalservicesprofilepath" of the user tsts (stored on the object $user) can now be changed using $user.psbase.Invokeset("Property","New Value").

$user.psbase.Invokeset("terminalservicesprofilepath","\\server\share")

Finally we have to write the changes to the AD:

$user.setinfo()

 

 

Blow you will find an example script.

 

Cheers,
Ori


Remotedesktopdienste-Profil mit Powershell ändern

In einer Windows Active Directory Domänenumgebung gibt es zusätzlich zu Serverseitig gespeicherten Profilen die Möglichkeit Usern ein separates Profil zu gehen.

Dieses Profil nennt sich Remotedesktopdienste-Profil und wird nur dann geladen, wenn der User auf einem Terminalserver arbeitet.

So muss man nur ein AD Konto pro User pflegen und der User kann sich trotzdem ein, auf das Arbeiten auf dem Terminalserver zugeschnittenes, Profil personalisieren ohne sich zwei Passwörter merken zu müssen. (!)

Wenn man dieses Profil in einer bestehenden Umgebung ausrollen will, kann das abhänging von der Anzahl der User viel (ermüdende) Arbeit bedeuten.
Es bietet sich also an das ganze über ein Powershell Script zu erledigen.

Leider lässt sich der Profilpfad nicht gemütlich über Get-Aduser und Set-Aduser in der Powershell setzen.

Powershell Fu

Wir definieren eine Variable $user und geben mit [ADSI]“LDAP://“ den Kanonischen Namen des users an.
In meinem Beispiel zeige ich auf das Benutzerkonto tstest in der OU SBSUsers.

$user = [ADSI]"LDAP://CN=tstest,OU=SBSUsers,OU=Users,OU=MyBusiness,DC=xxx,DC=local

Wenn ihr den nicht von Hand über den ADSI Editor auslesen wollt, könnt ihr ihn folgendermaßen mit der Powershell auslesen.

$findme = get-aduser -Identity tstest

Alternativ könntet ihr jetzt auch folgendes schrieben:

$findme = Get-ADUser -Filter {(Name -Like "tstest*")}

Nun speichern wir den Kanonischen Namen des users:

$usersCN = ($findme.DistinguishedName)

Hieraus bilden wir nun die Variable $user, welche den distinguishedName und den Path enthält:

$user = [ADSI]"LDAP://$usersCN"

Den Wert "terminalservicesprofilepath" des users tstest (in der Variable $user) können wir nun mit $user.psbase.Invokeset("Variable","NeuerWert") anpassen.

$user.psbase.Invokeset("terminalservicesprofilepath","\\server\freigabe")

Final müssen wir jetzt die Änderungen noch anwenden:

$user.setinfo()

 

 

Nachfolgend ein Beispiel, wie das in einem PowerShell Script umgesetzt werden kann.

 

Vielen Dank fürs Lesen,
Ori