我工作的环境不允许用户拥有本地管理员权限。完全不允许。这很好,但当员工必须拥有本地管理员权限才能运行程序或安装需要提升权限的软件时,即使只是进行安装,也可能很麻烦。有一位簿记员每月都会从我们的供应商那里收到一张 DVD,其中包含急需的报告。为了查看报告并进行备份,她必须运行 DVD 上的可执行文件。可执行文件需要管理员权限才能安装。所以自从我来到这里以来,每个月我都会运行 .exe,UAC 会出现,我会提供运行安装程序所需的信息。
如果这是一个一次性程序,我会使用 Microsoft 应用程序兼容性工具包来绕过 UAChttp://www.techrepublic.com/blog/windows-and-office/selectively-disable-uac-for-your-trusted-vista-applications/但是,由于这是每个月发送给她的一张新 DVD,因此我需要某种她可以自己使用的工具来进行此操作。
我查看了 Server Fault 并进行了 Google-Fu,但没有找到任何有用的东西。我可能是处于特殊情况的人之一。
我想使用 Poweshell 来制作该工具。理想情况下,我希望她能够放入 DVD,然后启动 Poweshell 工具(毫无疑问是从她的桌面快捷方式启动),该工具会查看 DVD 驱动器并以本地管理员身份运行 setup.exe 文件,而无需 UAC 提示,也无需她提供任何凭据。
到目前为止,我手头上只有一些零碎的东西。我不是 Powershell 绝地武士。我是 Poweshell 徒弟。我手头上只有一半东西。我仍然需要存储密码,这样她每次运行脚本时就不必定义和输入密码。我希望这个过程尽可能顺利,点击次数尽可能少。
对于凭据,我选择使用本地管理员帐户,因为该密码不会更改。本地管理员帐户将完成工作。我需要将该帐户信息存储在计算机上,以便 Powershell 每次运行脚本时都可以检索该帐户。因此,这需要是路径变量中的加密文件。
# define path to store password and input password
$path = "C:\Users\User\Password folder"
# get the encrypted local admin password from user path
$encpwd = Get-Content $path\admin.bin
# convert admin file to secure string
$passwd = ConvertTo-SecureString $encpwd
# define local admin credential
$cred = new-object System.Management.Automation.PSCredential 'computer name\local admin',$passwd
# go to DVD drive launch setup.exe as local admin with no user input required
Set-Location D:\
Start-Process PowerShell -Cred $cred -ArgumentList .\setup.exe
我可能会因此收到一些反对票,但我知道我需要在某个地方定义并放入“Read-Host“关于输入密码的一些文本”-AsSecureString”在现有变量或新变量中。我必须将密码输入到该过程中。我试过几个地方。想法?智慧?不可能?
Windows 7 专业版 Powershell v4
答案1
以管理员身份运行而无需成为管理员
允许非管理员用户以本地管理员帐户身份运行程序,但不提供提升权限的提示
以下是设置解决方法的说明,以使应用程序以另一个本地管理员帐户运行。不过,执行该过程的帐户不需要是 PC 上的本地管理员。
Windows 解决方法(参见以下所有注释)
例子
创建用户名(域或本地):
ProxyRunAsLocalAdmin
创建密码(域或本地):
<SomeComplexPassword>
笔记
此帐户设置在
local admin
需要以管理员权限运行某些程序的 PC 上,但实际上并未授予运行(执行)该程序的最终用户本地管理员权限。这是针对本地计算机上的非管理员无法使用的方法的最后手段,因为在本地计算机上,向他们的帐户(最终用户和/或某个组)提供明确
registry
和file system
级别的对象访问权限不起作用。
安全
- 除域管理员外,任何人都不得拥有此信息 - 即不要与最终用户共享。
使用 RUNAS 创建快捷方式(可以是D:\Setup.exe
)
快捷方式Properties
示例
TARGET
字段示例(如下):%systemroot%\system32\runas.exe /user:domain\ProxyRunAsLocalAdmin /savecred "C:\Program Files\BlueStacks\HD-StartLauncher.exe"
START IN
例子:"C:\Program Files\BlueStacks"
重要的: 双引号开始于:无论路径中是否有空格,此字段都可能是必填字段。
其他设置说明
- 您可以为此目的创建域用户帐户或本地 PC 用户帐户,并在需要此类解决方案时授予其对本地计算机的本地管理员权限。
- 您必须使用“RUNAS等“在以需要执行该过程的用户身份登录 PC 时,无需自己是本地管理员。执行此操作时,您将需要输入凭据 — 仅缓存一次,但每次使用 鲁纳斯和/保存再次从相同的用户帐户配置文件继续前进。
- 此帐户的密码不会与任何人共享,只有域\系统管理员才拥有此信息,并根据每个用户每台机器的需要将其插入到任何地方 — 这也是每个 Windows 用户帐户配置文件类型的交易。因此,如果您为用户创建新的配置文件并且需要此解决方案,则需要再次运行快捷方式,以便将凭据也缓存到他们的配置文件中(由管理员)。
安全注意事项
- 您无法通过组策略限制帐户的本地登录访问,否则该帐户将无法以交互方式 RUNAS——为了安全起见,我已经尝试过这样做,但无法使其正常工作。
- 由于这是具有本地管理员权限的缓存凭据,因此从技术上讲,保存该凭据的最终用户可以将相同的 RUNAS 技术应用于另一个 EXE 或通过命令行(如果允许)。这意味着您作为管理员需要权衡此解决方案的利弊,包括风险。也许允许您值得信赖的人或正在进行或反复需要的项目这样做,而无需实际授予最终用户本地管理员权限,这是可以的。
控制
不过,您确实可以针对此解决方案采取一些控制措施,例如……
- 选择允许此命令运行 runas 的机器
- 选择要从中运行此命令的每台机器上的用户配置文件
- 你必须进入这台机器上的用户配置文件,输入初始时间的凭据
- 由于本地或 AD 帐户是本地计算机 IP 地址的成员,因此暴露于 PC 级别的本地计算机,而不是域级别的计算机
- 不要授予此帐户任何网络资源的访问权限(仅根据需要授予每台个人电脑的本地电脑管理员权限)
- 如果你想大规模禁用此功能(假设使用域帐户),则只需禁用该帐户或更改密码即可
- 确保其他人意识到这些后果等,并得到他们的批准,这样你就不是决定是否使用它的人了
答案2
我找到了一种使用 Powershell 实现目标的方法。首先必须在用户计算机上运行一个脚本(仅一次)来生成加密密码,然后将其存储到文件中。注意:存储的密码文件不是包含纯文本的本地管理员密码的 txt 文件。它是 ConvertFrom-SecureString cmdlet 的输出。
首先,脚本输入密码并将其存储到文件中。这只需要在目标计算机上运行一次。
# Enter encrypted password once and store to file; define variables
$path = "C:\Folder\Folder\"
$passwd = Read-Host "enter desired password" -AsSecureString
$encpwd = ConvertFrom-SecureString $passwd
$encpwd > $path\filename.bin
现在,用户将运行脚本以本地管理员身份从 DVD 启动程序。将 DVD 插入光盘驱动器后,她将从桌面快捷方式运行脚本。启动脚本后,程序运行完美,她可以做到这一点,而无需向我或其他管理员寻求帮助(她很喜欢这一点)。
# define path to store password and input password
$path = "C:\folder\folder"
# get the encrypted password from the path
$encpwd = Get-Content $path\filename.bin
# convert file to secure string
$passwd = ConvertTo-SecureString $encpwd
# define needed credential
$cred = new-object System.Management.Automation.PSCredential 'computer name\account name',$passwd
# go to DVD drive launch setup.exe as user with privileges to launch the program with no user input required
Set-Location D:\
Start-Process PowerShell -Cred $cred -ArgumentList .\setup.exe
这篇 Powershell.org 文章对我的答案很有帮助http://powershell.org/wp/2013/11/24/saving-passwords-and-preventing-other-processes-from-decrypting-them/
答案3
好吧,幸运的是,如果您消除了本地管理员,您唯一剩下的真正选择就是 CMD 行。Powershell 很好,但我认为您也可以使用它来运行批处理。
上述方法唯一的缺点是,如果用户知道如何打开脚本,她就能看到你在脚本中输入的内容,这是绝对不行的。唯一的解决方法是在代码中写入命令,在打开时锁定脚本,而不是执行脚本,以提示输入密码。
也许是一个专门为解决 UAC 而编写的批处理或 powershell?
答案4
绕过 UAC 的另一种方法是使用系统帐户运行程序,因为此帐户在 UAC 系统上没有 UAC。互联网上有一些源代码。完整的解决方案位于 robotronic.de/runasadminen.html 此解决方案也适用于非管理员帐户。