Jump to content

PS-Close Open/Lockedfile ?


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Moin *gähn* (Die Kaffemaschine ist hinüber und der Anrührkaffee brrr)...,

ich habe hier eine Softwareverteilung - Accessfrontend wird per PowerShell Skript in die home$ Freigaben der einzelnen User verteilt.

 

Problem:

Sollte am andern Ende z.B. übern Terminalserver die Accessdatei noch geöffnet sein - oder anderweitig z.B. VPN ist da am ende Krautsalat - Das Accessfrontend ist hinüber.

 

Was ich möchte:

Geöffnete Dateien via PowerShell schließen ohne "handle.exe".

Ob die Dateien geöffnet sind, sehe ich über eine einfach Funktion - Filestreamcheck.

#Funktion prüft ob Datei gesperrt ist
function TestFileLock ($data)
{
   ## Attempts to open a file and trap the resulting error if the file is already open/locked
   $filepath=$data
   $filelocked = $false
   $fileInfo = New-Object System.IO.FileInfo $filePath
   trap {
       Set-Variable -name Filelocked -value $true -scope 1
       continue
   }
   $fileStream = $fileInfo.Open( [system.IO.FileMode]::OpenOrCreate, [system.IO.FileAccess]::ReadWrite, [system.IO.FileShare]::None )
   if ($fileStream) {
       $fileStream.Close()
   }
   $filelocked
}

#Prüft ob Datei geöffnet - Schließ Zugriff
if(TestFileLock "Pfad zu Datei" -eq $true)
{
   #Falls Datei geöffnet ist, wird Sie hier geschlossen
   echo "offen"
   #Datei schließen 

}
else
{
   echo "nöööt offen"
}

 

Nach gefühlten 3h googlen bin ich nicht weiter. Sollte doch auch einfach via .NET gehen oder sehe ich das falsch ?

 

PS: Bitte keine 3. Anbieter CMDlets oder Tools. Bis jetzt konnte ich alles immer über die PowerShell lösen :) -Ausnahme Azure Backups - da braucht man die SQL 2012 DAC & PS3 << dafür spart man sich 3rd Tools wie Redgate

 

Grüße Admin

 

PS: Mit welcher PS Umgebung entwickelt ihr eigentlich, die PS ISE 3.0 ist ja ein Quantensprung im Vergleich zu der Alten - gibts da noch was besseres ?

Powergui fand ich immer so lala..

Link zu diesem Kommentar

ich habe hier eine Softwareverteilung - Accessfrontend wird per PowerShell Skript in die home$ Freigaben der einzelnen User verteilt.

 

Problem:

Sollte am andern Ende z.B. übern Terminalserver die Accessdatei noch geöffnet sein - oder anderweitig z.B. VPN ist da am ende Krautsalat - Das Accessfrontend ist hinüber.

 

Wa spricht gegen kopieren nur wenn die Datei geschlossen ist? Wenn Du das FE schließt, kann es doch auch sein, dass Du eine Transaktion ungewollt abschießt. Das wäre mir zu heiß.

Link zu diesem Kommentar

Mit der Transaktion hast du nicht unrecht.

Ärgerlich ist allerdings, dass es zu 99,9% Ma sind, die die Session auf dem Terminalserver offen lassen.

 

Bzgl. Workaround habe ich übrigens einen Lösungsansatz.

Die Dateien liegen auf einen Share - Auf dem Server kann ich per /Net File auslesen welcher User auf welche Dokumente Zugriff hat.

Außerdem kann ich diese einfach schließen- Muss mit Adminberechtigungen ausgeführt werden.

 

net file 25 /close

 

Meine Idee ich gebe mir per Net File die Liste aus, gehe anschließend per PS sämtliche Zeilen durch und prüfe diese auf den Pfad zum Accessfrontend.

Abschließend führe ich ein "net file ...\frontend.mdb /close" auf die DB aus.

 

Übrigens... mit Windows Server 2012 wird alles besser, hier gibt es SMB CMDlets und man kann das besser direkt per PS handhaben.

The basics of SMB PowerShell, a feature of Windows Server 2012 and SMB 3.0 - Jose Barreto's Blog - Site Home - TechNet Blogs

Link zu diesem Kommentar
Mit der Transaktion hast du nicht unrecht.

Ärgerlich ist allerdings, dass es zu 99,9% Ma sind, die die Session auf dem Terminalserver offen lassen.

 

TS booten, jetzt das FE kopieren. ;)

 

Meine Idee ich gebe mir per Net File die Liste aus, gehe anschließend per PS sämtliche Zeilen durch und prüfe diese auf den Pfad zum Accessfrontend.

Abschließend führe ich ein "net file ...\frontend.mdb /close" auf die DB aus.

 

Mir wäre das trotzdem zu heiss, ein FE einfach so abzuschiessen.

