Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Очистка метаданных в файлах microsoft office (http://forum.oszone.net/showthread.php?t=339463)

kudrik_tt 28-02-2019 06:32 2860500

Очистка метаданных в файлах microsoft office
 
Уважаемые форумчане, возникла задача очистить личную информацию в файлах office, нашел пару программ, но работали они не идеально, основной проблемой было что они все меняли дату изменения файла, некоторые работали только со старыми форматами office, некоторые не запускались на серверной версии Windows.
Пришлось с помощью интернета написать скрипт (не очень хороший), который прилагаю ниже, но есть проблема - в excel, если попадается файл с паролем, то excel открывает его и ждет, ввода пароля, можно ли как то сделать, чтобы просто автоматически эти файлы или пропускались или закрывались? Если файлы excel обрабатываются не открываясь, то word и powerpoint почему то открываются, обрабатываются и закрываются, это обязательно? или можно как то поправить, я не большой специалист по Powershell, обычно использую его для отчетов по резервному копированию, да очистки временных файлов.

вот скрипт:
Код:

#Очистка медаданных у файлов Excel
$path = "D:\test\"
$Date = Get-Date -Format "dd.MM.yyyy"
New-Item -Path $PSScriptRoot\MataData -ItemType Directory
Add-Type -AssemblyName Microsoft.Office.Interop.Excel
$xlRemoveDocType = "Microsoft.Office.Interop.Excel.XlRemoveDocInfoType" -as [type]
$excelFiles = Get-ChildItem -Path $path -include *.xls, *.xlsx, *.xlsm -recurse
$objExcel = New-Object -ComObject excel.application
$objExcel.visible = $false
$objExcel.displayalerts = $false
$Errors = 0
$i = 0
"Файлы с удаленной информацией:" | Out-File -FilePath $PSScriptRoot\MataData\logXl-$Date.txt
"Ошибка очистки метаданных:" | Out-File -FilePath $PSScriptRoot\MataData\error-$Date.txt
foreach($dxl in $excelFiles)
{
 try{
    $dateCreXl = $dxl.CreationTime
    $dateLastXl = $dxl.LastWriteTime
    $docXl = $objExcel.workbooks.open($dxl.fullname)
    #$objExcel.displayalerts = $false
    "$dxl" | Out-File -FilePath $PSScriptRoot\MataData\logXl-$Date.txt -Append
    $i = $i + 1
    $docXl.RemoveDocumentInformation($xlRemoveDocType::xlRDIAll)
    $docXl.Save()
    $objExcel.ActiveWorkbook.close()
    $dxl.CreationTime = $dateCreXl
    $dxl.LastWriteTime = $dateLastXl
    }
 catch{
      "$dxl" | Out-File -FilePath $PSScriptRoot\MataData\error-$Date.txt -Append
      $Errors = $Errors + 1
      }
}
$objExcel.Quit()
"Удаление метаданных в файлах Excel завершено! Колличество обработанных файлов - $i; Ошибок: $Errors" | Out-File -FilePath $PSScriptRoot\MataData\logXl-$Date.txt -Append
"Удаление метаданных в файлах Excel завершено! Колличество обработанных файлов - $i; Ошибок: $Errors" | Out-File -FilePath $PSScriptRoot\MataData\error-$Date.txt -Append
#Очистка медаданных у файлов Word
$path = "D:\test\"
Add-Type -AssemblyName Microsoft.Office.Interop.Word
$WdRemoveDocType = "Microsoft.Office.Interop.Word.WdRemoveDocInfoType" -as [type]
$wordFiles = Get-ChildItem -Path $path -include *.doc, *.docx, *.docm -recurse
$objWord = New-Object -ComObject word.application
$objWord.visible = $false
$Errors = 0
$i = 0
"Файлы с удаленной информацией:" | Out-File -FilePath $PSScriptRoot\MataData\logW-$Date.txt
foreach($dwr in $wordFiles)
{
 try{
    $dateCreW = $dwr.CreationTime
    $dateLastW = $dwr.LastWriteTime
    $docW = $objWord.Documents.Open($dwr.fullname)
    #$objWord.CheckCompatibility = $false
    "$dwr" | Out-File -FilePath $PSScriptRoot\MataData\logW-$Date.txt -Append
    $i = $i + 1
    $docW.RemoveDocumentInformation($WdRemoveDocType::wdRDIAll)
    $docW.Save()
    $objWord.documents.close()
    $dwr.CreationTime = $dateCreW
    $dwr.LastWriteTime = $dateLastW
    }
 catch{
      "$dwr" | Out-File -FilePath $PSScriptRoot\MataData\error-$Date.txt -Append
      $Errors = $Errors + 1
      }
}
$objWord.Quit()
"Удаление метаданных в файлах Word завершено! Колличество обработанных файлов - $i; Ошибок: $Errors" | Out-File -FilePath $PSScriptRoot\MataData\logW-$Date.txt -Append
"Удаление метаданных в файлах Word завершено! Колличество обработанных файлов - $i; Ошибок: $Errors" | Out-File -FilePath $PSScriptRoot\MataData\error-$Date.txt -Append
#Очистка медаданных у файлов PowerPoint
$path = "D:\test\"
Add-Type -AssemblyName Microsoft.Office.Interop.PowerPoint
$PpRemoveDocType = "Microsoft.Office.Interop.PowerPoint.PpRemoveDocInfoType" -as [type]
$PpFiles = Get-ChildItem -Path $path -include *.ppt, *.pptx, *.pptm -recurse
$objPp = New-Object -ComObject Powerpoint.application
$objPp.visible = $false
$Errors = 0
$i = 0
"Файлы с удаленной информацией:" | Out-File -FilePath $PSScriptRoot\MataData\logPp-$Date.txt
foreach($pp in $PpFiles)
{
 try{
    $dateCrePp = $pp.CreationTime
    $dateLastPp = $pp.LastWriteTime
    $docPp = $objPp.Presentations.Open($pp.fullname)
    #$objPp.displayalerts = $false
    "$pp" | Out-File -FilePath $PSScriptRoot\MataData\logPp-$Date.txt -Append
    $i = $i + 1
    $docPp.RemoveDocumentInformation($PpRemoveDocType::ppRDIAll)
    $docPp.Save()
    $docPp.close()
    $pp.CreationTime = $dateCrePp
    $pp.LastWriteTime = $dateLastPp
    }
 catch{
      "$pp" | Out-File -FilePath $PSScriptRoot\MataData\error-$Date.txt -Append
      $Errors = $Errors + 1
      }
}
$objPp.Quit()
"Удаление метаданных в файлах PowerPoint завершено! Колличество обработанных файлов - $i; Ошибок: $Errors" | Out-File -FilePath $PSScriptRoot\MataData\logPp-$Date.txt -Append
"Удаление метаданных в файлах PowerPoint завершено! Колличество обработанных файлов - $i; Ошибок: $Errors" | Out-File -FilePath $PSScriptRoot\MataData\error-$Date.txt -Append

Большое спасибо за помощь!

Iska 28-02-2019 07:26 2860506

Цитата:

Цитата kudrik_tt
Если файлы excel обрабатываются не открываясь, »

Открываясь, открываясь:
Цитата:

Код:

    $docXl = $objExcel.workbooks.open($dxl.fullname)


kudrik_tt 28-02-2019 09:42 2860524

Цитата:

Цитата Iska
Открываясь, открываясь: »

Да, открываясь, но окно не выводится на экран, а файлы word и powerpoint, при запуске, отображают на экране окно, потом закрывают и открывают следующее и так далее.

Iska 28-02-2019 17:18 2860602

Цитата:

Цитата kudrik_tt
а файлы word и powerpoint, при запуске, отображают на экране окно, потом закрывают и открывают следующее и так далее. »

Не верю:
Цитата:

Код:

$objWord = New-Object -ComObject word.application
$objWord.visible = $false

$objPp = New-Object -ComObject Powerpoint.application
$objPp.visible = $false


Мало того, что и так свойство .Visible имеет значение False по умолчанию, так его и ещё раз принудительно задают. И всё равно окна Word'а и PowerPoint'а видимы? Не верю.

Цитата:

Цитата kudrik_tt
можно ли как то сделать, чтобы просто автоматически эти файлы или пропускались или закрывались? »

Теоретически можно попробовать поиграться.

kudrik_tt 01-03-2019 13:34 2860696

Ваше удивление, оправдано, но, я думаю связано не с ...visible=$false, а то что эта функция не правильно обрабатывается, и выдает ошибку

Код:

Исключение при задании "visible" : "Не удается преобразовать значение "False" в тип "Microsoft.Office.Core.MsoTriState". Ошибка: "Недопустимое приведение "System.Boolean"
 к "Microsoft.Office.Core.MsoTriState".""
C:\Users\Администратор.WIN-RSML3SOA2AC\Desktop\Remove-ExcelDocumentInformation.ps1:77 знак:1
+ $objPp.visible = $false
+ ~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], SetValueInvocationException
    + FullyQualifiedErrorId : ExceptionWhenSetting


