System.Process()带凭据远程执行程序报错求助
兄弟,太懂你卡一早上的烦躁了!你说的这个错误在远程执行高权限.NET程序时确实容易踩坑,尤其是纯用.NET命令行编译的场景,我给你列几个大概率能解决问题的排查方向:
绝对路径是底线,别用相对路径
远程执行进程的工作目录大概率不是你本地的默认目录,哪怕你觉得路径没问题,也一定要写死绝对路径,比如C:\Apps\YourCompiledProgram.exe,别搞.\YourProgram.exe这种操作。另外务必确认远程机器上这个路径下真的有你的程序,拼写、大小写(虽然Windows不敏感,但偶尔会出幺蛾子)都要核对一遍。管理员权限的上下文坑点
就算路径对了,管理员身份的进程可能有不同的权限范围。比如你把程序放在了某个普通用户的个人目录(C:\Users\XXX\...),管理员账户未必有访问权限。试试把程序移到公共目录,比如C:\Program Files或者C:\Windows\Temp这种管理员默认有权限的位置再测试。.NET运行时版本必须匹配
你是用.NET编译的,那远程机器上有没有装对应版本的.NET运行时?比如你本地用.NET 7编译,远程机器只装了.NET Framework 4.7,那程序根本跑不起来,错误提示还会误导你说“找不到文件”。可以在远程机器上跑dotnet --info看看已安装的运行时,和你编译时的目标框架对齐。远程执行工具的参数要加对
你是用什么工具远程执行的?比如PsExec的话,要记得加-h参数让进程以高权限运行,命令格式大概是:psexec \\RemotePCName -u AdminAccount -p AdminPassword -h "C:\FullPath\YourProgram.exe"如果程序需要带参数,一定要把整个命令用引号括起来,避免参数被拆分导致识别错误。
编译时生成自包含程序包
要是不想纠结远程机器的.NET环境,编译的时候直接生成自包含的程序包,这样连运行时一起打包进去,远程机器不用装.NET就能跑。命令大概是:dotnet publish -r win-x64 --self-contained true -c Release把生成的整个文件夹传到远程机器,再执行里面的exe文件试试。
要是这些都试过还是不行,你可以把远程执行的具体命令、编译用的命令行参数贴出来,咱们再接着排查!
内容的提问来源于stack exchange,提问作者Beefjeff

