matthes74 0 Geschrieben 25. November 2014 Melden Teilen Geschrieben 25. November 2014 Hallo, ich habe mir ein Script gebaut, dass am Ende Dateien zwischen zwei Windows Hosts hin und her kopieren soll. Die entsprechende Zeile ist: ... get-childitem -path \\DCS-LAB-1\c$\backup | Where-Object {$_.LastWriteTime -gt ((get-date).AddDays(-2))} | where-object {$_.name -match "BACKUP_"} | ForEach-Object {copy-Item $_.fullname -Destination \\DCS-LAB-2\c$\backup} ... Starte ich das Script als Administrator, funzt alles super. Starte ich es aus dem Task scheduler, der in unserer Software verankert ist, erhalte ich eine access denied Meldung. Es handelt sich um zwei Windows 2012 Hosts, beide in der gleichen Workgroup, ohne Domain. Bei diesem Software internen Task scheduler kann ich keinen User und kein PW angeben. Gibt es die Möglichkeit diese Angaben in dem Script zu hinterlegen? Als DOS batch mit simplem copy.exe klappt das ganze. Aber ich hätte natürlich gerne nur das Powershell script. Vielen Dank fürs Lesen und ggf. auch Antworten, Matthes Zitieren Link zu diesem Kommentar
Cybquest 36 Geschrieben 25. November 2014 Melden Teilen Geschrieben 25. November 2014 Mein Vorschlag wäre zunächst, nicht die administrativen C$-Freigaben zu verwenden, sondern dieses Backupverzeichnis mit passenden Rechten freigeben. Zitieren Link zu diesem Kommentar
daabm 1.354 Geschrieben 25. November 2014 Melden Teilen Geschrieben 25. November 2014 ...nix gegen PowerShell, aber bitte schau Dir "robocopy /?" an. Das hat alles, was Du da machen willst, schon mit dabei, arbeitet multithreaded und um Größenordnungen schneller... Und wenn Du keinen User angeben kannst UND keine Domäne hast, scheiterst Du an Berechtigungen. Punkt. Ich wüßte nicht, wie Du auf einem Standalone-Rechner andere Computer berechtigen könntest. Und genau das brauchst Du... Zitieren Link zu diesem Kommentar
Cybquest 36 Geschrieben 26. November 2014 Melden Teilen Geschrieben 26. November 2014 @daabm: Kennst Du den Rest dieses Scriptes des TO, bei dem am Ende kopiert werden soll? Oder wie kommst Du darauf, dass Robocopy alles kann, was er braucht? ;) Ich kenne sein Script nicht und auch nicht die Datenmengen, die da kopiert werden, daher würde MIR es schwer fallen, gleich "multithreated" etc. in den Ring zu werfen... :D Zitieren Link zu diesem Kommentar
daabm 1.354 Geschrieben 26. November 2014 Melden Teilen Geschrieben 26. November 2014 Ich kenne den Rest natürlich nicht - aber wenn jemand versucht, Kopierfunktionen nachzubauen, die Robocopy fertig bietet, rollt es mir halt die Fußnägel hoch. Aus leidvoller Erfahrung - wir hatten mal nen Kollegen,der so was mit Perl nachgebaut hat. Performance? Unterirdisch... Zitieren Link zu diesem Kommentar
matthes74 0 Geschrieben 27. November 2014 Autor Melden Teilen Geschrieben 27. November 2014 Hallo, danke für eure Antworten. Ich habe es mit der Freigabe versucht, hat leider nicht funktioniert. Mit Robocopy hätte ich ein Problem, da ich auf diesen Servern keine weitere Software haben möchte / haben darf. Kurz zum Hintergrund; es handelt sich um zwei Storage Virtualisierungs Server, die ausser dieser Virtualisierungssoftware und den Servermanagmentkomponenten keine weitere Software drauf haben. Am Ende des Scriptes werden Backupfiles erstellt. Diese werden auf der Bootpartition im Ordner C:\Backup abgelegt. Hier kann man leider keinen UNC Pfad angeben. Jetzt möchte ich gerne, dass nach der Erstellung der Backup-files, diese zwischen beiden Servern hin und her kopiert werden, falls ein Server mal ausfällt und wiederhergestellt werden muss. Mir reicht also ein copy c:\backup\*.* \\Server2\c$\backup\*.* Wenn ich das o.g. als .bat file im Tasksheduler hinterlege, klappt das auch. Aber wenn ich das mit ...: get-childitem -path \\DCS-LAB-1\c$\backup | Where-Object {$_.LastWriteTime -gt ((get-date).AddDays(-2))} | where-object {$_.name -match "BACKUP_"} | ForEach-Object {copy-Item $_.fullname -Destination \\DCS-LAB-2\c$\backup} mache, erhalte ich eben diese Berechtigungsfehlermeldung. Aber ich möchte gerne das copy-item statt der simplen copy.exe nutzen, weil ich es erstens professioneller finde.... und zweitens ich damit dafür sorgen kann, dass nur die Files der letzten 2 Tage kopiert werden. Seltsam finde ich halt, dass der Befehl in einer Powershell mit Administratorrechten durchläuft, mit dem tasksheduler aber nicht. Dabei wird da doch auch der administrator verwendet... Ich hoffe ich habe euch nicht gelangweilt.... Matthes Zitieren Link zu diesem Kommentar
DocData 85 Geschrieben 27. November 2014 Melden Teilen Geschrieben 27. November 2014 Das sind nicht zufällig DataCore SANsymphony-V Server und du verwendest nicht zufällig ein PowerShell Script um die Config der Storage Server zu sichern? Zitieren Link zu diesem Kommentar
matthes74 0 Geschrieben 27. November 2014 Autor Melden Teilen Geschrieben 27. November 2014 zufällig schon ;-) mein Script prüft ob es bereits ein dcsbackuppath gesetzt ist, und erstellt dann das Backupscript auf der C Platte und erstellt automatisch den nötigen Datacore Task um jeden Tag das Backup zu starten. Praktisch um Kundensysteme schnell zu konfigurieren. Jetzt fehlt halt nur noch, dass die Backupfiles zwischen beiden Datacore Servern hin und her kopiert werden.... Matthes Zitieren Link zu diesem Kommentar
DocData 85 Geschrieben 27. November 2014 Melden Teilen Geschrieben 27. November 2014 Ihr verwendet den integrierten Scheduler, also die Automated Tasks, um zu einer bestimmten Uhrzeit ein PoSh Skript auszuführen? Kannst du das Skript hier mal posten? Zitieren Link zu diesem Kommentar
matthes74 0 Geschrieben 27. November 2014 Autor Melden Teilen Geschrieben 27. November 2014 hmm komplett ist schwierig, da immer wieder Kommentaren und interna unserer Firma drinne stehen... hier die wichtigsten Auszüge: Das script erzeugt eine ps1 datei auf der C: Platte des DCS: Add-Content -path $scriptfile "`$bpKey = 'BaseProductKey'"Add-Content -path $scriptfile "`$regKey = Get-Item `"HKLM:\Software\DataCore\Executive`""Add-Content -path $scriptfile "`$strProductKey = `$regKey.getValue(`$bpKey)"Add-Content -path $scriptfile "`$regKey = Get-Item `"HKLM:\`$strProductKey`""Add-Content -path $scriptfile "`$installPath = `$regKey.getValue('InstallPath')"Add-Content -path $scriptfile "Import-Module `"`$installPath\DataCore.Executive.Cmdlets.dll`" -DisableNameChecking -ErrorAction Stop"Add-Content -path $scriptfile "Connect-DcsServer"Add-Content -path $scriptfile "Backup-DCSConfiguration"Add-Content -path $scriptfile "Disconnect-DcsServer" Add-Content -path $scriptfile "get-childitem -path \\$dcsSrvLoc`\$dcsLocBackShort | Where-Object {`$_.LastWriteTime -gt ((get-date).AddDays(-2))} | where-object {`$_.name -match `"BACKUP_`"} | ForEach-Object {copy-Item `$_.fullname -Destination \\$dcssrvrem`\$dcsRemBackShort}"Add-Content -path $scriptfile "get-childitem -path \\$dcsSrvRem`\$dcsRemBackShort | Where-Object {`$_.LastWriteTime -gt ((get-date).AddDays(-2))} | where-object {`$_.name -match `"BACKUP_`"} | ForEach-Object {copy-Item `$_.fullname -Destination \\$dcssrvloc`\$dcslocBackShort}" dann frage ich ab, ob ältere Backups gelöscht werden sollen, wenn ja ab welchem Alter (in Tagen) und füge das dazu: Add-Content -path $scriptfile "get-childitem -path \\$dcsSrvLoc`\$dcsLocBackShort | Where-Object {`$_.LastWriteTime -lt ((get-date).AddDays(-$deletetag))} | where-object {`$_.name -match `"BACKUP_`"} | ForEach-Object {Remove-Item `$_.FullName -force -recurse}" Add-Content -path $scriptfile "get-childitem -path \\$dcsSrvRem`\$dcsRemBackShort | Where-Object {`$_.LastWriteTime -lt ((get-date).AddDays(-$deletetag))} | where-object {`$_.name -match `"BACKUP_`"} | ForEach-Object {Remove-Item `$_.FullName -force -recurse}" Dann sorge ich dafür, dass der in SSY V enthaltene Taskscheduler einen Task erhält: add-dcstask -Name Backuptask -Description "Durch Script erzeugter Backuptask"Add-DcsAction -Task Backuptask -Server $dcsSrvLoc -ScriptAction PowerShell -FilePath c:\support\backup-dcs.ps1Add-DcsTrigger -Task Backuptask -DayInterval 1 -StartTime "01/01/2014 3:56:00 PM" -SignalDuration "00:00:00" Zitieren Link zu diesem Kommentar
DocData 85 Geschrieben 27. November 2014 Melden Teilen Geschrieben 27. November 2014 (bearbeitet) Schau dir mal dieses Skript an. Nicht von mir, aber es funktioniert bei vielen meiner Kunden. *klick* Es muss nur auf einem Storage Server ausgeführt werden, es funktioniert per Windows Scheduler und am Ende kannst du gerne einen Eintrag reinmachen, der dir das aktuellste CAB File irgendwohin kopiert. Es ist aber auch völlig okay auf den Storage Server robocopy (es ist bei 2012 eh dabei...) zu nutzen oder einen Backupagent eurer Backupsoftware zu installieren. Wenn du den internen Scheduler verwendest, dann läuft der Task übrigens als DcsAdmin, nicht als Administrator. Das erklärt warum es bei dir als Admin funktioniert, aus dem Scheduler heraus aber nicht. bearbeitet 27. November 2014 von DocData Zitieren Link zu diesem Kommentar
matthes74 0 Geschrieben 27. November 2014 Autor Melden Teilen Geschrieben 27. November 2014 sehr interessant und hilfreich, danke dir! Danke auch für den Hinweis mit dem dcsadmin, hatte das nicht auf dem Schirm, das dieser User den Task ausführt. Zitieren Link zu diesem Kommentar
DocData 85 Geschrieben 27. November 2014 Melden Teilen Geschrieben 27. November 2014 Sollte IMHO so sein, habe gerade keine Maschine hier um das zu testen. Ich bin mir aber relativ sicher das es so ist. Daher würde ich den integrierten Windows Scheduler verwenden. Wie gesagt: Das Skript muss nur auf einem der Server in der Gruppe ausgeführt werden. Das Backup wird auf jeder Maschine unter C:\\SSVBACKUP abgelegt. Theoretisch kann der Aufruf des Skriptes sogar von einem Client aus erfolgen, so dass auf dem Server nur das Backupfile abgeholt werden muss. Eine Dateirotation hat das Skript auch. Da hat sich der Autor Mühe gegeben! Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.