尽管是管理员,但对 localhost 的访问被拒绝 - PowerShell

Posted

技术标签:

【中文标题】尽管是管理员,但对 localhost 的访问被拒绝 - PowerShell【英文标题】:Access is denied to localhost despite being administrator - PowerShell 【发布时间】:2016-07-26 23:47:40 【问题描述】:

好的,所以这一直困扰着我一段时间,我现在尝试了太多东西。 我正在尝试运行 PowerShell 脚本 - 我的用户帐户是域上的常规用户帐户,但它是我计算机上的本地管理员。因此,我创建了一个 PowerShell 脚本,提示我输入凭据(我在其中键入域管理员帐户的凭据)以用于调用另一个需要此域管理员提升的脚本。 该脚本如下所示:

Invoke-Command -FilePath "C:\Temp\script.ps1" -ComputerName localhost -Credential Get-Credential

这里的script.ps1 是需要域管理员提升的脚本。 执行显示的脚本会提示输入凭据,然后出现以下错误:

[localhost] Connecting to remote server localhost failed with the following error message : Access is denied.

我尝试过使用如下所示的 .bat 文件:

SET ThisScriptsDirectory=%~dp0
SET PowerShellScriptPath=%ThisScriptsDirectory%script.ps1 PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File ""%PowerShellScriptPath%""' -Verb RunAs";

同样,但我无法让它工作 - 它没有将脚本提升到域管理员级别。 最后,我需要提一下,如果我用域管理员提升打开 PowerShell,导航到 C:\Temp\script.ps1 并通过 .\script.ps1 执行它,我想用域提升运行的脚本是有效的。

有什么建议吗?

【问题讨论】:

如果您只是想在本地机器上执行脚本,为什么要使用invoke-command?您可以在您的 powershell 主机中运行脚本并将参数传递给它。 【参考方案1】:

如果您具有本地管理权限,请以管理员身份运行 powershell 并运行 Invoke-Command 而不带 -Credential 标志。

如果您只是在本地运行脚本,则不需要Invoke-Command。你最好只运行脚本并向它传递参数。

【讨论】:

本地管理员权限不够,我需要我的域管理员权限。 以本地管理员身份将域管理员添加到本地计算机,以其他用户身份运行powershell(右键单击以获取上下文菜单中的“以其他用户身份运行...”),输入DA凭据然后运行您的脚本。我经常在工作中使用我的大量管理帐户进行此操作,用于交换、AD 和域本地管理员帐户。 Invoke-Command 有一个 -AsJob 参数使其非阻塞,并且一些脚本可能在不同的系统上运行,包括 localhost。【参考方案2】:

好吧,如果我理解正确,你就错了。

您提供的凭据用于访问 localhost(您不需要 BTW)。脚本仍然未提升地执行。有两种解决方案:

您需要提升 powershell 本身并执行脚本。 您需要更改脚本,使其本身接受 Credential 参数并使用它来访问事物。在您展示脚本之前,我无话可说。

您可以通过以下方式提升外壳:

 start powershell -verb Runas

这里的问题是除非你禁用UAC,否则它会提示你。不幸的是,我知道没有简单的方法可以解决这个问题。一种可靠的方法是将脚本添加到任务计划程序并将任务设置为提升运行,然后运行它并删除任务。所有这些都可以自动化。这是 UAC 系统设计不幸的结果(Linux 上用于相同目的的 sudo 会将响应缓存一段时间,以便后续命令不会提示)。这会是这样的:

  schtasks /Create /TN runner ... /TR powershell -File script.ps1 /RU username /RP password /RL HIGHEST
  schtasks /run runner
  schtasks /delete runner

【讨论】:

我已经尝试过您的第一个解决方案 - 如前所述 - 但我想不出一种方法来自动化该过程。它需要提升为域管理员,而不是本地管理员。该脚本正在 AD 中创建用户并修改一些其他 AD 和 Exchange 内容,这是为域管理员保留的任务,我的本地管理员无法访问。 它是在域中还是在本地无关紧要。只需使用/RU domain\username。您的脚本也可以接受-Credential 参数,并使用Get-Credential 传递它。然后,您可以使用schtasks.exe(您必须提取密码)或接受凭据的更新的 TaskScheduler cmdlet (>= Win8)。 好的,尝试这样做:schtasks /Create /TN createUser /TR "powershell -File script.ps1" /RU domain\user /RP /RL HIGHEST /SC MONTHLY 但它似乎没有执行脚本。当我运行任务时,cmd 会输出这个:SUCCESS: Attempted to run the scheduled task "createUser". 你必须运行脚本,它只会创建一个作业。之后使用SCHTASKS /Run /TN createUser 或使用任务计划程序对其进行测试(右键单击-> 运行)。 这就是我所做的——这就是 CMD 输出该消息的地方。【参考方案3】:

对我有帮助的一个主题(我有一个类似的案例)是About Remote Troubleshooting 中的“如何为非管理员用户启用远程处理”部分。基本上,它会告诉您执行 PS 命令:Set-PSSessionConfiguration Microsoft.PowerShell -ShowSecurityDescriptorUI 并向您尝试使用它的用户授予执行权限。

【讨论】:

【参考方案4】:

使 PSRemoting 服务自动启动

在主机和远程机器上

Set-Service winrm -StartupType Automatic 
Start-Service winrm

启用 PSREmoting

在主机和远程机器上

EnablePSRemoting -Force

将计算机添加到受信任的主机

在远程机器上

Set-Item wsman:\localhost\Client\TrustedHosts -Value "$(hostname),*$((Get-WmiObject Win32_ComputerSystem).Domain)"

在 Powershell 远程处理中启用多跳

确定哪些主机允许传递 Creds

Enable-WSManCredSSP –Role Client –DelegateComputer   "$(hostname),*$((Get-WmiObject Win32_ComputerSystem).Domain)"

在源机器上。

Enable-WSManCredSSP –Role Server

您必须指定身份验证和凭据

在主机上

$Cred = [System.Management.Automation.PSCredential]::new("<username>",$("<Password>" | ConvertTo-SecureString -AsPlainText -Force))
invoke-command -ComputerName localhost -ScriptBlock Write-Host $args[0] -ArgumentList "Hello!, It Works" -Authentication Credssp -Credential $cred

参考

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_remote_troubleshooting?view=powershell-6

【讨论】:

以上是关于尽管是管理员,但对 localhost 的访问被拒绝 - PowerShell的主要内容,如果未能解决你的问题,请参考以下文章

尽管使用了 CORS,但对 expressjs 的 POST 请求不起作用

Google Play管理目标受众群体 ( 加入“亲子同乐计划“ 由于政策原因 “更新被拒“ 后的处理 )

mysqldump 错误 1045 访问被拒绝,尽管密码正确等

用winscp访问Ubuntu互传文件被拒???跪求大神

“aaaaa”存储库的拉取访问被拒绝不存在或可能需要“docker login”

Rails 服务器和 React 客户端:尽管来源相同,但 CORS 问题