• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Szyfrowanie plików w locie na Windowsie

Object Storage Arubacloud
+1 głos
316 wizyt
pytanie zadane 27 października 2021 w Inne języki przez armen10 Początkujący (420 p.)
edycja 27 października 2021 przez armen10

Witam, chciałbym poprosić o pomoc w rozwiązaniu problemu.
Mam 300 plików pdf (przykład: 01nazwisko.pdf, 02nazwisko.pdf).
Chciałbym uzyskać efekt taki, że:

- skrypt listuje i sprawdza wszystkie pliki .pdf w danym folderze.
- jest dodatkowy plik dane.txt, w którym jest nazwisko i hasło. Nazwisko w pliku dane.txt odpowiada nazwie pliku.pdf (przykład:  01nazwisko.pdf=Moj4jasło)
- jeśli listowana nazwa pliku jest równy nazwie w pliku dane.txt, to wykonaj skrypt gs. 

@echo off
:start
cls
for /f "delims== tokens=1,2" %%G in (dane.txt) do (
set %%G=%%H
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dBATCH -dNOPROMPT -dNOPAUSE -dQUIET -sOwnerPassword=%%H -sUserPassword=manan -sOutputFile=%%G.pdf 01nazwisko.pdf
 
)

Mam już coś takiego.
Skrypt pobiera przykładowy plik 01nazwisko.pdf, dodaje z pliku "dane.txt" hasło i wypluwa nowy plik pdf z hasłem  o nazwie 01nazwisko_pass.pdf - Tak bym chciał, aby było, ale nie wiem, jak rozpoznać i dopasować hasło do właściwej nazwy pliku pdf...

Pomógłby mi ktoś z tym ? Albo może wskazał lepszy pomysł ?

Dzięki z góry

1 odpowiedź

0 głosów
odpowiedź 28 października 2021 przez VBService Ekspert (252,740 p.)
edycja 29 października 2021 przez VBService

A może "przetwórz" plik dane.txt za pomocą VBScript.  wink

 

dla przykładu

dane.txt [ dwa ostatnie wiersze dla testu: dublującej się nazwy lub nazwa pliku, który nie istnieje ]

01nazwisko.pdf=Moje01haslo
04nazwisko.pdf=Moje04haslo
05nazwisko.pdf=Moje05haslo
07nazwisko.pdf=Moje07haslo
01nazwisko.pdf=Moje01haslo
10nazwisko.pdf=Moje10haslo

dane_2_pass.vbs  [ edit ]

Option Explicit
 
Dim oFso, oShell, oFile
Dim sWorkingFolder, sFullPathForDataFile
Dim sPrompt, sTitle
Dim arrLines, arrLine, sFileData, sLine, sLinesToWrite
 
Const DATA_FILE_MAIN = "dane.txt", _
      DATA_FILE_PASS = "dane_pass.txt"
 
Const FOR_READING = 1, FOR_WRITING = 2, OVERWRITE_FILE = True
 
Dim GS_ARGUMENTS
GS_ARGUMENTS = "-sDEVICE=pdfwrite -dCompatibilityLevel=1.4 " & _
               "-dBATCH -dNOPROMPT -dNOPAUSE -dQUIET " & _
               "-sOwnerPassword={{password}} -sUserPassword=manan " & _
               "-sOutputFile='{{file_name_pass}}' '{{file_name}}'"
 
 
Set oShell = CreateObject("WScript.Shell")
Set   oFso = CreateObject("Scripting.FileSystemObject")
 
      sWorkingFolder = oShell.CurrentDirectory
sFullPathForDataFile = oFso.BuildPath(sWorkingFolder, DATA_FILE_MAIN)
 
