Войти

Показать полную графическую версию : Очистка метаданных в файлах microsoft office


kudrik_tt
28-02-2019, 06:32
Уважаемые форумчане, возникла задача очистить личную информацию в файлах 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
Если файлы excel обрабатываются не открываясь, »
Открываясь, открываясь:
$docXl = $objExcel.workbooks.open($dxl.fullname)

kudrik_tt
28-02-2019, 09:42
Открываясь, открываясь: »
Да, открываясь, но окно не выводится на экран, а файлы word и powerpoint, при запуске, отображают на экране окно, потом закрывают и открывают следующее и так далее.

Iska
28-02-2019, 17:18
а файлы 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
01-03-2019, 13:34
Ваше удивление, оправдано, но, я думаю связано не с ...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
kudrik_tt, я не пробовал исполнять код. Сейчас попробовал — таки да, именно так. Рекомендуют пользовать параметры метода .Open коллекции .Presentations.

Iska
02-03-2019, 00:28
Теоретически можно попробовать поиграться. »
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
ну, вот Вам примерная болванка кода »
Спасибо за помощь, вот строка с 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
kudrik_tt, для Microsoft Word не нужно использовать данный механизм, он и так по умолчанию работает в невидимом окне.

kudrik_tt
06-03-2019, 06:07
С вордом, если честно все норм, а вот как powerpoint отучить останавливаться на паролях как Excel непонятно, так же как и у Excel по документам не сделаешь.




© OSzone.net 2001-2012