如何在C#中使用所需权限运行bat文件

本文关键字:权限 运行 bat 文件 | 更新日期: 2023-09-27 18:21:04

我有一个bat文件,它可以将文件从一个位置复制到另一个位置。

SET SRC=%1
SET DEST=%2
xcopy /Y/I %SRC%'*.txt %DEST%'temp
echo Done!

我正试图通过C#程序运行这个文件

var psi = new ProcessStartInfo(fileToRun);
psi.Arguments = args;
psi.RedirectStandardOutput = true;
psi.RedirectStandardError = true;
psi.WindowStyle = ProcessWindowStyle.Hidden;
psi.UseShellExecute = false;
psi.CreateNoWindow = true;
Process cmdProc = Process.Start(psi); 
StreamReader output = cmdProc.StandardOutput;
StreamReader errors = cmdProc.StandardError;
cmdProc.WaitForExit();

蝙蝠文件被执行了,我可以看到‘一!’消息,但不会复制文件。

它唯一的工作方式是

psi.UseShellExecute = true;
psi.RedirectStandardOutput = false;
psi.RedirectStandardError = false;

但在这种情况下,我必须禁用输出/错误重定向,我需要它们。所以这对我不起作用。

我已尝试设置管理员的用户名/密码

psi.UserName = username;
psi.Password = password; 

登录成功,但我在StandardError流中收到"句柄无效"消息。

我想我试图运行的进程没有复制文件和我不知道如何授予他这些权限。

求你了,救命!

已编辑

感谢您的回复!我花了几个小时试图处理这个问题,就像往常一样,我发布了我的问题并找到了解决方案:)

为了避免收到"句柄无效"的消息,您必须向发送

psi.RedirectStandardInput = true;

但现在我可以看到cmd.exe窗口,如果设置了UserName,那就不好了

如何在C#中使用所需权限运行bat文件

您缺少

psi.Domain = "domain";
psi.Verb ="runas";
//if you are using local user account then you need supply your machine name for domain

试试这个简单的片段应该对你有用

void Main()
{
    string batchFilePathName =@"drive:'folder'filename.bat";
    ProcessStartInfo psi = new ProcessStartInfo(batchFilePathName);
    psi.Arguments = "arg1 arg2";//if any
    psi.WindowStyle = ProcessWindowStyle.Hidden;
    psi.UseShellExecute = false;
    psi.Verb ="runas";
    psi.UserName = "UserName"; //domain'username
    psi.Domain = "domain"; //domain'username
    //if you are using local user account then you need supply your machine name for domain
    psi.WindowStyle = ProcessWindowStyle.Hidden;
    psi.UseShellExecute = false;
    psi.Verb ="runas";
    Process ps = new Process(psi);
    Process.Start(ps);  
}