If oFso.FileExists(sFullPathForDataFile) Then
  ' Odczytanie danych z pliku:  dane.txt
  sFileData = oFso.OpenTextFile(sFullPathForDataFile, FOR_READING).ReadAll
   arrLines = Split(sFileData, vbCrLf)
 
  For Each sLine In arrLines
    If Not Trim(sLine) = vbNullString Then
      arrLine = Split(sLine, "=")
     
      If oFso.FileExists(oFso.BuildPath(sWorkingFolder, arrLine(0))) Then
        If Not InString(sLinesToWrite, arrLine(0)) Then
          sLinesToWrite = sLinesToWrite & GS_ARGUMENTS & vbCrLf
            sLinesToWrite = Replace(sLinesToWrite, "{{password}}", arrLine(1), 1, -1, 1)
            sLinesToWrite = Replace(sLinesToWrite, "{{file_name_pass}}", InsertAsSuffix(arrLine(0), "_pass"), 1, -1, 1)
            sLinesToWrite = Replace(sLinesToWrite, "{{file_name}}", arrLine(0), 1, -1, 1)        
        End If
      End If
    End If
  Next
 
  If Len(sLinesToWrite) > 0 Then
    ' Zapisanie danych do pliku:  dane_pass.txt
    Set oFile = oFso.CreateTextFile(oFso.BuildPath(sWorkingFolder, DATA_FILE_PASS), OVERWRITE_FILE)
        oFile.WriteLine sLinesToWrite
        oFile.Close
    Set oFile = Nothing
  Else
     sTitle = "Zwroc uwage na ..."
    sPrompt = Space(4) & "W zadanym folderze:" & vbCrLf & vbCrLf & _
              Space(4) & sWorkingFolder & vbCrLf & vbCrLf & _
              Space(4) & "nie odnaleziono plikow z listy w pliku:  " & DATA_FILE_MAIN
 
    Msgbox sPrompt, vbExclamation + vbOKOnly, sTitle
  End If
Else
   sTitle = "Zwroc uwage na ..."
  sPrompt = Space(4) & "W zadanym folderze:" & vbCrLf & vbCrLf & _
            Space(4) & sWorkingFolder & vbCrLf & vbCrLf & _
            Space(4) & "nie odnaleziono pliku:  " & DATA_FILE_MAIN
 
  Msgbox sPrompt, vbExclamation + vbOKOnly, sTitle
End If
 
Set   oFso = Nothing
Set oShell = Nothing
WScript.Quit 1
 
Function InString(sString, sSearch)
  On Error Resume Next
 
  If InStr(1, sString, sSearch, 1) Then
    InString = True
  Else
    InString = False
  End If
 
  If Not Err.Number = 0 Then
    Err.Clear
    InString = False
  End If
End Function
 
Function InsertAsSuffix(sString, sSuffix)
  On Error Resume Next
 
  Dim arrSplit
 
  arrSplit = Split(sString, ".")
  InsertAsSuffix = arrSplit(0) & sSuffix & "." & arrSplit(1)
 
  If Not Err.Number = 0 Then
    Err.Clear
    InsertAsSuffix = sString Or vbNullString
  End If
End Function

 

plik "wyjściowy"
dane_pass.txt

-sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dBATCH -dNOPROMPT -dNOPAUSE -dQUIET -sOwnerPassword=Moje01haslo -sUserPassword=manan -sOutputFile='01nazwisko_pass.pdf' '01nazwisko.pdf'
-sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dBATCH -dNOPROMPT -dNOPAUSE -dQUIET -sOwnerPassword=Moje04haslo -sUserPassword=manan -sOutputFile='04nazwisko_pass.pdf' '04nazwisko.pdf'
-sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dBATCH -dNOPROMPT -dNOPAUSE -dQUIET -sOwnerPassword=Moje05haslo -sUserPassword=manan -sOutputFile='05nazwisko_pass.pdf' '05nazwisko.pdf'
-sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dBATCH -dNOPROMPT -dNOPAUSE -dQUIET -sOwnerPassword=Moje07haslo -sUserPassword=manan -sOutputFile='07nazwisko_pass.pdf' '07nazwisko.pdf'

