我正在尝试检测MSOffice是否已将“ Microsoft Word文档”配置为“只读”。
我阅读的所有内容都与使用进行检查有关Get-ItemProperty "C:\tmp\readonly.docx" | Select-Object IsReadOnly
,但是从文件系统级别检查文件是否为“只读”。
问题是Microsoft不在外部标记它,您需要打开/检查我认为的Microsoft COM对象以查询文档是否为只读。
PS C:\Users\Admin> Get-ItemProperty "C:\tmp\readonly.docx" | Select-Object IsReadOnly
IsReadOnly
----------
False
更新:如果文件配置为RO
不带a,Password
则可以简单地以RW
不带提示的方式打开(通过powershell),但是如果带a,Password
则系统会提示您确认RO
状态,这是我要避免的状态,因为它挂了我的脚本。
好的,为此进行测试,我有3个文件,如下所示:
test.docx
,没有任何限制readonly.docx
带密码。这是一个提示让我挂断的文件nopass.docx
带有只读设置,但未配置PWD。A和C不管会打开ReadOnly
设置,但B将挂在提示即使DisplayAlerts
设置为0
。您也无法检查该ReadOnly
属性,除非超过了提示,或者如果您将其设置TRUE
为总是不正确的话。
如果没有第一个openeing文档,就找不到我无法检查ReadOnly
orHasPassword
属性的方法。您可能可以检查XML文件中的HEX,但是我认为这不太可靠。我的方式只是花了一些测试/小技巧才能开始工作。重要的部分是我必须传递密码并在密码失败时进行捕获。A/C
即使您传递了密码参数,Doc的打开效果也会很好,因此不会造成任何伤害。在抓我设置ReadOnly = TRUE
和Visible = TRUE
。您可能不需要将可见部分设置为true,但是如果那样的ReadOnly = TRUE
话,您将无法通过VB
(例如ORIENTATION
)进行某些调整,而我会使用,SENDKEYS
因此我需要UI if ReadOnly = TRUE
。同样,隐藏UI只是一个“奖励”,但不是必需的。如果我继续浪费时间为代码编写代码IF/THEN
,则可以将其设置为始终可见OPENUI
陈述。
无论如何...这是测试这三个文件的最终代码片段,这将导致每个文件打开并带有提示符。
#Constants
Clear-Variable ReadOnly
$missing = [System.Type]::Missing
$str = ''
$PASSWD = 'IsPWDProtected?'
$wdAlertsNone = 0
$FILENAME = "C:\tmp\readonly.docx"
$OPENUI = "TRUE"
#Start Word
$ObjWord = New-Object -comobject Word.Application
IF ($OPENUI -eq "FALSE"){$ObjWord.Visible = $FALSE}ELSE{$ObjWord.Visible = $TRUE}
$ObjWord.Application.DisplayAlerts = $wdAlertsNone
#.Open
IF (!$ConfirmConversions){$ConfirmConversions = $missing}
IF (!$ReadOnly){$ReadOnly = $FALSE}
IF (!$AddToRecentFiles){$AddToRecentFiles = $missing}
IF (!$PasswordDocument){$PasswordDocument = $PASSWD}
IF (!$PasswordTemplate){$PasswordTemplate = $PASSWD}
IF (!$Revert){$Revert = $False}
IF (!$WritePasswordDocument){$WritePasswordDocument = $PASSWD}
IF (!$WritePasswordTemplate){$WritePasswordTemplate = $PASSWD}
IF (!$Format){$Format = 'wdOpenFormatAuto'}
IF (!$Encoding){$Encoding = $missing}
IF (!$Visible){$Visible = $False}
try{$ObjDoc=$ObjWord.documents.open($FILENAME,$ConfirmConversions,$ReadOnly,$AddToRecentFiles,$PasswordDocument,$PasswordTemplate,$Revert,$WritePasswordDocument,$WritePasswordTemplate,$Format,$Encoding,$Visible)}
catch {
Write-Error $_
Write-Host "Opening Read_Only"
$ReadOnly = $TRUE
$Visible = $TRUE
$ObjDoc=$ObjWord.documents.open($FILENAME,$ConfirmConversions,$ReadOnly,$AddToRecentFiles,$PasswordDocument,$PasswordTemplate,$Revert,$WritePasswordDocument,$WritePasswordTemplate,$Format,$Encoding,$Visible)
}
#AllDone?
PAUSE
$ObjWord.ActiveDocument.Close(0)
$ObjWord.Quit()
[gc]::collect()
[gc]::WaitForPendingFinalizers()
[gc]::collect()
[gc]::WaitForPendingFinalizers()
sleep 2
结果:
PS C:\Users\Admin> C:\tmp\test.ps1
C:\tmp\test.ps1 : The password is incorrect. Word cannot open the document. (C:\tmp\readonly.doc)
+ CategoryInfo : NotSpecified: (:) [Write-Error], WriteErrorException
+ FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,test.ps1
Opening Read_Only
Press Enter to continue...:
注意:我OPENUI = TRUE
在测试过程中进行了硬编码,因为如果在关闭UI的情况下将其挂在提示符下,则必须使用tskill winword.exe
并重新开始。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句