网站搜索

使用 GPO 运行 PowerShell 启动(登录)脚本


Windows 组策略允许您在计算机启动/关闭或用户登录/注销期间运行各种脚本文件。您不仅可以使用 GPO 在域计算机上运行经典的批量登录脚本(

.bat

,

.cmd

,

.vbs

),还可以执行 PowerShell 脚本(

.ps1

)在启动/关闭/登录/注销期间。

在现代版本的 Windows 中,您可以直接从 GPO 编辑器运行登录/注销 PowerShell 脚本(以前需要从 .bat 批处理文件中调用 .ps1 文件作为

powershell.exe

可执行)。

运行域组策略管理控制台(

GPMC.msc

),创建新策略 (GPO),并将其分配给用户或计算机的目标 Active Directory 容器 (OU)(您可以使用 WMI GPO 筛选器进行精细策略定位)。切换到策略编辑模式。

您必须选择 GPO 部分来运行 PowerShell 脚本,具体取决于您想要执行 PS1 脚本的时间:

  • 如果您想在用户登录(注销)计算机时运行 PS 脚本(以配置用户的环境设置或程序:例如,您想根据 AD 用户属性自动生成 Outlook 签名、自定义屏幕保护程序或开始屏幕设置),则需要进入 GPO 部分:用户配置 -> 策略 -> Windows 设置 -> 脚本(登录/注销);

  • 如果您想在计算机启动时运行 PowerShell 脚本(以禁用旧协议:NetBIOS 和 LLMNR、SMBv1、配置计算机安全设置等)或在计算机关闭之前,您需要转到包含计算机设置的 GPO 部分:计算机配置 -> 策略 -> Windows 设置 -> 脚本(启动/关机)。

如何使用组策略在 Windows 启动时运行 PowerShell 脚本?

假设,我们必须在计算机启动时运行 PowerShell 脚本。选择启动策略,然后转到PowerShell脚本选项卡。

现在您需要将带有 PowerShell 脚本的文件复制到域控制器。将 ps1 文件复制到域控制器上的 Netlogon 目录(例如,

\\a-d.site\netlogon

)。

由于我们配置了启动PowerShell脚本,因此您需要检查NTFS“读取&执行”权限

Domain Computers

和/或

Authenticated Users

ps1 文件权限中的组。

现在单击添加并在 Netlogon 中指定 ps1 脚本文件的 UNC 路径。

如果通过 GPO 运行多个 PowerShell 脚本,则可以使用向上/向下按钮控制脚本的执行顺序。

要在计算机启动期间正确运行 PowerShell 脚本,您需要使用计算机配置 -> 管理模板 -> 系统 -> 组策略部分中的策略配置脚本启动前的延迟时间。启用“配置登录脚本延迟”策略并指定启动登录脚本之前的几分钟延迟(足以完成初始化并加载所有必要的服务)。通常,在这里放置 1 或 2 分钟就足够了。

如果您的 PowerShell 脚本使用 Windows 网络,则需要为某些 GPO 启用“指定启动策略处理等待时间”选项(计算机配置 -> 策略 -> 管理模板 -> 系统 -> 组策略)。您可以尝试从 60 秒开始。启用此策略后,您的计算机将等待 60 秒以获得网络可用性通知,然后再运行启动脚本。这通常足以初始化 Windows 网络堆栈。

在 Windows Server 2012R2 和 Windows 8.1 及更高版本上,GPO 中的 PowerShell 脚本在绕过模式下从 NetLogon 目录运行。这意味着 PowerShell 脚本执行策略设置将被忽略。如果要从其他共享文件夹运行脚本,或者网络上仍有 Windows 7 或 Windows Server 2008R2 客户端,则需要配置 PowerShell 脚本执行策略。

默认情况下,Windows 安全设置不允许运行 PowerShell 脚本。可以使用以下命令获取 PowerShell 脚本执行策略设置的当前值

Get-ExecutionPolicy

cmdlet。如果未配置策略,该命令将返回“Restricted”(任何脚本都会被阻止)。运行 PowerShell 脚本的安全设置可以通过“打开脚本执行”策略进行配置(在 GPO 计算机配置部分 -> 管理模板 -> Windows 组件 -> Windows PowerShell 中)。可能的策略值:

  • 仅允许签名脚本 (AllSigned) - 您只能运行签名的 PowerShell 脚本(“如何对 PowerShell 脚本进行数字签名?”) - 从安全角度来看,这是最佳选择;

  • 允许本地脚本和远程签名脚本 (RemoteSigned) - 您可以运行任何本地和签名的远程脚本;

  • 允许所有脚本(无限制)——最不安全的选项,因为允许运行任何 PowerShell 脚本。

