Benutzer mit den meisten Antworten
Share umbenennen --> Automatisch bestätigen

Frage
-
Hallo zusammen,
nach langem googlen wurde ich leider nicht fündig und versuche es deshalb mal hier.
Ich habe ein Scipt gecodet, dass einen Ordner überwacht und auf ein Create oder Rename wartet. Wenn ein Ordner erstellt bzw umbenannt wird, wird er automatisch geshared. Das funktioniert soweit ganz gut, nur leider kommt beim umbenennen eines shares die folgende Meldung, die ich manuell bestätigen muss (falls Bild nicht Sichtbar:
This folder is shared with other people
if you rename this folder, it will no longer be shared.
Continue Cancel
Ich würde diese Meldung gerne immer mit continue bestätigen, aber leider hat weder -force, noch /y geholfen.
Der Befehl den ich benutze ist
net share $name=$pfad "/GRANT:Everyone,FULL" "/remark:$name"
Ich bin für jede Idee dankbar!
- Bearbeitet Savihh Montag, 2. Juli 2012 15:31 Bild wurde nicht angezeigt
- Bearbeitet Alex Pitulice Mittwoch, 4. Juli 2012 13:10 Titel Korrektur
Antworten
-
Hallo Savihh !
Da war noch ein Bug drin ! Das "Register-Event $action_rename" war falsch!
Nun habe ich das getestet und es müsste funzen!
function Monitor-Folder{ param([string]$folder) $fsw = New-Object System.IO.FileSystemWatcher $fsw.Path = $folder $global:folderchange = @() $action_create = { $info = @{} $info.Path = $eventArgs.FullPath $info.Type = $eventArgs.ChangeType $global:folderchange = (New-Object PSObject -Property $info) $folderchange $pfad = $folderchange $pfad = $folderchange.path $name = split-path $pfad -leaf -resolve net share $name=$pfad "/GRANT:Everyone,FULL" "/remark:$name" | out-null } $action_rename = { $info = @{} $info.Path = $eventArgs.FullPath $info.Type = $eventArgs.ChangeType $Info.OldPath = $eventArgs.OldFullPath # <- NEU ########################### $Info.OldName = $eventArgs.OldName # <- NEU ########################### $global:FolderRename = (New-Object PSObject -Property $info) $FolderRename $confirm = $true $pfad = $FolderRename $pfad = $FolderRename.path $name = split-path $pfad -leaf -resolve write-Host $('alter Name: ' + $eventArgs.OldName) # <- NEU Ausgabe ########################### write-Host $('neuer Name: ' + $eventArgs.Name) # <- NEU Ausgabe ########################### NET SHARE $eventArgs.OldName "/DELETE" # <- NEU ########################### NET SHARE $name=$pfad "/GRANT:Everyone,FULL" "/remark:$name" } Register-ObjectEvent $fsw -EventName Created -Action $action_create -SourceIdentifier Watch1 | Out-Null Register-ObjectEvent $fsw -EventName Renamed -Action $action_rename -SourceIdentifier Watch2 | Out-Null }
Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '- Als Antwort vorgeschlagen King Julien Freitag, 6. Juli 2012 15:26
- Als Antwort markiert Denniver ReiningMVP, Moderator Dienstag, 10. Juli 2012 16:59
Alle Antworten
-
Nur um Missverständnisse auszuräumen, bei mir kommt die Meldung wen ich einen ORDNER umbenenne will, der Freigegeben wurde (Share)!
Willst du nun das Share Umbenennen oder den Ordner der geshared wurde?Ein Share ist ein Objekt das auf einen Ordner zeigt. Man hat hier also 2 Objekte und beide haben einen Namen!
Wenn du dein Skript (wenigstens auszugsweise) Posten könntest, wäre uns allen sicher geholfen.
Den Parameter –Force gibt es bei Net Share nicht! Das ist ein DOS Befehl!Ich verstehe deine Vorgehensweise Shares oder Ihre Ordner umzubenennen nicht so ganz!
Shares sind dafür gedacht, einmal erstellt zu werden und dann IMMER so zu bleiben!
Stell dir mal vor man würde Hamburg immer wieder umbenennen. Wohin fahren dann die LKW Fahrer die gerade nach Hamburg unterwegs sind? Denen wird der Weg weggenommen!
Genau so ist das wenn man Shares Umbenennt die allgemein bekannt sind, da kennt sich irgendwann keiner mehr aus und keine sau findet da wieder hin!Was ist mit den Usern die Gerade mit dem Share verbunden sind? Denen wird der Boden unter den Füssen weggezogen!
Deshalb MUSS diese Meldung kommen wenn der Ordner umbenannt wird!
Das ist richtig so!
Wenn du den Ordner Umbenennen willst auf den das Share zeigt dann geht nur folgende Vorgehensweise:1. Entbindest du denn dein Share mit NET SCHARE /DELETE
2. Umbenennen des Ordners
3. Erstellen des Shares (mit demselben Namen wie vorher) und verbinden des Shares mit dem Umbenannten Ordner.Wenn du das Share umbenennen willst dann empfehle ich dir folgende Vorgehensweise:
1. Erstellen eines neuen Shares mit demselben Ordner wie das bestehende Share. (Parallel Share)
2. Nach ein paar Tagen für das das alte Share die Zugriffsberechtigung auf Verweigern setzen
3. Irgendwann später das alte Share entfernen (Net Share /Delete)Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' ' -
Hallo Peter,
vielen Dank schon einmal für die ausfühliche Hilfe. Zum Verständnis habe ich untenmal den Code beigefügt.
Ich würde gerne sowohl den Ordner, als auch den Share umbenennen.
Hintergrund ist folgender: in dem Ordner, der mit der Funktion gemonitored wird, sind Userverzeichnisse.Wird hier ein Ordner erstellt, soll er geshared werden (Berechtigung erfolg dann später über NTFS).
Wird ein Ordner umbenannt, weil ich z.B. der Name des Users ändert, würde ich gerne beim Umbenennen des Ordners auch den Share automatisch mitumbenennen.
Deinen Lösungsansatz mit dem Löschen, umbenennen und neu erstellen des shares würde ich gerne testen, leider weiß ich aber nich, wie ich auf den "alten" Ordnernamen zurückgreifen kann, da in meiner Variable $name immer der neue Dateiname steht.
Hast du da eine Idee?
Vielen Dank im Vorausfunction Monitor-Folder{ param([string]$folder) $fsw = New-Object System.IO.FileSystemWatcher $fsw.Path = $folder $global:folderchange = @() $action_create = { $info = @{} $info.Path = $eventArgs.FullPath $info.Type = $eventArgs.ChangeType $global:folderchange = (New-Object PSObject -Property $info) $folderchange $pfad = $folderchange $pfad = $folderchange.path $name = split-path $pfad -leaf -resolve net share $name=$pfad "/GRANT:Everyone,FULL" "/remark:$name" | out-null } $action_change = { $info = @{} $info.Path = $eventArgs.FullPath $info.Type = $eventArgs.ChangeType $global:folderchange = (New-Object PSObject -Property $info) $folderchange $confirm = $true $pfad = $folderchange $pfad = $folderchange.path $name = split-path $pfad -leaf -resolve net share $name=$pfad "/GRANT:Everyone,FULL" "/remark:$name" } Register-ObjectEvent $fsw -EventName Created -Action $action_create -SourceIdentifier Watch1 | Out-Null Register-ObjectEvent $fsw -EventName Renamed -Action $action_change -SourceIdentifier Watch2 | Out-Null }
-
Entschuldigung ! Ich verstehe immer noch nicht so ganz!
Bleiben wir mal bei dem Zenario das der Ordner der geshared ist, Umbenannt werden soll.
Ein Ordner der geshared ist kann nicht umbenannt werden! Man kann den Ordner erst umbenennen wenn man das Sharing aufhebt!
Also stellt sich für dich auch nicht die Frage nach dem alten Namen!???
Oder man liest die Shares vor jeder Aktion aus und loggt das mit. (Vielleicht gibts da auch Windows Log einträge ?)
# Shares auf dem Localen Rechner abfragen Get-WmiObject Win32_Share # Shares auf einem entfernten Server abfragen Get-WmiObject Win32_Share -computerName ServerName # <-- Servernamen hier ändern
Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' ' -
Ich versuche es mal mit einem Beispiel :-)
User Anton hat ein Userverzeichnis. Sowohl der Ordner, als auch der Share heißen Anton.
Jetzt ändert Anton seinen Namen in Emil. Wenn ich jetzt den Ordner in Emil umbenenne, soll der Share auch in Emil umbenannt werden.
Das Funktioniert auch alles mit dem oben geposteten Script, nur eben mit der Continue Meldung, die ich gerne unterdrücken möchte (wenn ich den Ordner umbenenne, bin ich mir auch sicher das ich das möchte).
Das ganze passiert hier:
$action_change = { $info = @{} $info.Path = $eventArgs.FullPath $info.Type = $eventArgs.ChangeType $global:folderchange = (New-Object PSObject -Property $info) $folderchange $confirm = $true $pfad = $folderchange $pfad = $folderchange.path $name = split-path $pfad -leaf -resolve net share $name=$pfad "/GRANT:Everyone,FULL" "/remark:$name" }
Register-ObjectEvent $fsw -EventName Renamed -Action $action_change -SourceIdentifier Watch2 | Out-Nul
wird ein Ordner umbenanntm wird alles in $action_change ausgeführt. Hier würde ich nun gerne - wie du schon erwähnt hast - den alten share (Anton) entfernen und den neuen (Emil) erstellen. Mir fehlt dann nur leider der alte sharename, da der Ordner beim Aufruf bereits Emil heißt.
Hoffe du kannst mir noch folgen?
-
>>>>>Hoffe du kannst mir noch folgen?
Ja ist schon schwer ... ;-))
Wenn du den Ordner umbenennts ist doch alles in Butter weil du den Prozess angestossen hast und den Alten Namen ja wissen müsstest.
Wenn irgendjemand anderes den Ordner umbenennt geht das nicht weil auf dem Ordner ein Share drauf ist!
In der Dokumentation zum Filesystemwatcher gibt es das event Rename !
Dort wir auch der Alte Name und Pfad mitgeliefert !
http://msdn.microsoft.com/de-de/library/system.io.filesystemwatcher.renamed(v=vs.71).aspxIch habe dein Script mal mit den gegebenen Attributen geändert (EDIT: Bug beseitigt!):
function Monitor-Folder{ param([string]$folder) $fsw = New-Object System.IO.FileSystemWatcher $fsw.Path = $folder $global:folderchange = @() $action_create = { $info = @{} $info.Path = $eventArgs.FullPath $info.Type = $eventArgs.ChangeType $global:folderchange = (New-Object PSObject -Property $info) $folderchange $pfad = $folderchange $pfad = $folderchange.path $name = split-path $pfad -leaf -resolve net share $name=$pfad "/GRANT:Everyone,FULL" "/remark:$name" | out-null } $action_rename = { $info = @{} $info.Path = $eventArgs.FullPath $info.Type = $eventArgs.ChangeType $Info.OldPath = $eventArgs.OldFullPath # <- NEU ########################### $Info.OldName = $eventArgs.OldName # <- NEU ########################### $global:FolderRename = (New-Object PSObject -Property $info) $FolderRename $confirm = $true $pfad = $FolderRename $pfad = $FolderRename.path $name = split-path $pfad -leaf -resolve write-Host $('alter Name: ' + $eventArgs.OldName) # <- NEU Ausgabe ########################### write-Host $('neuer Name: ' + $eventArgs.Name) # <- NEU Ausgabe ########################### NET SHARE $eventArgs.OldName "/DELETE" # <- NEU ########################### NET SHARE $name=$pfad "/GRANT:Everyone,FULL" "/remark:$name" } Register-ObjectEvent $fsw -EventName Created -Action $action_create -SourceIdentifier Watch1 | Out-Null Register-ObjectEvent $fsw -EventName Renamed -Action $action_rename -SourceIdentifier Watch2 | Out-Null }
Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '- Bearbeitet Peter Kriegel Mittwoch, 4. Juli 2012 09:39 Code Berichtigt Register Event $Action_rename war falsch!
-
Hallo Savihh !
Da war noch ein Bug drin ! Das "Register-Event $action_rename" war falsch!
Nun habe ich das getestet und es müsste funzen!
function Monitor-Folder{ param([string]$folder) $fsw = New-Object System.IO.FileSystemWatcher $fsw.Path = $folder $global:folderchange = @() $action_create = { $info = @{} $info.Path = $eventArgs.FullPath $info.Type = $eventArgs.ChangeType $global:folderchange = (New-Object PSObject -Property $info) $folderchange $pfad = $folderchange $pfad = $folderchange.path $name = split-path $pfad -leaf -resolve net share $name=$pfad "/GRANT:Everyone,FULL" "/remark:$name" | out-null } $action_rename = { $info = @{} $info.Path = $eventArgs.FullPath $info.Type = $eventArgs.ChangeType $Info.OldPath = $eventArgs.OldFullPath # <- NEU ########################### $Info.OldName = $eventArgs.OldName # <- NEU ########################### $global:FolderRename = (New-Object PSObject -Property $info) $FolderRename $confirm = $true $pfad = $FolderRename $pfad = $FolderRename.path $name = split-path $pfad -leaf -resolve write-Host $('alter Name: ' + $eventArgs.OldName) # <- NEU Ausgabe ########################### write-Host $('neuer Name: ' + $eventArgs.Name) # <- NEU Ausgabe ########################### NET SHARE $eventArgs.OldName "/DELETE" # <- NEU ########################### NET SHARE $name=$pfad "/GRANT:Everyone,FULL" "/remark:$name" } Register-ObjectEvent $fsw -EventName Created -Action $action_create -SourceIdentifier Watch1 | Out-Null Register-ObjectEvent $fsw -EventName Renamed -Action $action_rename -SourceIdentifier Watch2 | Out-Null }
Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '- Als Antwort vorgeschlagen King Julien Freitag, 6. Juli 2012 15:26
- Als Antwort markiert Denniver ReiningMVP, Moderator Dienstag, 10. Juli 2012 16:59
-
Wenn mein Code den alten und den neuen Namen des Ordner ausspuckt und diese Namen mit den Sharenamen übereinstimmen dann stimmt an den NET SHARE befehlen etwas nicht!
Man kann an dieser stelle auch WMI nutzen:
#Erstellen einer Netzwerkfreigabe #Mit der Win32_Share Create() Methode kann man eine Netzwerkfreigabe erstellen: (Get-WmiObject -List -ComputerName . | Where-Object -FilterScript {$_.Name -eq "Win32_Share"}).Create("C:\temp","TempShare",0,25,"test share of the temp folder") #-------------------------------- #Entfernen einer Netzwerkfreigabe # Mit Win32_Share kann man eine Netzwerkfreigabe entfernen. # Dieser Vorgang unterscheidet sich jedoch geringfügig vom Erstellen einer Freigabe, # da anstelle der Win32_Share-Klasse genau die Freigabe abgerufen werden muss, # die entfernt werden soll. Mit der folgenden Anweisung wird die Freigabe "TempShare" gelöscht. (Get-WmiObject -Class Win32_Share -ComputerName . -Filter "Name='TempShare'").Delete()
Ich glaube ab dieser stelle sind wir dann auch soweit, dass (zumindest Ich) dir durch ein Forum nicht mehr weiterhelfen kann.
Wir nutzen hier ebenfalls für die User-Home Verzeichnisse Shares und Ordner die den selben Namen haben wie die User.
Aber wie ich schon gesagt haben, einen Ordner der geshared ist kann nicht umbenannt werden ! (jedenfalls nicht durch den Windows Explorer) Deshalb verstehe ich ab hier nun garnichts mehr.
Ich glaube hier wird das Umbenennen von einem Share und das Umbenenen von einem Order (der geshared ist) durcheinander gebracht!
Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '- Bearbeitet Peter Kriegel Freitag, 6. Juli 2012 10:21