我已设法以编程方式为 Windows 10 Pro 创建机器启动 Powershell 脚本并将其放置在本地组策略中(请参阅下面用于创建启动脚本的 powershell 脚本)。
重申一下:我正在使用本地组策略并且我的计算机不在域中。
启动脚本将其执行记录在事件日志中,并且当我在日志中看到适当的事件时,一切都进行得很顺利。
问题
当我打开本地组策略编辑器(gpedit.msc
)并查看计算机启动脚本时,没有注册任何脚本,如屏幕截图所示:
脚本本身已正确放置在组策略脚本目录中(C:\Windows\System32\GroupPolicy\Machine\Scripts\Startup
)
用于在本地组策略中创建机器启动脚本的 Powershell 脚本
$path = "$ENV:systemRoot\System32\GroupPolicy\Machine\Scripts\Startup"
if (-not (Test-Path $path)) {
New-Item -path $path -itemType Directory
}
'Write-EventLog -LogName xxx -source Scripts -EntryType Information -EventId 2 -Message "Execute machine startup script: $psCommandPath"' |
Out-File -filePath "$path\AllUsersStartup.ps1" -encoding ascii
# Add script to Group Policy through the Registry
'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\Scripts\Startup\0\0',
'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine\Scripts\Startup\0\0' |
ForEach-Object {
if (-not (Test-Path $_)) {
New-Item -path $_ -force
}
}
'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\Scripts\Startup\0',
'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine\Scripts\Startup\0' |
ForEach-Object {
New-ItemProperty -path "$_" -name DisplayName -propertyType String -value "Local Group Policy"
New-ItemProperty -path "$_" -name FileSysPath -propertyType String -value "$ENV:systemRoot\System32\GroupPolicy\Machine"
New-ItemProperty -path "$_" -name GPO-ID -propertyType String -value "LocalGPO"
New-ItemProperty -path "$_" -name GPOName -propertyType String -value "Local Group Policy"
New-ItemProperty -path "$_" -name PSScriptOrder -propertyType DWord -value 2
New-ItemProperty -path "$_" -name SOM-ID -propertyType String -value "Local"
}
'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\Scripts\Startup\0\0',
'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine\Scripts\Startup\0\0' |
ForEach-Object {
New-ItemProperty -path "$_" -name Script -propertyType String -value 'AllUsersStartup.ps1'
New-ItemProperty -path "$_" -name Parameters -propertyType String -value ''
New-ItemProperty -path "$_" -name IsPowershell -propertyType DWord -value 1
New-ItemProperty -path "$_" -name ExecTime -propertyType QWord -value 0
}
答案1
事实证明,本地组策略编辑器不仅从注册表中获取脚本列表和顺序,还从中获取脚本列表和顺序C:\Windows\System32\GroupPolicy\Machine\Scripts\psScripts.ini
。这几乎是一个普通的 .ini 文件,但有一些奇怪的特点:它应该是 UTF-16LE BOM 格式,并且可以同时使用CR
+LF
和LF
行尾(这对于 Windows 来说相当奇怪)。
下面您将找到一段正确编写的代码,psScripts.ini
用于将机器启动脚本添加到本地组策略。
代码需要猪细小病毒可以通过以下方式安装的模块
Install-Module -Name PsIni
#Requires -Module psIni
$scriptsConfig = @{
StartExecutePSFirst = 'true'
EndExecutePSFirst = 'true'
}
$startup = @{
'0CmdLine' = 'AllUsersStartup.ps1'
'0Parameters' = ''
}
$newIniContent = [ordered] @{
ScriptsConfig = $scriptsConfig
Startup = $startup
}
$newIniContent | Out-IniFile -filePath C:\Windows\System32\GroupPolicy\Machine\Scripts\psScripts.ini -encoding Unicode -force
答案2
我无法对maoizm
帖子发表评论,但您可以在他的脚本前面加上以下内容以完全自动化该过程:
Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force
Install-Module -Name PsIni
...