Zum Inhalt wechseln


Foto

Laufwerks mappings von Usern per Skript ändern


  • Bitte melde dich an um zu Antworten
14 Antworten in diesem Thema

#1 burbank6747

burbank6747

    Newbie

  • 8 Beiträge

 

Geschrieben 20. Januar 2017 - 13:20

Hallo zusammen,


folgender Zustand:

Es existiert ein Fileserver "\\alterServer" auf den viele User per Freigabe zugreifen: \\alterServer\daten, \\alterServer\personal usw.

Jetzt soll dieser Fileserver gegen "\\neuerServer" getauscht werden. Die Freigaben werden identisch erstellt werden: \\neuerServer\daten, \\neuerServer\personal usw.


Gibt es die Möglichkeit per PS-Skript die Freigaben der User auszulesen und ändern zu lassen? Habe wirklich lange gesucht, aber nur wenig gefunden mit dem ich arbeiten kann.

Zwei Ansätze waren diese: Get-WmiObject Win32_MappedLogicalDisk oder Get-ChildItem -Path HKCU:\Network\ -Name.


Vielen Dank

P. S.: Für die Netzwerkdrucker hatte ich eine Lösung gefunden.
 



#2 NorbertFe

NorbertFe

    Expert Member

  • 29.495 Beiträge

 

Geschrieben 20. Januar 2017 - 13:37

Wieviele Leute sinds denn? Und wie wurden die Laufwerke bisher gemappt? Normalerweise kann man beim ANmelden per Skript doch die Laufwerke trennen und neu verbinden (oder per GPP). Dann ist das eine Entscheidung die du als Admin triffst. Falls der Nutzer sich dann selbst irgendwelche Laufwerke verbunden haben sollte ... SH.

Bye

Norbert


Make something i***-proof and they will build a better i***.


#3 burbank6747

burbank6747

    Newbie

  • 8 Beiträge

 

Geschrieben 20. Januar 2017 - 14:03

Sehr viele Leute da eine große Firma. Es soll alles remote und möglichst automatisch passieren ohne daß man zu jedem einzelnen hin muß. Die Laufwerke wurden wohl manuell gemappt.

Spielt im nachinein nicht die Rolle wie, sondern daß der Switch auf den neuen Server möglichst reibungslos funktioniert



#4 Esta

Esta

    Board Veteranin

  • 1.255 Beiträge

 

Geschrieben 20. Januar 2017 - 14:11

Wenn die User sich die LW selbst gemappt haben, wird es schwierig. Wie wäre es mit einem Alias. So dass nach dem Abschalten des alten Servers die noch alten vorhandenen Mappings auf den neuen Server umgeleitet werden.

 

Wenn es sich um Verlinkung auf dem User Desktop handelt, dafür hatte ich mal ein kleines VB Script gebastelt.


Gruß Esta

:D Ich liebe Herausforderungen. :D

Was wäre das Leben, hätten wir nicht den Mut, etwas zu riskieren.
Vincent van Gogh

#5 Sunny61

Sunny61

    Expert Member

  • 21.568 Beiträge

 

Geschrieben 20. Januar 2017 - 14:34

Was spricht dagegen den Server nach dem Umzug der Daten wieder umzubenennen? Und für die Zukunft wäre ja ein SPN und/oder DFS eine Variante.
Gruppenrichtlinien: http://www.gruppenrichtlinien.de/

#6 testperson

testperson

    Board Veteran

  • 3.873 Beiträge

 

Geschrieben 20. Januar 2017 - 14:40

Hi,

 

per GPP ein Netzlaufwerk mit der Option "Alle löschen ab: A" und nur einmalig anwenden und dann dadrunter die neuen Netzlaufwerke.

 

Gruß

Jan


Good morning, that's a nice TNETENNBA!

#7 NilsK

NilsK

    Expert Member

  • 11.329 Beiträge

 

Geschrieben 20. Januar 2017 - 14:58

Moin,

 

