1

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

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

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

我对脚本的工作没有任何问题,因为当我从我的 powershell 控制台执行它时,它可以完美地完成它的工作。

每当我登录到我的帐户时,我都想执行这个脚本,我通过使用组策略编辑器 (gpedit.msc) 添加一个 powershell 登录脚本组策略来执行此操作,该脚本也会执行并且实际上确实加载了 pageant.exe 工具。

但是使用 pageant.exe 工具(putty 和 plink)的工具不起作用。它不识别选美身份验证代理。

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

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

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

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

4

3 回答 3

2

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

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

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

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

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

于 2011-11-26T19:53:27.577 回答
1

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

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

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

于 2011-11-28T17:25:35.650 回答
0

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

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

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

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

    答:查看此链接

  3. 我怎样才能让我的脚本工作?

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

于 2011-11-28T20:10:50.363 回答