如果 PowerShell 脚本执行策略的设置不适合您,您可以在绕过模式下运行 PowerShell 脚本(脚本不会被阻止,也不会出现警告)。

为此,请从启动 -> 脚本部分运行PowerShell脚本。在本节中,您可以通过调用 powershell.exe 可执行文件来运行 PS1 脚本(类似于本文中描述的脚本)。放:

  • 脚本名称:

    %windir%\System32\WindowsPowerShell\v1.0\powershell.exe
  • 脚本参数:

     -Noninteractive -ExecutionPolicy Bypass -Noprofile -file %~dp0MyPSScript.ps1

期限

%~dp0

是一个环境变量,会自动转换为脚本目录的 UNC 路径(在本例中为 NETLOGON)。

在这种情况下,您被迫允许使用 Bypass 参数运行任何(甚至不受信任的)PowerShell 脚本。

重新启动计算机以更新 GPO 设置并检查 PowerShell 脚本是否在 Windows 启动后运行。

在用户登录/注销时运行 Windows PowerShell 脚本

让我们看看如何在用户登录(或注销)Windows 时自动运行 PowerShell 脚本。

如果您需要不在计算机启动时运行脚本,而是在用户登录 Windows(对于计算机上的每个用户)后运行脚本,则需要将 GPO 链接到用户的 Active Directory OU。在这种情况下,需要在 GPO 的“用户配置”部分中配置 PowerShell 脚本。

如果您希望策略应用于特定计算机的所有用户,则需要将策略链接到计算机所在的 OU,并在计算机配置 -> 管理模板 -> 系统 -> 组策略中启用配置用户组策略环回处理模式参数。如果不启用环回处理,则用户配置部分中的参数将不会应用于用户。有关详细信息,请查看帖子组策略不适用于用户或计算机。

在此示例中,我将使用一个简单的 PowerShell 脚本将用户的登录时间写入文本日志文件。

  1. 将 PowerShell 脚本文件复制到

    \\a-d.site\NETLOGON\

    Active Directory 域控制器上的文件夹;

  2. 转到用户配置 -> 策略 -> Windows 设置 -> 脚本 -> 登录;

  3. 转到 PowerShell 脚本选项卡并添加 PS1 脚本文件(使用 UNC 路径,例如

    \\a-d.site\NETLOGON\UserLog.ps1

    );

  4. 在目标计算机上重新登录用户;

  5. 当用户登录时,您的 PowerShell 脚本将通过 GPO 自动启动;

  6. 您可以通过事件查看器的 Microsoft-Windows-GroupPolicy/Operational 部分中的事件 ID 5018 来验证用户登录脚本是否已成功执行:

    Completed Logon script for a-d\jsmith in 11 seconds.

如果您希望用户在脚本完成之前无法访问其桌面,则必须启用 GPO 参数同步运行登录脚本(计算机配置 -> 管理模板 -> 系统 -> 登录)。在这种情况下,在所有策略和登录脚本完成之前,explorer.exe 进程不会启动(这会增加用户登录时间!)。

请注意,该脚本以当前用户权限运行。如果用户拥有计算机的管理权限并且启用了用户帐户控制 (UAC) 设置,则 PowerShell 脚本无法进行需要提升权限的更改。

为了以提升的用户权限运行 PowerShell 登录脚本,您可以使用计划程序任务。

  1. 在用户配置 -> 首选项 -> 控制面板设置 -> 计划任务下创建一个新的任务计划程序作业;

  2. 在常规选项卡上,指定将代表当前用户启动该任务

    %LogonDomain%\%LogonUser

    并启用

    Run with highest privileges

    选项;

  3. 在触发器选项卡上,指定任务应在登录时启动;

  4. 在操作选项卡上指定 PowerShell 脚本文件的路径:

操作:启动程序
程序/脚本:

C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe

添加参数(可选):

-ExecutionPolicy Bypass -command "& \\a-d.site\Netlogon\Your_PS_Script.ps1"

了解有关通过 GPO 配置 Windows 计划程序任务的更多信息。

此类 PowerShell 脚本将以管理员身份运行(如果将域用户添加到本地管理员组)。

某些登录脚本只需在每个用户首次登录计算机时运行一次(初始化工作环境、复制文件夹或配置文件、创建快捷方式等)。这是一个简单的技巧,允许您使用 GPO 仅运行一次脚本。

相关文章