如何在 Powershell 脚本中提供管理员凭据

Posted

技术标签:

【中文标题】如何在 Powershell 脚本中提供管理员凭据【英文标题】:How to supply Admin credentials in Powershell script 【发布时间】:2018-04-03 19:10:46 【问题描述】:

我已经创建了一个登录脚本,它将从每台计算机上的本地管理员组中删除用户。整个过程必须完全安静地运行。 Powershell 脚本必须以管理员身份运行,并且我有以下代码可以自我提升我的脚本:

# Self-elevate the script (Run as Administrator)
if (-Not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] 'Administrator')) 
 if ([int](Get-CimInstance -Class Win32_OperatingSystem | Select-Object -ExpandProperty BuildNumber) -ge 6000) 
  $CommandLine = "-File `"" + $MyInvocation.MyCommand.Path + "`" " + $MyInvocation.UnboundArguments 
  Start-Process -FilePath PowerShell.exe -Verb Runas -ArgumentList $CommandLine -WindowStyle Hidden
 

唯一的问题是,对于最终用户,当他们登录时,自我提升需要管理员用户名和密码。我需要自动提供管理员凭据,以保持整个过程完全静默运行。如何提供管理员凭据?见图片链接: https://i.stack.imgur.com/HpmbD.png

谢谢!

【问题讨论】:

机器都在一个域中吗? 没有安全的方法可以使用登录脚本来执行您尝试执行的操作。您不能在 netlogon 共享上存储密码,除非所有域用户都可以访问该密码。 gpo 是执行此操作的正确方法,您可以根据需要精确配置本地管理员组,而无需留下(有效的)域管理员密码。 将其作为启动脚本而不是登录脚本运行。 组策略“本地用户和组”首选项是处理此问题的正确方法。不要使用脚本。 机器都在同一个域中。问题是我们只想从每台计算机的本地管理员组中删除某些类型的用户。我很欣赏这些建议,但我会坚持我的剧本。我的脚本正在按我的意愿工作。我只需要向图像中显示的字段提供管理员凭据。 @brendan62269 【参考方案1】:

组策略确实是要走的路,但如果你对你的脚本绝对死心,你可以创建一个计划任务,将你的脚本作为 SYSTEM 执行。确保该脚本不在用户可写空间中,否则攻击者将根据自己的喜好对其进行修改,并将其恶意代码作为 SYSTEM 执行。

正如@brendan62269 指出的那样,如果您确实在 netlogon 共享上放了一个密码,攻击者将花费很短的时间来获取它,了解它是什么,转到您的域控制器,删除 NTDS .dit,并拥有您的整个环境。

【讨论】:

您能解释一下如何实现组策略方式吗? 搜索“组策略首选项本地用户和组”。这不是 *** 问题。 更好的链接(更多图片)linklink

以上是关于如何在 Powershell 脚本中提供管理员凭据的主要内容,如果未能解决你的问题,请参考以下文章

如何使用本地计算机帐户作为 PSExec 的凭据

通过 powershell 脚本避免微软登录弹出窗口

在 PowerShell 脚本中访问 Windows 任务凭据

Microsoft Graph PowerShell v2 发布公开预览版 - 新的身份验证方法,支持解除阻塞场景,脚本迁移工具

Microsoft Graph PowerShell v2 发布公开预览版 - 新的身份验证方法,支持解除阻塞场景,脚本迁移工具

Microsoft Graph PowerShell v2 发布公开预览版 - 新的身份验证方法,支持解除阻塞场景,脚本迁移工具