【问题标题】:Create SymLink with GPO使用 GPO 创建符号链接
【发布时间】:2015-10-08 07:21:03
【问题描述】:

我有一个 BATCH 脚本,它使用 mklink 创建符号链接。当我以管理员或系统帐户(psexec -s -e)的身份运行它时,它可以正常工作。但是当我尝试在 GPO 中将它用作启动脚本时,它会在目标计算机上给我一个错误“您没有足够的权限来执行此操作”。 Windows 7 专业版 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?

【问题讨论】:

  • 您确定您的意思是启动脚本而不是登录脚本?
  • 是的,我很确定。在系统启动时登录之前运行的脚本。
  • 好的,在这种情况下,我不知道是什么导致了问题,但是您应该能够通过调用启动脚本来解决它psexec(因为您知道它有效)。跨度>

标签: windows powershell batch-file cmd group-policy


【解决方案1】:

组策略客户端 (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 帮助我找到了这个问题。

【讨论】:

    【解决方案2】:

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

    我使用PowerShell.exe-verb RunAsStart-Process 尝试了多种事物和语法的几种变体,并没有将其作为本地脚本运行,而我试图避免使用任务计划程序作为 SYSTEM

    注意:这只是其中一种变体失败的一般示例,其结果和转录输出与所有其他变体相同 尝试了变化。

    $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}
    }
    

    【讨论】:

      猜你喜欢
      • 2019-04-18
      • 2013-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-10
      • 1970-01-01
      • 2011-12-13
      相关资源
      最近更新 更多