wobei das ja auch nicht besonders schwierig ist. Kriegt man zur Not sogar per Batch hin:

 

  • Auslesen der Mappings - net use liefert die Informationen; in Powershell etwa
    Get-PSDrive -PSProvider FileSystem | where { $_.DisplayRoot -like '\\*'}
  • UNC-Pfade isolieren (in PowerShell die DisplayRoot-Eigenschaft der obigen Objekte)
  • Alten String durch neuen ersetzen
  • Wenn UNC-Pfad den alten String enthält: Trennen und mit neuem Pfad neu mappen

Gruß, Nils


Bearbeitet von NilsK, 20. Januar 2017 - 14:59.

Nils Kaczenski

MVP Cloud and Datacenter Management
... der beste Schritt zur Problemlösung: Anforderungen definieren!

Kostenlosen Support gibt es nur im Forum, nicht privat!


#8 burbank6747

burbank6747

    Newbie

  • 8 Beiträge

 

Geschrieben 22. Januar 2017 - 19:23

Hallo,

 

wenn man nicht ganz so fit im Skripting mit PowerShell ist, kann es schon schwierig sein. Vor allem wenn es heißt "muß per Skript gemacht werden"

NilsK, ich denke dein Ansatz hört sich gut an. Werde versuchen den umzusetzen und evtl. bei Rückfragen auf dich zurück kommen, wenn ich denn darf.



#9 NilsK

NilsK

    Expert Member

  • 11.329 Beiträge

 

Geschrieben 22. Januar 2017 - 20:33

Moin,

 

klar darfst du. Detailfragen beantworten wir gern. Fertige Skripte liefern wir i.d.R. nicht, aber du scheinst da ja auch auf einem guten Weg zu sein.

 

Gruß, Nils


Nils Kaczenski

MVP Cloud and Datacenter Management
... der beste Schritt zur Problemlösung: Anforderungen definieren!

Kostenlosen Support gibt es nur im Forum, nicht privat!


#10 burbank6747

burbank6747

    Newbie

  • 8 Beiträge

 

Geschrieben 23. Januar 2017 - 15:02

Hallo Nils,

habe viele Ansätze, aber nicht das Große ganze:

 

#Setze Variablen:

$old_server = "alterServer"

​$new_server = "neuerServer"

 

# lese die alten netzwerk mappings in eine Variable

$mappings = (Get-WmiObject Win32_MappedLogicalDisk |  where{$_.ProviderName -match "alterServer"} | Select-Object -expandProperty ProviderName)

 

#oder nach deiner Variante

Get-PSDrive -PSProvider FileSystem | where { $_.DisplayRoot -like '\\alterServer'}

 

​#jetzt muß ich diese Werte in $mappings löschen, habe aber hier nicht die Ahnung wie genau