Link zu diesem Kommentar

Allerdings macht da ein Reboot auch keinen Unterschied, falls er im selben Moment kommt...

Das FE greift übrignes per ODBC auf eine MSSQL DB zu.

Sollte man im 1x1 MSSQL nicht alles in Transaktionen packen ;) ?

Dann wird nix committed und alles wäre gut.

 

Eine einfache Alternative, das FE wird selten aktualisiert - 1mal in 1-2Monaten.

Da aber neue MA oder die neue VS - z.B. da geöffnete war - nachgespielt werden muss, müsste ich hier Quasi ein CSV Log anlegen.

Wenn Anwendung neuer als alte => Überall einspielen und überall wo erfolgreich in die CSV schreiben.

Im nächsten Task Anwendung nicht neuer als Alte => Prüfe Homeshares ob neuer Share im Vergleich zu CSV Liste und ob dort ein altes Datum ist => neu aufspielen

 

Löse das aber nun anders, wenn die Datei geöffnet ist, dann überspringt er das Kopieren.

In die Emailbenachrichtigung wird dann der betroffene User eingefügt und mit angegeben. Alles andere sprengt den Rahmen.

bearbeitet von PowerShellAdmin
Link zu diesem Kommentar
Allerdings macht da ein Reboot auch keinen Unterschied, falls er im selben Moment kommt...

 

Stimmt. ;)

 

Das FE greift übrignes per ODBC auf eine MSSQL DB zu.

Sollte man im 1x1 MSSQL nicht alles in Transaktionen packen ;) ?

Dann wird nix committed und alles wäre gut.

 

Sollte, hätte, könnte, müsste. ;) Hast Du das FE erstellt und den Code im SQL Server geschrieben?

 

Löse das aber nun anders, wenn die Datei geöffnet ist, dann überspringt er das Kopieren.

In die Emailbenachrichtigung wird dann der betroffene User eingefügt und mit angegeben. Alles andere sprengt den Rahmen.

 

Jepp, die Lösung ist aber IMHO trotzdem in Ordnung.

Link zu diesem Kommentar

Sollte, hätte, könnte, müsste. ;) Hast Du das FE erstellt und den Code im SQL Server geschrieben?

Nene das war auch mehr ironisch :)

Jepp, die Lösung ist aber IMHO trotzdem in Ordnung.

 

Ja läuft wunderbar, trotzdem würde ich mich dafür interessieren, wie ich eine Datei ohne Fremdtool unlocken kann. Falls da JEmand was parat hat :)....

 

Grüße Admin

Link zu diesem Kommentar

Nach Rücksprache sollen die geöffneten Accessdbs abgeschossen werden.

Ich habe mich dafür entschlossen dass via net file /close zu lösen -hier gibt es mit W2012 und PS3 die SMB-CMDlets.... das Glück habe ich leider noch nicht (Win7/2008r2 und PS3 reichen hier nicht aus) :)

 

Da der Server noch 2008r2 ist musste ich da jetzt anders vorgehen - Ich nutze den CMD Paramter "net file" um alle offenen Verbindungen anzuzeigen und diese bei der Datei zu schließen.

Leider kriege ich hier nicht direkt ein Objekt, sondern nur eine Ausgabe, die ich mal testweise aufbereitet habe -Yuhu Stringspielereien

 

 

Aufgrund der gekürzten Ausgabe "net file" - die Freigabe z.B. auf E:\Home\...\access.mdb - habe ich hier die Abfrage angepasst.

Ich kenne mich mit DOS-Commandos nicht so aus, kann ich diese nicht auch vollständig anzeigen lassen ? Dann hätte ich hier den sauberen Pfad.

 

Hier die vorläufige Funktion

 

cls
#Funktion schließt Freigabe einer Datei/Freigabe
function close_share ($share_file)
{
  $check_file=  invoke-expression "net file"   
  #Zeilencounter
  [int]$i=0
  foreach ($share in $check_file)
   {
       #Schließt letzte Zeile aus # schließt die Kopfzeile aus #schließt zu kurze Zeilen aus
       if(($check_file.length -gt $i+2) -and ($i -gt 3)-and ($share.Length -gt 5))
       {
           #liest die ID der Zeile
           [string]$zeile= $share
           #$zeile -split (" ")
           $id=$zeile.split(" ")[0]
           $id
           $freigabe=$zeile.split(" ")[(11-$id.length)]
           $freigabe #prüfen E:\Home & \kontierung_front.mdb 
           if($freigabe.Contains("E:\Home") -and $freigabe.Contains("\access.mdb"))
           {
               echo "erwischt"
           }                   
        }
        #Zeilencounter
        $i=$i+1  
   }
}
close_share "sdsd"

bearbeitet von PowerShellAdmin
Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...