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

11

我的问题是:我想在服务器上远程运行一个脚本。

我在这两个盒子上都是管理员,防火墙例外已经设置好了,远程管理也已启用,其他一切看起来都很正常。

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.

它试图运行的服务器是一个server 2k8 R2盒子,我想问题是UAC问题。有没有办法在不必点击UAC框的情况下以管理员身份运行它?

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

任何帮助都将不胜感激。


好的,这不是 UAC 的问题。我已经禁用了 UAC,防火墙和其他可能干扰的东西。我还按照 Tyranid 建议的更改注册表,但都没有起作用。很奇怪,它显示操作成功,然后又给出访问被拒绝的错误。 - Tim
你能在远程 PowerShell 实例上运行 'whoami /all' 命令,查看你实际拥有的权限吗? - tyranid
我运行了该命令,它列出了我的域帐户名称、我在域中所属的组以及一系列特权。所有特权都是管理员级别且启用的,其中一个列出的组在管理员组中,一切看起来都正确。 - Tim
4个回答

10

好的。经过一些研究和测试,我找出了问题所在。禁用UAC和防火墙后,脚本仍然无法工作,我深入挖掘发现主要问题在于invoke-command运行命令的方式。它使用运行脚本的人的凭据进行身份验证以连接到服务器,然后尝试使用另一个帐户来运行权限或降低用户权限,以使某些命令无法运行。

我在invoke command中添加了-Credentials开关,现在一切正常。以下是更正的代码示例:

$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> 
} 

那么,当编写需要管理员权限的脚本时,除了在脚本中以明文形式存储用户名和密码之外,没有更好的方法了吗?真的吗?将服务作为管理员运行还不够吗...编写需要管理员权限的脚本的最佳实践是什么?比如说,Windows服务安装。 - Stéphane
1
另一种选择是让用户通过 Get-Credential 命令来输入凭据。 - riezebosch
Tim,请问你能在这里帮忙吗?https://stackoverflow.com/q/66920815/38108 - Graham Perrin

0

似乎表明你需要确保在远程机器上是本地管理员(尽管这仅适用于WMI)。根据这里, 你可以更改注册表项以阻止UAC应用于管理员的远程登录(搜索LocalAccountTokenFilterPolicy)。 这不应该禁用UAC,只是不过滤令牌,如果您使用管理员帐户远程使用powershell/WMI。


-3

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

这将无障碍地禁用UAC,我建议您为所有用户执行此操作,是否需要获得许可取决于您自己。

这个技巧在Windows Vista和Windows 7中同样适用。


2
我认为他们不会以你意思的方式对你进行审查。 我的最佳猜测是,您推荐了某些东西,可能会给普通用户带来安全风险。 无论这是否成功实现,UAC都存在于某种原因,超出了本问题的范围 ;) - Kounavi
@Kounavi 嗯,是的,你说得对。这超出了本问题的范围,这就是为什么我回答了问题,并在旁边加上了我的其他评论作为旁注。如果某些事情以如此可怕的方式完成,应该抗议并禁用以教育开发人员。更重要的是,由此带来的灾难远远超过了它提供的安全性,这也是Vista成为巨大灾难的主要原因之一。 - Erx_VB.NExT.Coder

-4
有没有办法在不点击UAC框上的“是”按钮的情况下以管理员身份运行此程序?
如果这是可能的,那么UAC的作用就完全被打败了。
因此,您唯一真正的解决方案似乎是禁用该计算机上的UAC。

不幸的是,禁用UAC并不是一个选项,因为它将在高可见度服务器上运行。希望有人能够找到解决方案或解决方法。也许我只是做错了什么。 - Tim
另一种选择是让启动这些脚本的任何东西都以提升的权限运行 - 然后它可以生成其他提升的进程,而无需再次进行UAC确认。 - Anon.
我唯一的问题是它是否会在远程环境下继续运行。该脚本将从管理服务器上运行不同的命令来控制多个服务器。因此,服务器A(mgmt)会在服务器1、2和3上远程运行命令。如果进程在服务器A上以提升权限运行,那么它是否也会在服务器1、2和3上以提升权限运行? - Tim
当然,如果你正在管理员模式下运行程序,你可以禁用UAC(用户账户控制),但是否这样做是个不同的问题。请阅读我的回答。 - Erx_VB.NExT.Coder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接