Iska 01-03-2019 20:54 2860766

kudrik_tt, я не пробовал исполнять код. Сейчас попробовал — таки да, именно так. Рекомендуют пользовать параметры метода .Open коллекции .Presentations.

Iska 02-03-2019 00:28 2860826

Цитата:

Цитата Iska
Теоретически можно попробовать поиграться. »

kudrik_tt, ну, вот Вам примерная болванка кода:
Код:

$oExcel = New-Object -ComObject 'Excel.Application'
$oExcel.Visible = True

"C:\Мои проекты\0248\Лист Microsoft Excel.xls", "C:\Мои проекты\0248\Лист Microsoft Excel 2.xls" |`
    ForEach-Object -Process {
        try {
            $oWorkbook = $oExcel.Workbooks.Open($_, $false, $false, 1, "")
            Write-Host $oWorkbook.Worksheets.Item(1).Cells(1, 1).Value()
            $oWorkbook.Close()
        } catch {
            Write-Host 'An error occurred.'
        }
    }

$oExcel.Quit()

Цитата:

Код:

An error occurred.
asd


Мы тупо задаём пустой пароль и пытаемся открыть Рабочую книгу. В примере первая Рабочая книга под паролем, вторая — нет. При работе кода при попытке открытия первой Рабочей книги возникает перехватываемая ошибка, вторая Рабочая книга корректно открывается с пустым паролем, выводится значение первой ячейки, и Рабочая книга закрывается.

kudrik_tt 05-03-2019 13:24 2861496

Цитата:

Цитата Iska
ну, вот Вам примерная болванка кода »

Спасибо за помощь, вот строка с excel, чтобы при пароле, он пропустил этот файл и добавил в ошибку:
Код:

$docXl = $objExcel.workbooks.open($dxl.fullname,0,$false,1,"","",$true,$true,$false,$false)
Чтобы не открывалось окно PowerPoint -
Код:

$docPp = $objPp.Presentations.Open($pp.fullname,$false,$false,$false)
А вот чтобы не открывался word большая загадка, вроде все параметры верно, но вот если в строке
Код:

$docW = $objWord.Documents.Open($dwr.fullname,$false,$false,$false,"","",$false,"","",$false,$false,$true)
изменить последнее $true на $false - программа не обрабатывает файлы, а $true как раз и отвечает за открытие (по умолчанию) в видимом режиме(

Iska 05-03-2019 14:36 2861513

kudrik_tt, для Microsoft Word не нужно использовать данный механизм, он и так по умолчанию работает в невидимом окне.

kudrik_tt 06-03-2019 06:07 2861640

С вордом, если честно все норм, а вот как powerpoint отучить останавливаться на паролях как Excel непонятно, так же как и у Excel по документам не сделаешь.


Время: 19:20.

Время: 19:20.
© OSzone.net 2001-