使用 GPO 创建 SymLink
Create SymLink with GPO
我有一个与 mklink
建立符号链接的 BATCH 脚本。当我 运行 作为管理员或系统帐户(使用 psexec -s -e
)时,它可以正常工作。但是当我尝试在 GPO 中将它用作启动脚本时,它在目标计算机上给我一个错误 "you do not have sufficient privilege to perform this operation"。 Windows 7 Pro SP1 x64。 UAC 已禁用。
批次示例:
mklink C:\log\cmd.link.exe C:\Windows\System32\cmd.exe >> C:\log\symlink.log 2>&1
我也试过将它包装成一个 powershell 脚本:
Start-Process -FilePath "$env:windir\system32\cmd.exe" -ArgumentList "/c mklink C:\log\cmd.link.exe C:\Windows\System32\cmd.exe >> C:\log\symlink.txt 2>&1" -Verb RunAs
但得到了同样的错误。我做错了什么?
也许还有另一种方法可以使用 GPO 或 PowerShell 创建 SymLink?
组策略客户端 (gpsvc) 服务(因为 GPO 脚本 运行 具有其特权)似乎不包含创建符号链接的特权 ( SeCreateSymbolicLinkPrivilege
):
C:\>sc qprivs gpsvc
[SC] QueryServiceConfig2 SUCCESS
SERVICE_NAME: gpsvc
PRIVILEGES : SeTakeOwnershipPrivilege
: SeIncreaseQuotaPrivilege
: SeAssignPrimaryTokenPrivilege
: SeSecurityPrivilege
: SeChangeNotifyPrivilege
: SeCreatePermanentPrivilege
: SeShutdownPrivilege
: SeLoadDriverPrivilege
: SeRestorePrivilege
: SeBackupPrivilege
如果我想使用这个权限,我应该首先将这个权限授予服务。可以使用以下命令完成:
sc privs gpsvc SeTakeOwnershipPrivilege/SeIncreaseQuotaPrivilege/SeAssignPrimaryTokenPrivilege/SeSecurityPrivilege/SeChangeNotifyPrivilege/SeCreatePermanentPrivilege/SeShutdownPrivilege/SeLoadDriverPrivilege/SeRestorePrivilege/SeBackupPrivilege/SeCreateSymbolicLinkPrivilege
之后您将能够在 GPO 脚本中使用 mklink
。
有几个注意事项:
- 您应该列出 所有 权限(当前 + 新)。否则,您可能会将所有权限替换为一个权限。
- 该命令需要系统帐户权限才能设置权限,因此您需要使用
psexec
或 GPO 脚本(不确定)。
- 如果你打算使用
psexec
,它会抛出一个关于参数太长的错误。因此,您应该将此命令保存为 .bat 文件,然后 运行 使用 psexec
.
非常感谢 @PetSerAl 帮助我找到了这个。
我仍然有一个问题 运行 sc.exe
命令通过组策略使用 PowerShell 作为启动脚本。根据 Start-Transcript
日志文件,它被拒绝访问。例如,我使用了以下 PowerShell 逻辑,但在我的情况下它对我不起作用。
我使用 PowerShell.exe
、-verb RunAs
、Start-Process
尝试了多种事物和语法的多种变体,并且除了 运行 之外的大量事物将其作为带有 Task 的本地脚本我试图避免的 SYSTEM
调度程序。
Note: This is just a general example of one of the variations that failed with the same result and transcript output as all other
variations tried.
$privs = (sc.exe qprivs gpsvc).Split(":")[5..99] | % { Process { If( $_.Trim().Length -gt 0 ){ $_.Trim() } } };
$privs = $privs + "SeCreateSymbolicLinkPrivilege";
$privs = $privs -Join "/";
Invoke-Expression "sc.exe privs gpsvc $privs"
有效的解决方案(在我的例子中)
我通过组策略使用以下 PowerShell 逻辑作为启动脚本,现在可以创建符号链接了。为了使示例简单,我使用 Google Chrome 进行概括。
基本上我必须操纵服务相关权限的多字符串注册表值,而不是使用 sc.exe
以这种方式附加所需的 "SeCreateSymbolicLinkPrivilege"
值。
#Start-Transcript -Path C:\Log\Transcript.txt
$v = (Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Services\gpsvc").RequiredPrivileges;
If ( $v -notcontains "SeCreateSymbolicLinkPrivilege" ) {
$v = $v + "SeCreateSymbolicLinkPrivilege";
Set-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Services\gpsvc" RequiredPrivileges $v -Type MultiString;
};
$Chrome86 = "C:\Program Files (x86)\Google\Chrome";
$Chrome = "C:\Program Files\Google\Chrome";
If(!(Test-Path $Chrome86)){
If(Test-Path $Chrome){New-Item -Path $Chrome86 -ItemType SymbolicLink -Value $Chrome -Force}
}
If(!(Test-Path $Chrome)){
If(Test-Path $Chrome86){New-Item -Path $Chrome -ItemType SymbolicLink -Value $Chrome86 -Force}
}
我有一个与 mklink
建立符号链接的 BATCH 脚本。当我 运行 作为管理员或系统帐户(使用 psexec -s -e
)时,它可以正常工作。但是当我尝试在 GPO 中将它用作启动脚本时,它在目标计算机上给我一个错误 "you do not have sufficient privilege to perform this operation"。 Windows 7 Pro SP1 x64。 UAC 已禁用。
批次示例:
mklink C:\log\cmd.link.exe C:\Windows\System32\cmd.exe >> C:\log\symlink.log 2>&1
我也试过将它包装成一个 powershell 脚本:
Start-Process -FilePath "$env:windir\system32\cmd.exe" -ArgumentList "/c mklink C:\log\cmd.link.exe C:\Windows\System32\cmd.exe >> C:\log\symlink.txt 2>&1" -Verb RunAs
但得到了同样的错误。我做错了什么?
也许还有另一种方法可以使用 GPO 或 PowerShell 创建 SymLink?
组策略客户端 (gpsvc) 服务(因为 GPO 脚本 运行 具有其特权)似乎不包含创建符号链接的特权 ( SeCreateSymbolicLinkPrivilege
):
C:\>sc qprivs gpsvc
[SC] QueryServiceConfig2 SUCCESS
SERVICE_NAME: gpsvc
PRIVILEGES : SeTakeOwnershipPrivilege
: SeIncreaseQuotaPrivilege
: SeAssignPrimaryTokenPrivilege
: SeSecurityPrivilege
: SeChangeNotifyPrivilege
: SeCreatePermanentPrivilege
: SeShutdownPrivilege
: SeLoadDriverPrivilege
: SeRestorePrivilege
: SeBackupPrivilege
如果我想使用这个权限,我应该首先将这个权限授予服务。可以使用以下命令完成:
sc privs gpsvc SeTakeOwnershipPrivilege/SeIncreaseQuotaPrivilege/SeAssignPrimaryTokenPrivilege/SeSecurityPrivilege/SeChangeNotifyPrivilege/SeCreatePermanentPrivilege/SeShutdownPrivilege/SeLoadDriverPrivilege/SeRestorePrivilege/SeBackupPrivilege/SeCreateSymbolicLinkPrivilege
之后您将能够在 GPO 脚本中使用 mklink
。
有几个注意事项:
- 您应该列出 所有 权限(当前 + 新)。否则,您可能会将所有权限替换为一个权限。
- 该命令需要系统帐户权限才能设置权限,因此您需要使用
psexec
或 GPO 脚本(不确定)。 - 如果你打算使用
psexec
,它会抛出一个关于参数太长的错误。因此,您应该将此命令保存为 .bat 文件,然后 运行 使用psexec
.
非常感谢 @PetSerAl 帮助我找到了这个。
我仍然有一个问题 运行 sc.exe
命令通过组策略使用 PowerShell 作为启动脚本。根据 Start-Transcript
日志文件,它被拒绝访问。例如,我使用了以下 PowerShell 逻辑,但在我的情况下它对我不起作用。
我使用 PowerShell.exe
、-verb RunAs
、Start-Process
尝试了多种事物和语法的多种变体,并且除了 运行 之外的大量事物将其作为带有 Task 的本地脚本我试图避免的 SYSTEM
调度程序。
Note: This is just a general example of one of the variations that failed with the same result and transcript output as all other variations tried.
$privs = (sc.exe qprivs gpsvc).Split(":")[5..99] | % { Process { If( $_.Trim().Length -gt 0 ){ $_.Trim() } } };
$privs = $privs + "SeCreateSymbolicLinkPrivilege";
$privs = $privs -Join "/";
Invoke-Expression "sc.exe privs gpsvc $privs"
有效的解决方案(在我的例子中)
我通过组策略使用以下 PowerShell 逻辑作为启动脚本,现在可以创建符号链接了。为了使示例简单,我使用 Google Chrome 进行概括。
基本上我必须操纵服务相关权限的多字符串注册表值,而不是使用 sc.exe
以这种方式附加所需的 "SeCreateSymbolicLinkPrivilege"
值。
#Start-Transcript -Path C:\Log\Transcript.txt
$v = (Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Services\gpsvc").RequiredPrivileges;
If ( $v -notcontains "SeCreateSymbolicLinkPrivilege" ) {
$v = $v + "SeCreateSymbolicLinkPrivilege";
Set-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Services\gpsvc" RequiredPrivileges $v -Type MultiString;
};
$Chrome86 = "C:\Program Files (x86)\Google\Chrome";
$Chrome = "C:\Program Files\Google\Chrome";
If(!(Test-Path $Chrome86)){
If(Test-Path $Chrome){New-Item -Path $Chrome86 -ItemType SymbolicLink -Value $Chrome -Force}
}
If(!(Test-Path $Chrome)){
If(Test-Path $Chrome86){New-Item -Path $Chrome -ItemType SymbolicLink -Value $Chrome86 -Force}
}