首页 > 解决方案 > “以不同的用户身份运行”与 PowerShell 的行为不同

问题描述

我在运行 PowerShell 脚本时使用“以不同用户身份运行”,它的行为与我在普通 PowerShell 终端中运行脚本时不同。例如,如果我尝试在“运行方式”终端中运行以下代码,则会遇到错误。但是,如果我使用普通终端运行它,它就可以正常工作。

function Replace-Word(
    [string]$Document,
    [string]$FindText,
    [string]$ReplaceText
  )
{
    $ReplaceAll = 2
    $FindContinue = 1

    $MatchCase = $False
    $MatchWholeWord = $True 
    $MatchWildcards = $False 
    $MatchSoundsLike = $False 
    $MatchAllWordForms = $False
    $Forward = $True
    $Wrap = $FindContinue
    $Format = $False

    $Word = New-Object -comobject Word.Application
    $Word.Visible = $False

    $OpenDoc = $Word.Documents.Open($Document)
    $Selection = $Word.Selection

    $Selection.Find.Execute(
    $FindText,
    $MatchCase,
    $MatchWholeWord,
    $MatchWildcards,
    $MatchSoundsLike,
    $MatchAllWordForms,
    $Forward,
    $Wrap,
    $Format,
    $ReplaceText,
    $ReplaceAll
    ) | Out-Null

    $OpenDoc.Close()
    $Word.quit()
}


Copy-Item "C:\Welcome.DOC" "C:\test.DOC"

Replace-Word -Document "C:\test.DOC" -FindText '<UserName>' -ReplaceText "JohnDoe"
Replace-Word -Document "C:\test.DOC" -FindText '<EmailAddress>' -ReplaceText "JohnDoe@example.com"

以不同用户身份运行时遇到的错误是:

You cannot call a method on a null-valued expression.
At C:\Users\lbradstr\Desktop\TechRepo\NewEEsetup\NewUserSetup.ps1:2668 char:9
+         $Selection.Find.Execute($FindText,$MatchCase,$MatchWholeWord, ...
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

You cannot call a method on a null-valued expression.
At C:\Users\lbradstr\Desktop\TechRepo\NewEEsetup\NewUserSetup.ps1:2670 char:9
+         $OpenDoc.Close()
+         ~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

You cannot call a method on a null-valued expression.
At C:\Users\lbradstr\Desktop\TechRepo\NewEEsetup\NewUserSetup.ps1:2668 char:9
+         $Selection.Find.Execute($FindText,$MatchCase,$MatchWholeWord, ...
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

You cannot call a method on a null-valued expression.
At C:\Users\lbradstr\Desktop\TechRepo\NewEEsetup\NewUserSetup.ps1:2670 char:9
+         $OpenDoc.Close()
+         ~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

两个终端都运行相同版本的 PowerShell:

Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      14409  1012  

如果可以的话,我会在普通终端中运行这段代码,但这只是我正在运行的更大脚本的一部分。脚本的其余部分需要管理权限才能运行,这就是我使用“运行方式”功能的原因。关于为什么代码在两个用户帐户之间执行不同的任何想法?任何建议将不胜感激!

标签: powershellterminalrunas

解决方案


其他人的建议仍然适用(一旦对文件的权限和 ACL 进行了排序)并且它仍然给你这个错误......然后:

这是Word中锁定文件的经典案例。您需要从上一个 PowerShell 会话中释放 COM 对象,因为它可能仍在访问文件并导致问题。

释放 COM 对象或关闭所有文字进程后,再次尝试运行 as,它应该可以工作。


推荐阅读