You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET中如何以管理员权限程序化运行Robocopy并保留安全设置

VB.NET调用Robocopy权限不足问题排查

问题背景

我在VB.NET应用中尝试运行Robocopy复制大量文件和文件夹,要求保留时间戳、所有者及安全设置。测试时,命令 robocopy sourcefolder destfolder /COPYALL /E /DCOPY:T /SECFIX 在右键以“RunAs Administrator”启动的命令行中能成功执行,但用以下VB.NET代码调用时,Robocopy报错:You do not have the Manage Auditing user right. You need this to copy auditing information.(你没有管理审核的用户权限,复制审核信息需要该权限),和非管理员命令行执行的错误一致。

代码示例:

Dim psi As New ProcessStartInfo
With psi
  .Verb = "runas"
  .UseShellExecute = False
  .UserName = "myadminname"
  .Domain = "mydomainname"
  .PasswordInClearText = "mypassword" 'For testing only
  .FileName = Command
  .Arguments = Args
End With
Process.Start(psi)     

可能的原因及解决办法

  • UseShellExecute = False 导致runas动词无效:当UseShellExecute设为False时,.NET会直接创建进程,不会通过Shell处理runas这类动词,所以代码里的runas根本没起作用。要让runas生效,必须把UseShellExecute改成True,但此时不能同时指定UserName、Domain和Password(这些属性仅在UseShellExecute=False时生效)。如果需要指定账号运行,得换用Windows API创建高权限进程,或者确保该账号本身拥有足够权限。
  • 指定的管理员账号缺少权限:你当前登录的账号在管理员cmd里能执行,是因为通过UAC提升获得了完整权限,但代码里的myadminname账号可能没被授予管理审核权限。打开本地安全策略→本地策略→用户权限分配,检查该账号是否在管理审核和安全日志的权限列表中,没有的话添加进去。
  • /COPYALL触发审核信息复制要求:/COPYALL会复制包括审核信息(A)在内的所有文件属性,而复制审核信息必须要有Manage Auditing权限。如果不需要保留审核信息,可以把/COPYALL替换成/COPY:DATSOU(跳过审核信息A),这样就能绕开权限限制,但会丢失审核日志,按需选择。
  • UAC上下文不一致:右键启动的管理员cmd处于高权限UAC上下文,而代码中指定账号启动的进程可能没触发UAC提升。试试去掉代码里的UserName、Domain、Password,只保留.Verb = "runas"和.UseShellExecute = True,让系统弹出UAC确认框手动提升权限,看是否能成功。
  • 进程令牌权限不完整:用UseShellExecute=False指定账号启动进程时,生成的进程令牌可能禁用了部分管理员权限。可以检查该账号的令牌权限,或者用CreateProcessWithLogonW API并指定合适的权限标志启动进程,确保令牌包含所需权限。

内容的提问来源于stack exchange,提问作者Sam Marrocco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 14:32:07