在PowerShell脚本中以管理员身份运行Command。 UAC

时间:2010-02-11 22:05:26

标签: powershell uac appcmd invoke-command

好的,这是我的问题:

我正在尝试在服务器上远程运行脚本。

我是这两个盒子的管理员,防火墙例外已经到位,远程管理已启用,其他一切看起来都很好,我可以看到。

invoke-command -ComputerName $ComputerName -ScriptBlock `
{
    cd C:\Windows\System32\inetsrv\; 
    ./appcmd.exe ADD vdir /app.name:<SiteName>/ /path:/<VDir Name> /physicalPath:<Path to files>
}

我一直收到以下错误

ERROR ( hresult:80070005, message:Failed to commit configuration changes. Access is denied.

它试图运行的服务器是服务器2k8 R2盒子,我认为问题是UAC问题。无论如何要让它以管理员身份运行而不必在UAC盒子上单击是吗?

这段代码最终将成为一个必须完全自动化的脚本。

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:10)

行。经过一些研究和测试,我发现了这个问题。在禁用UAC和防火墙并且脚本仍无法正常工作之后,我深入挖掘并发现主要问题是invoke-command运行命令的方式。它使用运行脚本的人员的凭据对服务器进行身份验证,然后尝试使用其他帐户来运行权限或降低用户的权限,以便无法运行某些命令。

我将-Credentials开关添加到了invoke命令,现在一切正常。修正了以下代码示例:

$user = New-Object Management.Automation.PSCredential("$UserName", $securePassword)
invoke-command -ComputerName $ComputerName -Credential $user -ScriptBlock ` 
{ 
    cd C:\Windows\System32\inetsrv\;  
    ./appcmd.exe ADD vdir /app.name:<SiteName>/ /path:/<VDir Name> /physicalPath:<Path to files> 
} 

答案 1 :(得分:0)

This似乎表明您需要确保您是远程计算机上的本地管理员(尽管这肯定是针对WMI的)。根据{{​​3}},您可以更改注册表项以停止UAC应用于管理员的远程登录(搜索LocalAccountTokenFilterPolicy)。如果您使用管理员帐户远程使用PowerShell / WMI,则不应禁用UAC,只是不过滤令牌。

答案 2 :(得分:-3)

将HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Policies \ System中的“EnableLUA”选项(DWORD值)设置为0并重新启动。

这会在没有问题的情况下禁用UAC,我会为所有用户执行此操作,无论是否有权限取决于您,因为vista UAC非常可怕,我相信拥有它的人越少越好(至少在vista中)他们是。 Thsi技巧也适用于Win7。

玩我的注册表技巧:)

P.S。:事实证明,SO正在审查评论,显示如何在我的帖子/帖子中使用上述答案来禁用UAC(删除了一个勤奋的答案)。

答案 3 :(得分:-4)

  

无论如何要让它以管理员身份运行而不必在UAC盒子上单击是吗?

如果这是可能的话,那将彻底击败UAC。

因此,看起来您唯一真正的解决方案就是在盒子上禁用UAC。