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

C# 如何在C中使用所需权限运行bat文件#,c#,process,permissions,batch-file,C#,Process,Permissions,Batch File,我有一个bat文件,可以将文件从一个位置复制到另一个位置 SET SRC=%1 SET DEST=%2 xcopy /Y/I %SRC%\*.txt %DEST%\temp echo Done! 我正试图通过C#程序运行此文件 Bat文件已执行,我可以看到“完成!”输出中的消息,但不复制文件 唯一有效的方法是 psi.UseShellExecute = true; psi.RedirectStandardOutput = false; psi.RedirectStandardError =

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

SET SRC=%1
SET DEST=%2

xcopy /Y/I %SRC%\*.txt %DEST%\temp
echo Done!
我正试图通过C#程序运行此文件

Bat文件已执行,我可以看到“完成!”输出中的消息,但不复制文件

唯一有效的方法是

psi.UseShellExecute = true;

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

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

psi.UserName = username;
psi.Password = password; 
登录成功,但我在StandardError流中收到“句柄无效”消息

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

求求你,救命

已编辑

谢谢你的回复! 我花了几个小时试图处理这个问题,正如经常发生的那样,我发布了我的问题并找到了解决方案:)

为了避免收到“句柄无效”消息,您必须

psi.RedirectStandardInput = true;
但是现在我可以看到cmd.exe窗口,如果设置了UserName,这是错误的。

您丢失了

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);  
}

如果您捕获了
XCOPY
的输出,它会说什么?如果存在权限问题,它应该包括
拒绝访问
(或您的语言的等效版本)。它没有说什么,没有提示,在标准错误流中没有错误。暂时在
XCOPY
前面放置一个
回音
。ouptut是否显示了您期望的命令行(源/目标目录等)?此外,当故障发生时,
args
fileToRun
中到底有什么内容?是的。我已经找到了解决方案,但现在我有另一个问题-我可以看到cmd.exe窗口,即使psi.WindowStyle=ProcessWindowStyle.Hidden;psi.CreateNoWindow=真;如果您遇到任何windows UAC问题,这可能会很方便
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);  
}