【问题标题】:Powershell self-elevate loopPowershell 自提升循环
【发布时间】:2022-11-22 02:44:17
【问题描述】:

我是我们公司的 IT 管理员之一。最近,网络安全部门希望对用户在 U 盘和外部大容量存储设备上读取和/或写入数据的难易程度采取更严格的措施。此外,所有获得新 Windows 笔记本电脑的新用户将只有“非管理员”权限。安装软件等的所有请求都必须通过 IT 服务台。

已创建 Active Directory OU,并已将一些测试笔记本分配给它。我的老板希望我编写和测试一些 Powershell 脚本,这些脚本允许我和我的同事(在与用户的屏幕共享会话中)暂时删除控制 USB 存储访问的注册表项(直到下一个组策略更新到来)沿着)。困难的部分已经解决了。目的是脚本将作为 Nal-Object 存储在 ZenWorks 上,因此用户将无法看到源代码(有点类似于只需双击的 exe 文件)。

造成麻烦的代码......

# self-elevate to admin user - code at the very top of the PS file..
if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
Start-Process PowerShell -Verb RunAs "-NoProfile -ExecutionPolicy Bypass -Command `"cd '$pwd'; & '$PSCommandPath';`"";
exit;}

# all the main code follows..

在这里,如果我运行脚本(在非管理员帐户中),UAC 会提示我输入本地(或域)管理员帐户的名称和密码,PS 中的新窗口/会话打开,我可以运行任何主要的命令需要运行。

然而,问题是当提示输入凭据然后输入本地非管理员帐户的正确密码时(因为某些用户不可避免地会这样做!)一个新的空 PS 窗口/会话只是以周期性的方式无限期地打开.

我还尝试在 if 语句中添加一个“else 子句”(向用户显示警报和/或强制退出 Powershell,但它似乎永远不会被执行)。

当我在计算机上测试它是不是任何域等的一部分时,我只是在 UAC 中收到“用户未被授权”的警报,并且没有错误有机会传播。

有什么解决方法吗?如果 UAC 提示只是默认为名称“ROOT\install”,那就太好了。除了 IT 管理员外,没有人知道此帐户的密码。

我也跑过获取执行策略列表... MachinePolicy 和 LocalMachine 是“RemoteSigned”,其他一切都是“未定义”。

我不认为执行策略在这个奇怪的循环中发挥作用,但我愿意犯错。我正在测试的脚本没有通过任何签名程序等,只是位于其中一台测试计算机的本地桌面上。

谢谢。

【问题讨论】:

  • 所以,您只是想循环直到输入正确的凭据?此外,您可以使用指向 pscredential 对象的 -Credential 参数。这应该会给您更大的灵活性,因为您可以使用用户名填充Get-Credential,例如:Get-Credential -UserName 'ROOT\Install' -Message 'test'
  • 循环是我要避免的。如果非管理员用户提交了正确的 AD 用户名和密码,就会出现新/空 PS 窗口的永无止境循环。我更愿意看到用户看到 GUI 警报并关闭 PS。
  • 那么要求用户停止提交凭据?
  • 如果用户不是管理员,您是否在询问如何添加额外的检查以停止创建新进程?
  • 但是,如果用户提供了不正确的凭据,则不会弹出新会话,只是会出现一个错误,说明凭据无效,对吗?

标签: powershell active-directory group-policy


【解决方案1】:

你的症状很神秘;它意味着以下内容:

  • Start-Process -Verb RunAs触发的UAC提示错误接受了一个-admin 用户的凭据。

  • 重新进入脚本后,测试会话是否被提升 (!([Security.Principal.WindowsPrincipal] ...) 然后失败,并再次运行 Start-Process -Verb RunAs,此时显示 UAC 提示,因为 Start-Process认为会话被提升并且即刻产生一个新窗口。

    • 结果是无限循环。

我不知道是什么导致了这种差异 - 如果您发现了,请告诉我们。


作为解决方法,您可以尝试以下方法:

if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
  $passThruArgs = "-NoProfile -ExecutionPolicy Bypass -NoExit -Command `"cd `"$pwd`"; & `"$PSCommandPath`""
  if ([Environment]::CommandLine -match [regex]::Escape($passThruArgs)) {
    throw "You entered non-admin credentials. Please try again with admin credentials."
  }
  Start-Process PowerShell -Verb RunAs $passThruArgs
  exit
}

# all the main code follows..
'Now running elevated...'

也就是说,在重新进入时,将检查进程命令行是否包含在提升的重新调用时传递的相同参数。如果是这样,这意味着即使 UAC 提示接受了凭据,新会话仍未提升,并且会引发错误。

请注意,我已将 -NoExit 添加到重新调用中,以便新窗口保持打开状态,从而可以检查结果。

【讨论】:

    猜你喜欢
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 2020-01-27
    相关资源
    最近更新 更多