asp.net - 通过非个性化从 .NET Web 应用程序启动流程

标签 asp.net process executable windows-authentication impersonation

我尝试从网络应用程序调用 .exe 文件。 但我想要用户调用的文件通过网站的 windows 身份验证进行非个性化。

Process process = new Process();
try
{
    process.StartInfo.UseShellExecute = false;
    process.StartInfo.FileName = ConfigData.PVDToBudgetDBexePath;
    process.StartInfo.CreateNoWindow = false;
    process.Start();
    log.Info("Process started by " + WindowsIdentity.GetCurrent().Name +  " with ID: " + process.Id);
    process.WaitForExit();
    log.Info("After WaitForExit Process ID: " + process.Id);
}
catch (Exception ex)
{
    log.Error("Error executing file with message " + ex.Message);
}

两个信息日志文本均已正确记录。没有发生错误。 但被调用的程序不执行任何操作。没有日志记录,没有写入数据库。 用户对该文件具有可执行权限。

当我从开发服务器调用相同的代码时,它工作正常。

我使用.Net 4.5 和 IIS 7 我发现有关此主题的帖子仅适用于非常旧版本的 .Net 和 IIS,这对我没有帮助。

我做错了什么? 或者我怎样才能找出问题所在?

非常感谢,

编辑: 为了更好地阐明我的意图: 我有这个(自制的)exe 文件,可以将 Excel 表格中的数据导入到数据库中。这需要一些时间。在执行此操作时,它也会将 log4net 的进度记录到数据库中。 我想要一个 UI(Web 应用程序),用户可以触发导入。 在此 UI 上还有一个 ajax 进度条,显示从数据库中的日志表导入 takten 的进度。

我希望此导入过程最多同时运行一个实例。所以我有一个函数来检查进程是否仍在运行。 如果是这样,则不允许启动另一个进程。如果没有,您可以重新开始。

    private bool IsRunning(string name)
    {
        Process[] processlist = Process.GetProcesses();

        if (Process.GetProcessesByName(name).Length > 0  )
        {
            return true; 
        }
        else
        {
            return false;
        }
    }

最佳答案

我现在通过 TimeScheduler 启动 exe 文件解决了这个问题。

path = exe 文件的文件路径

arguments = 启动 exe 文件的参数

using Microsoft.Win32.TaskScheduler;


            using (TaskService taskService = new TaskService())
            {
                var taskDefinition = taskService.NewTask();
                taskDefinition.RegistrationInfo.Author = WindowsIdentity.GetCurrent().Name;
                taskDefinition.RegistrationInfo.Description = "Runs exe file";


                var action = new ExecAction(path, arguments);
                taskDefinition.Actions.Add(action);

                taskService.RootFolder.RegisterTaskDefinition("NameOfTask", taskDefinition);

                //get task:
                var task = taskService.RootFolder.GetTasks().Where(a => a.Name == "NameOfTask").FirstOrDefault();

                try
                {
                    task.Run();
                }
                catch (Exception ex)
                {
                    log.Error("Error starting task in TaskScheduler with message: " + ex.Message);
                }


            }

关于asp.net - 通过非个性化从 .NET Web 应用程序启动流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36889154/

相关文章:

asp.net - asp.net ObjectDataSource错误处理

asp.net - 以编程方式创建 .edmx 文件

ruby-on-rails - 如何从 Rails 应用程序管理长时间运行的进程?

php - 使用 exec() 时真的对命令进行守护进程吗?

java - 如果外部程序挂起,如何退出进程 (.exec())

c++ - 使一个exe低优先级

c# - IE9 中没有设置 Cookie

css - Asp.net TextBox 改变颜色

python - 构建可执行文件时 Py2exe 错误

delphi - 如何将图像嵌入到 EXE 文件中并以幻灯片形式显示