使用powershell脚本作为启动外部程序的登录脚本(组策略)?

时间:2011-11-26 16:04:41

标签: windows-7 powershell uac group-policy pageant

我制作了一个加载pageant的power shell脚本(一个windows SSH身份验证代理) 用我的私钥。简而言之,脚本不仅仅是以下两行:

$tool = "pageant.exe"
&$tool $files.ToArray()

$files是一个字符串列表,其中包含我必须加载的所有私钥。

我对脚本的工作没有任何问题,因为当我从我的PowerShell执行它时它完美地完成了它的工作 安慰。

我想在每次登录帐户时执行此脚本,并通过添加PowerShell登录脚本来执行此操作 使用组策略编辑器(gpedit.msc)进行组策略时,该脚本也会执行,实际上会加载pageant.exe工具。

然而,使用pageant.exe工具(putty和plink)的工具不起作用。它无法识别选美身份验证 剂。

所以我的第一个问题是,从我自己的PowerShell控制台启动脚本和启动脚本之间有什么区别 从组策略(登录脚本)?

我也有一些调查,我看到了一些差异。首先,当我从自己的控制台启动脚本时,启动的选美工具在我的任务管理器中有一个UAC虚拟化标志。该属性在启动时不会被标记 从登录脚本组策略。

第二件事是,当我禁用UAC时,脚本从登录脚本组策略开始工作。所以我认为它与UAC有关,但我不知道如何解决这个问题。我希望脚本在UAC运行时工作 也启用了。

第二个问题这个UAC虚拟化标志是什么以及它如何影响流程的工作? 第三,最后一个问题是如何让我的脚本正常工作?

3 个答案:

答案 0 :(得分:2)

看起来是UAC虚拟化。此标志表示对受保护系统区域的所有写入尝试都将重定向到用户配置文件中的VirtualStore:C:\Users\<username>\AppData\Local\VirtualStore。禁用UAC时,将关闭此重定向。

启用UAC后,任何写入Program Files的尝试都将被重定向到VirtualStore中的相应目录。稍后当程序读取文件时,它们也会从重定向的目录中看到它们。

然而,您的登录脚本在未启用虚拟化的情况下运行,因此其修改/读取文件的尝试不会转到重定向的VirtualStore,而是直接转到Program Files。

因此,您必须使所有各方都能在没有虚拟化目录的情况下工作。如果可执行文件具有清单,最好声明与Windows 7的兼容性,则关闭虚拟化。但如果没有虚拟化,如果它尝试写入Program Files,它可能无法正常工作。

注意:对HKLM的注册表写入也是虚拟化的。

答案 1 :(得分:1)

有很多方法可以关闭UAC虚拟化;最简单的方法是在与exe相同的文件夹中包含一个外部清单(在您的情况下,它将命名为pageant.exe.manifest)。这可能会抑制提升,但随后您的写入可能会失败。虚拟化对您造成影响的事实意味着pageant.exe必须写入受保护区域,如果没有虚拟化或提升,您将被拒绝访问。

因此,我要做的是将组策略排除在外。设置一个计划任务(单击开始并键入任务以启动任务计划程序,然后单击右侧的创建任务),该计划在登录时运行(触发选项卡,单击新建,更改顶部下拉列表)以运行脚本(操作选项卡,单击并且运行提升(常规选项卡,选中以最高权限运行)。您必须同意UAC一次设置提升的任务。然后你就完成了,pageant.exe将写入其他应用程序可以读取的受保护区域。

如果在完成此设置后,其他应用程序将继续从虚拟商店而不是真实商店中读取,只需删除虚拟商店中的文件/文件夹即可。

答案 2 :(得分:0)

为了完整起见,我在自己的问题中添加了答案。

  1. 从我自己的PowerShell控制台启动脚本和从组策略(登录脚本)启动脚本有什么区别?

    答:差异来自于我的用户是Administrator组的一部分,该组将以提升的权限运行脚本。当您以管理员身份登录时,Windows将生成标准用户访问令牌和管理员访问令牌。最后一个令牌将用于运行具有提升权限的程序(这没​​有UAC虚拟化)。现在,当我从我自己的PowerShell控制台启动脚本时,该控制台以标准访问令牌启动,启动的选美配置使用UAC虚拟化运行。如果使用选美的工具以不同的模式运行,那么我的问题就出现了。

  2. 这个UAC虚拟化标志是什么?它如何影响流程的工作?

    答:请查看此link

  3. 如何让我的脚本工作?

    答:您可以使用Kate Gregory提供的解决方案(不检查以最高权限运行选项)或将批处理文件添加到运行powershell脚本的启动文件夹中。这将使用标准用户访问令牌运行脚本并启用UAC虚拟化。