【问题标题】:Executing Process not working执行过程不工作
【发布时间】:2014-12-29 10:17:57
【问题描述】:

情况:

我想通过执行 dirquota.exe 的进程来修改我的 FileServer 上的文件夹配额

问题:

正在执行的进程根本没有结果

到目前为止:

我已经重定向了在我的 FileServer 上执行的进程和参数,以更仔细地查看服务器端到底发生了什么。

执行的过程没有异常,一切都很顺利,看起来.. 查看我的 FileServer 上的当前文件夹配额时,什么都没有改变..
我决定将我的参数复制粘贴到服务器上的 CMD.exe 中,然后一切正常...
我不知道为什么它不能在我的 FileServer 上运行,可能有点简单,但我需要一些帮助

重要信息:

我正在我的 FileServer 上安装 Windows 服务并通过 SOUPUI 调用方法(一切正常)。

安装的服务以域管理员身份运行,并具有执行这些操作所需的所有权限

班级

public class Quota
    {
        public string FolderLocation;
        public int SizeInMB;
        public string FileServerName;
    }

方法

public string SetFolderQuota(Quota quota)
        {
            Process QuotaProcess = new Process();

            QuotaProcess.StartInfo.RedirectStandardOutput = false;            
            QuotaProcess.StartInfo.FileName = @"cmd.exe";
            QuotaProcess.StartInfo.UseShellExecute = true;
            QuotaProcess.StartInfo.Arguments = "/C " + "dirquota Quota Add /PATH:" + '"' + quota.FolderLocation + '"' + " /Limit:" + quota.SizeInMB + "mb" + " /remote:" + quota.FileServerName;

            try
            {                
                QuotaProcess.Start();
            }
            catch(Exception Ex)
            {
                return Ex.Message;
            }

            return "Correctly Executed: " + QuotaProcess.StartInfo.FileName + QuotaProcess.StartInfo.Arguments;
        }

【问题讨论】:

  • 您可以尝试在参数中指定 dirquota 的完整路径吗?可能是它找不到 dirquota(尽管可能不太可能)。
  • 也试过了,结果一样。想法不错

标签: c# .net service process


【解决方案1】:

发现问题

dirquota.exe 使用 Windows-on Windows 64 位重定向进行重定向。发生的事情是我的启动请求(来自 32 位进程)被重定向到 %windir%\SysWOW64\dirquota.exe。由于在 64 位安装中没有此特定可执行文件的 32 位版本,因此启动失败。要绕过此进程并允许我的 32 位进程访问本机(64 位)路径,我必须改为引用 %windir%\sysnative

守则

 public string SetFolderQuota(Quota quota)
        {

            string FileLocation = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows),@"sysnative\dirquota.exe");

            Process QuotaProcess = new Process();

            QuotaProcess.StartInfo.RedirectStandardOutput = false;
            QuotaProcess.StartInfo.FileName = FileLocation;
            QuotaProcess.StartInfo.UseShellExecute = true;
            QuotaProcess.StartInfo.Arguments = " Quota Add /PATH:" + '"' + quota.FolderLocation + '"' + " /Limit:" + quota.SizeInMB + "mb" + " /remote:" + quota.FileServerName;

            try
            {                
                QuotaProcess.Start();
            }
            catch(Exception Ex)
            {
                return Ex.Message + Environment.NewLine + "FileLocation: " + FileLocation;
            }

            return "Correctly Executed: " + QuotaProcess.StartInfo.FileName + QuotaProcess.StartInfo.Arguments;
        }

【讨论】:

    【解决方案2】:

    如果您可以将 Process 的输出重定向到日志文件并查看实际异常是什么,则最好。

    ProcessStartInfo process = new ProcessStartInfo
    { 
       CreateNoWindow = false,
       UseShellExecute = false, 
       RedirectStandardOutput = true,
       FileName = @"cmd.exe",
       Arguments = "/C " + "dirquota Quota Add /PATH:" + '"' + quota.FolderLocation + '"' + " /Limit:" + quota.SizeInMB + "mb" + " /remote:" + quota.FileServerName
    };
    
    Process p = Process.Start(process);
    string output = p.StandardOutput.ReadToEnd();
    

    记录输出的值以获得由执行此命令引起的确切异常

    【讨论】:

    • 也不例外……我试过了,响应是空的
    • 您确定运行服务的帐户是系统管理员或管理员组的成员?
    • 是的。我发现了问题,看我上面的回答
    猜你喜欢
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    相关资源
    最近更新 更多