【问题标题】:'Run As Different Users' behaves differently with PowerShell“以不同用户身份运行”与 PowerShell 的行为不同
【发布时间】:2018-11-07 19:38:56
【问题描述】:

我在运行 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  

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

【问题讨论】:

  • 错误提示创建$Word对象本身成功,打开文档$OpenDoc = ...失败。你在传递相对路径吗?两个会话中的工作目录是否相同?
  • 通常是权限问题。所选帐户是否有权访问该文件? ///// 同样,$Selection = $Word.Selection 是否正确?它看起来应该是 $Selection = $OpenDoc.Selection,但我无法测试它,因为我使用的是 LibreOffice
  • 如何在 diff 用户下运行? Runas /noprofile .... 如果是这样,请删除 /noprofile,我认为办公应用程序需要加载配置文件
  • 其他账号是否已登录机器并启动了Word?我们确定当您创建 ComObject 时,它不会只是静静地停留在说“欢迎使用 MS Word”的屏幕上,或者正在尝试验证许可证或其他内容吗?尝试将$Word.Visible = $False 更改为$Word.Visible = $True 并在其后添加Start-Sleep -Sec 15,以便在其他用户的上下文中运行时查看应用程序的状态。
  • @mklement0 我正在使用指向单独计算机上共享驱动器的绝对路径。我检查并可以从两个配置文件访问该文件。

标签: powershell terminal runas


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-16
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    相关资源
    最近更新 更多