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指定账号启动进程时,生成的进程令牌可能禁用了部分管理员权限。可以检查该账号的令牌权限,或者用CreateProcessWithLogonWAPI并指定合适的权限标志启动进程,确保令牌包含所需权限。
内容的提问来源于stack exchange,提问作者Sam Marrocco
相关产品推荐
相关产品推荐

