none
Powershell - Inhalt von "Master" Stick auf angeschlossene Geräte kopieren RRS feed

  • Frage

  • Hallo,

    Auf dem Powershell Gebiet bin ich völliger neuling, nun denn;

    Ich muss ein Script erstellen, mit welchem ich einen USB-Stick (so zus. der Master-Key) auf alle am pc angeschlossenen usb sticks kopieren kann.

    Nun habe ich mich zwar schon ein wenig ins Thema eingearbeitet (policy einstell für script ausführung, etc.), finde jedoch keinen Anfang..

    Kann mir bitte wer eine Starthilfe geben?

    Danke Euch im Voraus

    Sonntag, 20. Mai 2012 13:28

Antworten

  • Also ich würde erst mal alle USB Massen Speicher ermitteln.
    Wie das geht siehst du hier:
    Powershell WMI - Get USB Storage Devices Only
    http://social.technet.microsoft.com/Forums/en-US/winserverpowershell/thread/09c9814a-38fa-4b16-bc8f-01329882a791

    Der Code von jrich ist dafür geeignet USB Speichergeräte zu ermitteln die einen Laufwerksbuchstaben bekommen haben.
    Ich habe den Code etwas verbessert (-like anstatt –eq) und ein Tippfehler entfernt:

    $letters = Get-WmiObject win32_diskdrive | Where {$_.interfacetype -Like "USB"} | ForEach {Get-WmiObject -Query "ASSOCIATORS OF 
    {Win32_DiskDrive.DeviceID=`"$($_.DeviceID.replace('\','\\'))`"} WHERE
    
    AssocClass = Win32_DiskDriveToDiskPartition"} | ForEach {Get-WmiObject -Query "ASSOCIATORS
    
    OF {Win32_DiskPartition.DeviceID=`"$($_.DeviceID)`"} WHERE AssocClass =
    
    Win32_LogicalDiskToPartition"} | ForEach {$_.deviceid}
     
    $letters

    Dann Testes du jeden von diesen Laufwerksbuchstaben (foreach)  mit Test-Path auf das vorhandensein deiner Master Datei / Verzeichnis. Somit weißt du welcher von diesen der Master USB stick ist von dem du Kopieren musst.

    Ein anderer USB Thread der auch Interessant ist:
    Angeschlossene USB-Geräte auslesen
    http://social.technet.microsoft.com/Forums/de-DE/powershell_de/thread/cde023b7-5c01-44fd-83d4-962430ddc1f4

    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 Montag, 21. Mai 2012 06:16
    • Als Antwort markiert policeri Dienstag, 22. Mai 2012 12:29
    • Tag als Antwort aufgehoben policeri Dienstag, 22. Mai 2012 13:01
    • Als Antwort vorgeschlagen Alex Pitulice Mittwoch, 23. Mai 2012 14:53
    • Als Antwort markiert policeri Donnerstag, 24. Mai 2012 12:59
    Montag, 21. Mai 2012 05:59
  • Einen USB Stick zu zählen ist recht einfach. Kommt nur darauf an wie man es haben will…
    Wenn du nur eine USB Stick zählen willst dann kannst du Leicht Textdateien dazu benutzen.

    $ZaehlDatei = 'C:\temp\usbstick1.txt'
    
    
    if (Test-Path $ZaehlDatei) {
        # $ZaehlDatei existiert, Zähler in Datei hochzählen
        # erste Zeile einlesen, hochzählen und zurückschreiben
        [int]$(Get-Content $ZaehlDatei -TotalCount 1) + 1 | Out-File $ZaehlDatei -Force
    }
    else {
        # $ZaehlDatei existiert nicht, Datei mit dem Wert 1 erstellen 
        1 | Out-File $ZaehlDatei -Force
    }
    
    # Anzahl eintragen
    Get-Content $ZaehlDatei -TotalCount 1
    

    Um die USB Sticks immer wieder eindeutig zu identifizieren kannst du hier nicht die DeviceID nehmen!
    ID ist in diesem Falle irreführend da DeviceID den Laufwerksbuchstaben darstellt der sich immer ändern kann!
    Wenn du die USB Sticks immer an denselben Rechner steckst, dann macht das die Registry für dich.
    Sieh hier: http://blogs.technet.com/b/heyscriptingguy/archive/2012/05/18/use-powershell-to-find-the-history-of-usb-flash-drive-usage.aspx

    Du kannst in dem Zweig (Ordner hat den Name mit der Seriennummer des Sticks) wo auch FriendlyName eingetragen ist, einen neuen Wert eintragen den du z.B. FormatCount nennst.
    Zum Auslesen der Serien Nummer kannst du diverse WMI / CIM Klassen benutzen.
    Dann kannst du beim einstecken des Sticks anhand der Seriennummer den Stick wiederfinden.
    Hierzu ist das Property PNPDeviceID in der Klasse Win32_DiskDrive geeignet.
    Siehe hier: http://www.ntzl.org/254928-usb-laufwerk-eindeutig-identifizieren

    Oder … Um dies zu leisten muss du dir ein „Objekt“ erstellen das alle gewünschten Informationen enthält.

    $UsbSticks = Get-WmiObject win32_diskdrive | Where {$_.interfacetype -Like "USB"} | ForEach {
        $PNPDeviceID = $_.PNPDeviceID
        Get-WmiObject -Query "ASSOCIATORS OF {Win32_DiskDrive.DeviceID=`"$($_.DeviceID.replace('\','\\'))`"} WHERE AssocClass = Win32_DiskDriveToDiskPartition"
        } | ForEach {
            Get-WmiObject -Query "ASSOCIATORS OF {Win32_DiskPartition.DeviceID=`"$($_.DeviceID)`"} WHERE AssocClass = Win32_LogicalDiskToPartition"
           } | ForEach { New-Object PSObject -Property @{DriveLetter = $_.DeviceID;PNPDeviceID = $PNPDeviceID; VolumeName = $_.VolumeName; FormatCount = 0 }}
           
    $UsbSticks | fl
    

    Dies Exportierst du in eine CSV oder XML Datei die du dann auch wieder einlesen kannst, um daraus wieder „Objekte“ zu generieren.
    Die Objekte aus der CSV Datei kannst du dann mit den Objekten ($UsbSticks) im Speicher abgleichen.
    Hochzählen tust du natürlich nur in der CSV Datei.

    $UsbsticksCsv = 'C:\temp\CountUsbSticks.csv'
    
    # usbsticks auslesen und in CSV Datei Schreiben
    
    Get-WmiObject win32_diskdrive | Where {$_.interfacetype -Like "USB"} | ForEach {
        $PNPDeviceID = $_.PNPDeviceID
        Get-WmiObject -Query "ASSOCIATORS OF {Win32_DiskDrive.DeviceID=`"$($_.DeviceID.replace('\','\\'))`"} WHERE AssocClass = Win32_DiskDriveToDiskPartition"
        } | ForEach {
            Get-WmiObject -Query "ASSOCIATORS OF {Win32_DiskPartition.DeviceID=`"$($_.DeviceID)`"} WHERE AssocClass = Win32_LogicalDiskToPartition"
           } | ForEach { New-Object PSObject -Property @{DriveLetter = $_.DeviceID;PNPDeviceID = $PNPDeviceID; VolumeName = $_.VolumeName; FormatCount = 0 }} | export-csv $UsbsticksCsv -NoTypeInformation
    
    # Usbsticks aus Datei wieder einlesen
    # Export-CSV hat keinen -Append Parameter!
    # Also vor dem Anhängen eines neuen Usb Sticks immer erst datei einlesen! Und
    # Datei dann wieder komplett neu schreiben
    $UsbSticks = Import-Csv $UsbsticksCsv
    

    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 markiert policeri Donnerstag, 24. Mai 2012 08:49
    Donnerstag, 24. Mai 2012 06:42

Alle Antworten

  • Also ich würde erst mal alle USB Massen Speicher ermitteln.
    Wie das geht siehst du hier:
    Powershell WMI - Get USB Storage Devices Only
    http://social.technet.microsoft.com/Forums/en-US/winserverpowershell/thread/09c9814a-38fa-4b16-bc8f-01329882a791

    Der Code von jrich ist dafür geeignet USB Speichergeräte zu ermitteln die einen Laufwerksbuchstaben bekommen haben.
    Ich habe den Code etwas verbessert (-like anstatt –eq) und ein Tippfehler entfernt:

    $letters = Get-WmiObject win32_diskdrive | Where {$_.interfacetype -Like "USB"} | ForEach {Get-WmiObject -Query "ASSOCIATORS OF 
    {Win32_DiskDrive.DeviceID=`"$($_.DeviceID.replace('\','\\'))`"} WHERE
    
    AssocClass = Win32_DiskDriveToDiskPartition"} | ForEach {Get-WmiObject -Query "ASSOCIATORS
    
    OF {Win32_DiskPartition.DeviceID=`"$($_.DeviceID)`"} WHERE AssocClass =
    
    Win32_LogicalDiskToPartition"} | ForEach {$_.deviceid}
     
    $letters

    Dann Testes du jeden von diesen Laufwerksbuchstaben (foreach)  mit Test-Path auf das vorhandensein deiner Master Datei / Verzeichnis. Somit weißt du welcher von diesen der Master USB stick ist von dem du Kopieren musst.

    Ein anderer USB Thread der auch Interessant ist:
    Angeschlossene USB-Geräte auslesen
    http://social.technet.microsoft.com/Forums/de-DE/powershell_de/thread/cde023b7-5c01-44fd-83d4-962430ddc1f4

    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 Montag, 21. Mai 2012 06:16
    • Als Antwort markiert policeri Dienstag, 22. Mai 2012 12:29
    • Tag als Antwort aufgehoben policeri Dienstag, 22. Mai 2012 13:01
    • Als Antwort vorgeschlagen Alex Pitulice Mittwoch, 23. Mai 2012 14:53
    • Als Antwort markiert policeri Donnerstag, 24. Mai 2012 12:59
    Montag, 21. Mai 2012 05:59
  • Hier noch ein andere alle USB-Geräte ausfinding zu machen, der Trick liegt dabei, dass alle USB-Geräte vom Typ 2 sind.

    $Laufwerke = Get-WmiObject -Class win32_logicaldisk | Where-Object { $_.driveType -eq 2} | Select-Object DeviceID

    Da es sich nachher um ein Object handelt kannst du mit einem Foreach-Object Schleife die einzelnen Laufwerke gemütlich mit dem Test-Path Cmdlet durchgehen. Aber das hat Peter bereits herausgehoben.

    Gruss

    Powershell Junior


    Montag, 21. Mai 2012 07:41
  • Da der Automatisierungsgrad bei einer Aufgabe wie dieser ja eher gering ist (jemand muß eh *manuell* die ganzen Usb-Sticks einstecken und wieder entfernen), stellt sich mir die Frage warum nimmst du nicht eines der unzähligen fertigen Tools mit denen man sowas mit drei Mausklicks machen kann (z.b. N2NCopy )? :)

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Montag, 21. Mai 2012 07:47
    Moderator
  • In dem Englischen Thread den ich angegeben habe, wurde der gebrauch von $_.driveType -eq 2 verworfen, da dieser ein USB Laufwerk übersehen kann!
    Drive Type findet alle Removable Disk(s) also auch CD - und Disketten Laufwerke!
    Drive Type ist also nicht nutzbar für diesen zweck!


    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' '

    Montag, 21. Mai 2012 08:08
  • Danke für die Antworten, Peter konnte mir echt weiterhelfen (Test-Path auf alle Keys).

    Jetzt stehe ich jedoch beim nächsten Problem an..

    Ich muss für die besagten Scripts einen "Counter" erstellen, welcher jedesmal wenn der Key formatiert wird den Count +1 setzt.

    (Selbstverständlich  nur wenn der Key am System mit dem Script angeschlossen ist, d.h. nach jeder formatierung aller angeschlossenen Keys (werden miteinander formatiert, soll der Count der einzelnen Keys (Anhand der Device ID +1 gezählt werden).

    (So dass ich am Ende jeder formatierung mit Hilfe von "| out-File" den count (also die Anzahl durchgefürter formatierungen) auslesen kann.

    Danke schon im Voraus für Eure Hilfe, bin Euch sehr dankbar!

    Dienstag, 22. Mai 2012 12:40
  • Einen USB Stick zu zählen ist recht einfach. Kommt nur darauf an wie man es haben will…
    Wenn du nur eine USB Stick zählen willst dann kannst du Leicht Textdateien dazu benutzen.

    $ZaehlDatei = 'C:\temp\usbstick1.txt'
    
    
    if (Test-Path $ZaehlDatei) {
        # $ZaehlDatei existiert, Zähler in Datei hochzählen
        # erste Zeile einlesen, hochzählen und zurückschreiben
        [int]$(Get-Content $ZaehlDatei -TotalCount 1) + 1 | Out-File $ZaehlDatei -Force
    }
    else {
        # $ZaehlDatei existiert nicht, Datei mit dem Wert 1 erstellen 
        1 | Out-File $ZaehlDatei -Force
    }
    
    # Anzahl eintragen
    Get-Content $ZaehlDatei -TotalCount 1
    

    Um die USB Sticks immer wieder eindeutig zu identifizieren kannst du hier nicht die DeviceID nehmen!
    ID ist in diesem Falle irreführend da DeviceID den Laufwerksbuchstaben darstellt der sich immer ändern kann!
    Wenn du die USB Sticks immer an denselben Rechner steckst, dann macht das die Registry für dich.
    Sieh hier: http://blogs.technet.com/b/heyscriptingguy/archive/2012/05/18/use-powershell-to-find-the-history-of-usb-flash-drive-usage.aspx

    Du kannst in dem Zweig (Ordner hat den Name mit der Seriennummer des Sticks) wo auch FriendlyName eingetragen ist, einen neuen Wert eintragen den du z.B. FormatCount nennst.
    Zum Auslesen der Serien Nummer kannst du diverse WMI / CIM Klassen benutzen.
    Dann kannst du beim einstecken des Sticks anhand der Seriennummer den Stick wiederfinden.
    Hierzu ist das Property PNPDeviceID in der Klasse Win32_DiskDrive geeignet.
    Siehe hier: http://www.ntzl.org/254928-usb-laufwerk-eindeutig-identifizieren

    Oder … Um dies zu leisten muss du dir ein „Objekt“ erstellen das alle gewünschten Informationen enthält.

    $UsbSticks = Get-WmiObject win32_diskdrive | Where {$_.interfacetype -Like "USB"} | ForEach {
        $PNPDeviceID = $_.PNPDeviceID
        Get-WmiObject -Query "ASSOCIATORS OF {Win32_DiskDrive.DeviceID=`"$($_.DeviceID.replace('\','\\'))`"} WHERE AssocClass = Win32_DiskDriveToDiskPartition"
        } | ForEach {
            Get-WmiObject -Query "ASSOCIATORS OF {Win32_DiskPartition.DeviceID=`"$($_.DeviceID)`"} WHERE AssocClass = Win32_LogicalDiskToPartition"
           } | ForEach { New-Object PSObject -Property @{DriveLetter = $_.DeviceID;PNPDeviceID = $PNPDeviceID; VolumeName = $_.VolumeName; FormatCount = 0 }}
           
    $UsbSticks | fl
    

    Dies Exportierst du in eine CSV oder XML Datei die du dann auch wieder einlesen kannst, um daraus wieder „Objekte“ zu generieren.
    Die Objekte aus der CSV Datei kannst du dann mit den Objekten ($UsbSticks) im Speicher abgleichen.
    Hochzählen tust du natürlich nur in der CSV Datei.

    $UsbsticksCsv = 'C:\temp\CountUsbSticks.csv'
    
    # usbsticks auslesen und in CSV Datei Schreiben
    
    Get-WmiObject win32_diskdrive | Where {$_.interfacetype -Like "USB"} | ForEach {
        $PNPDeviceID = $_.PNPDeviceID
        Get-WmiObject -Query "ASSOCIATORS OF {Win32_DiskDrive.DeviceID=`"$($_.DeviceID.replace('\','\\'))`"} WHERE AssocClass = Win32_DiskDriveToDiskPartition"
        } | ForEach {
            Get-WmiObject -Query "ASSOCIATORS OF {Win32_DiskPartition.DeviceID=`"$($_.DeviceID)`"} WHERE AssocClass = Win32_LogicalDiskToPartition"
           } | ForEach { New-Object PSObject -Property @{DriveLetter = $_.DeviceID;PNPDeviceID = $PNPDeviceID; VolumeName = $_.VolumeName; FormatCount = 0 }} | export-csv $UsbsticksCsv -NoTypeInformation
    
    # Usbsticks aus Datei wieder einlesen
    # Export-CSV hat keinen -Append Parameter!
    # Also vor dem Anhängen eines neuen Usb Sticks immer erst datei einlesen! Und
    # Datei dann wieder komplett neu schreiben
    $UsbSticks = Import-Csv $UsbsticksCsv
    

    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 markiert policeri Donnerstag, 24. Mai 2012 08:49
    Donnerstag, 24. Mai 2012 06:42
  • Diw Antwort in diesen Thread bsteht aus zwei Teilen ! Bitte die andere Antwort auch als Antwort Markieren, das Hilft andren User schneller die richtige Antwort zu finden.

    (Markierungen mehrere Posts sind Möglich)


    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' '

    Donnerstag, 24. Mai 2012 09:37