foreach($element in $mappings) { (New-Object -ComObject WScript.Network)

 

#nun müssen die alten gegen die neuen Pfade getauscht werden, aber auch keine Ahnung wie genau

foreach ($element in $mappings)  {$mapping.New-PSDrive ($element.replace("$old_server", "$new_server")) }

 

Aber das funktioniert so natürlich nicht, ich komme aber leider nicht weiter



#11 NilsK

NilsK

    Expert Member

  • 11.329 Beiträge

 

Geschrieben 23. Januar 2017 - 15:46

Moin,

 

du brauchst aus einem PowerShell-Skript ja kein WScript-Objekt aufzurufen. Remove-PSDrive sollte das Nötige tun. Und mit New-PSDrive solltest du das neue Mapping einrichten können. Ungetestet, aber sollte mich wundern, wenn es nicht so ist.

 

Den nötigen String für das neue Mapping erzeugst du so ähnlich, wie du es schon angedeutet hast. Die folgende Zeile gibt bei mir Daten in der gewünschten Form zurück:

foreach ($Drive in $mappings) { $Drive.DisplayRoot.Replace('alt', 'neu') }

Gruß, Nils


Nils Kaczenski

MVP Cloud and Datacenter Management
... der beste Schritt zur Problemlösung: Anforderungen definieren!

Kostenlosen Support gibt es nur im Forum, nicht privat!


#12 burbank6747

burbank6747

    Newbie

  • 8 Beiträge

 

Geschrieben 25. Januar 2017 - 07:47

Hallo Nils,

 

habe es jetzt so gelöst:

 

 

$oldserver = "alterServer"
$newserver = "neuerServer"
$oldunits = Get-ChildItem -Path HKCU:\Network\ -Name
ForEach ($unit in $oldunits)
{
 $oldmap = (Get-Itemproperty HKCU:\Network\$unit).RemotePath
 If ($oldmap -match $oldserver)
 {
     #Remove-PSDrive –Name $unit -Force
    (New-Object -ComObject WScript.Network).RemoveNetworkDrive($unit +":", $true, $true)
    New-PSDrive –Name $unit –PSProvider FileSystem –Root $oldmap.replace($oldserver,$newserver) –Persist
 }

 

 

So ganz zufrieden bin ich aber noch nicht. Melde mich nochmal.

Danke schon mal



#13 MurdocX

MurdocX

    Member

  • 265 Beiträge

 

Geschrieben 25. Januar 2017 - 08:25

Hallo Nils,

 

habe es jetzt so gelöst:

 

 

$oldserver = "alterServer"
$newserver = "neuerServer"
$oldunits = Get-ChildItem -Path HKCU:\Network\ -Name
ForEach ($unit in $oldunits)
{
 $oldmap = (Get-Itemproperty HKCU:\Network\$unit).RemotePath
 If ($oldmap -match $oldserver)
 {
     #Remove-PSDrive –Name $unit -Force
    (New-Object -ComObject WScript.Network).RemoveNetworkDrive($unit +":", $true, $true)
    New-PSDrive –Name $unit –PSProvider FileSystem –Root $oldmap.replace($oldserver,$newserver) –Persist
 }

 

 

So ganz zufrieden bin ich aber noch nicht. Melde mich nochmal.

Danke schon mal

 

Verbesserungsvorschläge:

  • Entferne bei "Get-ChildItem" den Parameter "-Name", damit das komplette Objekt gespeichert wird. Damit ersparst du Dir die erneute Registry Abfrage von "Get-Itemproperty" $oldmap = (Get-Itemproperty HKCU:\Network\$unit).RemotePath
If ($oldmap.RemotePath -match $oldserver)
  • Alternativ von Remove-PSDrive ( Funktoniert das bei euch? Bei mir nicht mal mit "-force"! ) und dem ComObjekt könntest du "net use X: /delete" nutzen.
Start-Process -FilePath "net.exe" -ArgumentList "use $($unit.Name): /delete"

MCSA


#14 burbank6747

burbank6747

    Newbie

  • 8 Beiträge

 

Geschrieben 25. Januar 2017 - 09:20

Hi MurdocX,

 

das wird so wohl nicht funktionieren:

 

$oldmap = (Get-Itemproperty HKCU:\Network\$unit).RemotePath

 

Kann ich nicht entfernen, da wird ja die Variable gesetzt.

 

Das 'Remove-PSDrive' war eh schon auskommentiert, es wird 'RemoveNetworkDrive' benutzt.

 

Jetzt gibt es aber noch Probleme wenn der User auch lokaler Admin ist. Alles was per GPO oder Logonskript gemappt war, ist nachher nicht gemappt wenn er auch lokaler Admin war. Microsoft hat da wohl in jüngster Vergangenheit was gepatcht um die 'enablelinkedconnection' in der Registry zu verhindern.



#15 MurdocX

MurdocX

    Member

  • 265 Beiträge

 

Geschrieben 25. Januar 2017 - 09:32

$oldmap = (Get-Itemproperty HKCU:\Network\$unit).RemotePath

Kann ich nicht entfernen, da wird ja die Variable gesetzt.

 

Ersetze einfach $oldmap in der IF-Bedingung durch $Unit, dann kannst du die Zeile wie ich es beschrieben habe, entfernen.

 

 

Microsoft hat da wohl in jüngster Vergangenheit was gepatcht um die 'enablelinkedconnection' in der Registry zu verhindern.

 

"I opened a case on this issue. Microsoft stated a fix would be released in February. They couldn't tell me if it would be in the cumulative or in a separate update."

https://social.techn...n10itprogeneral


Bearbeitet von MurdocX, 25. Januar 2017 - 09:37.

MCSA