使用 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

有几个注意事项:

  1. 您应该列出 所有 权限(当前 + 新)。否则,您可能会将所有权限替换为一个权限。
  2. 该命令需要系统帐户权限才能设置权限,因此您需要使用 psexec 或 GPO 脚本(不确定)。
  3. 如果你打算使用psexec,它会抛出一个关于参数太长的错误。因此,您应该将此命令保存为 .bat 文件,然后 运行 使用 psexec.

非常感谢 @PetSerAl 帮助我找到了这个。

我仍然有一个问题 运行 sc.exe 命令通过组策略使用 PowerShell 作为启动脚本。根据 Start-Transcript 日志文件,它被拒绝访问。例如,我使用了以下 PowerShell 逻辑,但在我的情况下它对我不起作用。

我使用 PowerShell.exe-verb RunAsStart-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}
}