首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用GPO创建SymLink

用GPO创建SymLink
EN

Stack Overflow用户
提问于 2015-10-08 07:21:03
回答 2查看 9K关注 0票数 3

我有一个与mklink建立符号链接的批处理脚本。当我作为管理员或系统帐户(使用psexec -s -e)运行它时,它可以正常工作。但是,当我试图在GPO中使用它作为启动脚本时,它会给出一个错误:“您没有足够的权限在目标计算机上执行此操作”。Windows 7 Pro SP1 x64。UAC是残疾的。

批处理示例:

代码语言:javascript
复制
mklink C:\log\cmd.link.exe C:\Windows\System32\cmd.exe >> C:\log\symlink.log 2>&1

我还试图将它封装到一个powershell脚本中:

代码语言:javascript
复制
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?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-09 10:22:28

看来,组策略客户端 (gpsvc)服务(因为GPO脚本以其特权运行)不包含创建symolic链接(SeCreateSymbolicLinkPrivilege)的特权:

代码语言:javascript
复制
C:\>sc qprivs gpsvc
[SC] QueryServiceConfig2 SUCCESS

SERVICE_NAME: gpsvc
        PRIVILEGES       : SeTakeOwnershipPrivilege
                         : SeIncreaseQuotaPrivilege
                         : SeAssignPrimaryTokenPrivilege
                         : SeSecurityPrivilege
                         : SeChangeNotifyPrivilege
                         : SeCreatePermanentPrivilege
                         : SeShutdownPrivilege
                         : SeLoadDriverPrivilege
                         : SeRestorePrivilege
                         : SeBackupPrivilege

如果我想使用这一特权,我首先应该授予这一特权服务。这可以通过以下命令来完成:

代码语言:javascript
复制
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,他帮我找到了这个。

票数 5
EN

Stack Overflow用户

发布于 2021-07-29 20:03:44

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

我使用PowerShell.exe-verb RunAsStart-Process尝试了多个事物和语法的几种变体,但是没有将其作为本地脚本运行,而任务调度器是我试图避免的SYSTEM

注:--这只是一个普通的例子,说明一个变体失败了,结果和所有其他变体的输出相同。

代码语言:javascript
复制
$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进行泛化。

基本上,我不得不操作服务相关权限的多字符串注册表值,而不是以这种方式使用sc.exe附加所需的"SeCreateSymbolicLinkPrivilege"值。

代码语言:javascript
复制
#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}
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33009154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档