todo_gs.bat  czy todo_gs.cmd

@echo off
:start
cls

echo Processing file dane.txt to dane_pass.txt
echo.
start dane_2_pass.vbs
pause

echo.
for /f "delims=," %%G in (dane_pass.txt) do (
  gs %%G  
)

echo.
pause

lub

@echo off
:start
cls

echo.
echo Processing file dane.txt to dane_pass.txt
start /WAIT dane_2_pass.vbs

echo.
for /f "delims=," %%G in (dane_pass.txt) do (
  gs %%G  
)

echo.
pause

 

 

P.S Osobiście, jak bym robił to dla siebie, użył bym zamiast VBScript-u i skryptu cmd, Python-a, ale nie wiem czy możesz użyć Python-a, za to VBScript jest "wbudowany" w Windows-a. wink

komentarz 28 października 2021 przez armen10 Początkujący (420 p.)

Coraz lepiej dzięki bardzo :)
Ale komunikat po odpaleniu "todo_gs.bat" dalej się pojawia... :(
Generują się takie pliki...

 

komentarz 28 października 2021 przez VBService Ekspert (252,740 p.)
edycja 28 października 2021 przez VBService

Bo są spacje w nazwach plików (te zielone podkreślenia na obrazku), pisałem Tobie wyżej, myślałem, że sam sobie poradzisz już z odpowiednimi poprawkami, ale ok.,

 

wydaje Mi się, że wystarczy tu umieścić apostrofy ...

GS_ARGUMENTS = "-sDEVICE=pdfwrite -dCompatibilityLevel=1.4 " & _ 
                                  "-dBATCH -dNOPROMPT -dNOPAUSE -dQUIET " & _ 
                                  "-sOwnerPassword={{password}} -sUserPassword=manan " & _
                                  "-sOutputFile=
'{{file_name_pass}}' '{{file_name}}'"

 

Option Explicit
  
Dim oFso, oShell, oFile
Dim sWorkingFolder, sFullPathForDataFile
Dim sPrompt, sTitle
Dim arrLines, arrLine, sFileData, sLine, sLinesToWrite
  
Const DATA_FILE_MAIN = "dane.txt", _
      DATA_FILE_PASS = "dane_pass.txt"
  
Const FOR_READING = 1, FOR_WRITING = 2, OVERWRITE_FILE = True
  
Dim GS_ARGUMENTS
GS_ARGUMENTS = "-sDEVICE=pdfwrite -dCompatibilityLevel=1.4 " & _
               "-dBATCH -dNOPROMPT -dNOPAUSE -dQUIET " & _
               "-sOwnerPassword={{password}} -sUserPassword=manan " & _
               "-sOutputFile='{{file_name_pass}}' '{{file_name}}'"
  
  
Set oShell = CreateObject("WScript.Shell")
Set   oFso = CreateObject("Scripting.FileSystemObject")
  
      sWorkingFolder = oShell.CurrentDirectory
sFullPathForDataFile = oFso.BuildPath(sWorkingFolder, DATA_FILE_MAIN)
  
If oFso.FileExists(sFullPathForDataFile) Then
  ' Odczytanie danych z pliku:  dane.txt
  sFileData = oFso.OpenTextFile(sFullPathForDataFile, FOR_READING).ReadAll
   arrLines = Split(sFileData, vbCrLf)
  
  For Each sLine In arrLines
    If Not Trim(sLine) = vbNullString Then
      arrLine = Split(sLine, "=")
      
      If oFso.FileExists(oFso.BuildPath(sWorkingFolder, arrLine(0))) Then
        If Not InString(sLinesToWrite, arrLine(0)) Then
          sLinesToWrite = sLinesToWrite & GS_ARGUMENTS & vbCrLf
            sLinesToWrite = Replace(sLinesToWrite, "{{password}}", arrLine(1), 1, -1, 1)
            sLinesToWrite = Replace(sLinesToWrite, "{{file_name_pass}}", InsertAsSuffix(arrLine(0), "_pass"), 1, -1, 1)
            sLinesToWrite = Replace(sLinesToWrite, "{{file_name}}", arrLine(0), 1, -1, 1)        
        End If
      End If
    End If
  Next
  
  If Len(sLinesToWrite) > 0 Then
    ' Zapisanie danych do pliku:  dane_pass.txt
    Set oFile = oFso.CreateTextFile(oFso.BuildPath(sWorkingFolder, DATA_FILE_PASS), OVERWRITE_FILE)
        oFile.WriteLine sLinesToWrite
        oFile.Close
    Set oFile = Nothing
  Else
     sTitle = "Zwroc uwage na ..."
    sPrompt = Space(4) & "W zadanym folderze:" & vbCrLf & vbCrLf & _
              Space(4) & sWorkingFolder & vbCrLf & vbCrLf & _
              Space(4) & "nie odnaleziono plikow z listy w pliku:  " & DATA_FILE_MAIN
  
    Msgbox sPrompt, vbExclamation + vbOKOnly, sTitle
  End If
Else
   sTitle = "Zwroc uwage na ..."
  sPrompt = Space(4) & "W zadanym folderze:" & vbCrLf & vbCrLf & _
            Space(4) & sWorkingFolder & vbCrLf & vbCrLf & _
            Space(4) & "nie odnaleziono pliku:  " & DATA_FILE_MAIN
  
  Msgbox sPrompt, vbExclamation + vbOKOnly, sTitle
End If
  
Set   oFso = Nothing
Set oShell = Nothing
WScript.Quit 1
  
Function InString(sString, sSearch)
  On Error Resume Next
  
  If InStr(1, sString, sSearch, 1) Then
    InString = True
  Else
    InString = False
  End If
  
  If Not Err.Number = 0 Then
    Err.Clear
    InString = False
  End If
End Function
  
Function InsertAsSuffix(sString, sSuffix)
  On Error Resume Next
  
  Dim arrSplit
  
  arrSplit = Split(sString, ".")
  InsertAsSuffix = arrSplit(0) & sSuffix & "." & arrSplit(1)
  
  If Not Err.Number = 0 Then
    Err.Clear
    InsertAsSuffix = sString Or vbNullString
  End If
End Function

 

1
komentarz 29 października 2021 przez armen10 Początkujący (420 p.)

No właśnie pisałem o tym wyżej, że mam pliki ze spacjami i fajnie by było, aby ich nie przerabiać. Obecna poprawka dała efekt, ale widzę światło w tunelu :)
Kurcze tyle kodu było trzeba nastukać, aby coś takiego zrobić szok... 
Skrypt i tak działa super.

komentarz 29 października 2021 przez VBService Ekspert (252,740 p.)

Jak już jesteśmy przy skryptach VB Script, to można je "ubrać" w wersję okienkową, a wygląd tego okienka wykonać za pomocą html-a i css-a, w takiej wersji możemy też wtedy użyć i javascript, a mowa tu o HTML Applications (HTA).

komentarz 29 października 2021 przez armen10 Początkujący (420 p.)
Ja nie znam się na programowaniu tak bardzo...

Podobne pytania

+1 głos
5 odpowiedzi 544 wizyt
pytanie zadane 22 listopada 2018 w Bezpieczeństwo, hacking przez hydro_kg Nowicjusz (150 p.)
0 głosów
1 odpowiedź 717 wizyt
pytanie zadane 13 grudnia 2018 w Systemy operacyjne, programy przez shotokan Nałogowiec (39,660 p.)
0 głosów
2 odpowiedzi 350 wizyt
pytanie zadane 15 października 2018 w C i C++ przez Zayebisty Gaduła (3,200 p.)

92,551 zapytań

141,398 odpowiedzi

319,529 komentarzy

61,936 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...