Powershell自升降环

qni6mghb  于 2022-12-13  发布在  Shell
关注(0)|答案(1)|浏览(135)

我是我们公司的一名IT管理员。最近,网络安全部门希望对用户在U盘和外部大容量存储器上读取和/或写入数据的难易程度变得更加严格。此外,所有获得新Windows笔记本电脑的新用户将只有“非管理员”权限。所有安装软件等的请求必须通过IT部门。
Active Directory OU已创建,并且一些测试笔记本已分配给它。我的老板希望我编写并测试一些Powershell脚本,以便我和同事(在与用户的屏幕共享会话中)临时删除控制USB存储访问的注册表项(直到下一个组策略更新沿着)。困难的部分已经被处理了。目的是脚本将被存储为ZenWorks上的一个Nal对象,因此用户将无法看到源代码(有点类似于仅双击的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管理员,没有人知道这个帐户的密码。
我还运行了Get-ExecutionPolicy -List... MachinePolicy和LocalMachine是“远程签名的”,其他所有内容都是“未定义的”。
我不认为执行策略在这个奇怪的循环中起了作用,但我很可能是错的。我正在测试的脚本没有经过任何签名过程等,只是在一台测试计算机的桌面上。

  • 谢谢-谢谢
yacmzcpb

yacmzcpb1#

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

  • Start-Process-Verb RunAs触发的UAC提示错误地接受了 NON-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 -Verb RunAs PowerShell $passThruArgs
  exit
}

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

也就是说,在重新进入进程命令行时,会检查是否包含与提升的重新调用时传递的参数相同的参数。如果是这样,则意味着即使UAC提示符接受了凭据,新会话仍然没有提升,并抛出错误。
请注意,我已经将-NoExit添加到重新调用中,以便新窗口保持打开状态,从而允许检查结果。

相关问题