Tag: 进程

C#和.NET 3.5 – 如何使用不同的凭据启动进程,使用隐藏窗口,并能够捕获标准输出和退出代码?

我有一个用C#和.NET 3.5开发的Windows服务,可以在我们的3个域中执行各种管理任务。 我在每个域中都有一个管理员帐户,该帐户对此服务的操作具有必要的权限/权限。 对于所有AD交互,我可以使用域的正确用户名/密码绑定到AD,一切都很好。 但是,我现在需要启动一个外部进程(robocopy)来执行一些工作,我无法在.NET 3.5中找到任何代码示例。 我需要做的是在隐藏窗口中使用备用凭据启动robocopy,捕获标准输出,以便记录实际完成的内容,并捕获退出代码,以便我可以判断它是否成功。 我从K. Scott Allen的博客中找到了一些旧的.NET 1.1代码(请参阅最后几条评论,以获得良好的代码清单),该代码扩展了System.Diagnostics.Process对象并调用了Win32 API函数CreateProcessAsUserW。 但是,由于.NET 2.0中的某些API更改,代码无法运行。 使用reflection引用博客的最后一条评论中的代码片段,当我尝试与进程交互时(使用reflection来杀死它或获取退出代码),它会使用reflection来调用Process对象的私有SetProcessHandle函数,从而导致Access Denied错误。 有没有人有一个如何实现这一目标的好例子? 编辑:内置的.NET Process和ProcessStartInfo API允许您指定备用凭据,但是当您这样做时,它希望创建一个可见窗口(即使您指定CreateNoWindow或WindowStyle Hidden),它在作为Windows服务运行时失败。 因此,这些不适用于此应用程序。 模拟不起作用,因为启动外部进程时,它使用父进程的凭据,而不是模拟凭据。 解决方案:正如Reed在下面指出的那样,使用其中一个Win32 API函数进行P / Invoke可以让你实现这一点。 我最后使用一个名为RunProcess的旧免费软件NT4实用程序 ,它允许您在命令行上指定用户名/密码。 它适用于Vista和2k3,并且在由作为本地系统运行的Windows服务启动时也能正常工作。

从提升的子进程获取错误和标准输出

我创建了一个进程处理程序,它启动两种类型的进程:一个用管理员用户名和密码提升,另一个没有任何用户名和密码输入正常运行。 我很想知道如何从升级过程中获得输出。 启动该过程的应用程序不需要运行管理员凭据,管理员凭据将输入单独的加密xml文件,应用程序在脚本和需要管理员凭据的其他位置使用该文件。 由于应用程序是与普通用户一起运行的,因此访问应用程序已启动的已提升的进程似乎是不可能的。 我可以启动一个进程,我可以很容易地检查它是否已完成它所要求的内容,但我无法将其操作读取到字符串或日志。 public bool CreateProcessWithAdminRights(string filePath, string commandlineArgument, bool log) { if (!string.IsNullOrEmpty(filePath) && !string.IsNullOrEmpty(commandlineArgument) && _user.UserDataExsists()) { var securePassword = GetSecureString(_user.Password); ToolsProvider.Logger.Debug(“Creating process with the following filepath: {0} and commandline argument: {1}”, filePath, commandlineArgument.Replace(_user.Password, “”)); ToolsProvider.Logger.Info(“Creating Process with admin rights for {0} against {1}”, _user.Name ); _proc = new Process { […]

Process.Start没有创建子进程(端口句柄inheritance)?

我在使用TCP绑定的自托管应用程序中有一个WCF服务。 如果我从应用程序启动外部进程“commandLineApp”,即使在我的应用程序关闭后仍然继续,我的应用程序下次启动WCF服务时会遇到问题。 WCF说地址/端口已经在使用中。 如果在重新启动应用程序之前关闭外部应用程序(根本不使用WCF或任何套接字),WCF服务就可以正常启动。 看起来我的应用程序中的套接字句柄以某种方式由新进程“commandLineApp”inheritance,并且在该进程退出之前不会被释放。 如何阻止其他进程从我的主应用程序inheritance句柄(或成为子进程?)? 目前我正在使用Process.Start启动其他进程,使用UseShellExecute设置为False,因为我需要设置EnvironmentVarables和RedirectStandardOutput / Error。 我认为如果我设置UseShellExecute = true,则会阻止子进程设置,但是我没有得到我需要的所有function。 有没有解决这个问题的方法? 请参阅下面的示例代码 ProcessStartInfo psi = new ProcessStartInfo(); psi.FileName = “commandLineApp.exe”; psi.Arguments = “/someParameter”; psi.EnvironmentVariables.Add(“…”, “…”); psi.RedirectStandardOutput = true; psi.RedirectStandardError = true; psi.UseShellExecute = false; Process process = new Process(); process.StartInfo = psi; process.Start(); // Monitor if process with PID = process.Id is running […]

为什么即使在进程终止后仍未完成异步读取?

我编写了一个Process,它从作为参数给出的文件中读取数据。 我已同步异步读取StandardOutput和StandardError。 public static string ProcessScript(string command, string arguments) { Process proc = new Process(); proc.StartInfo.UseShellExecute = false; proc.StartInfo.RedirectStandardOutput = true; proc.StartInfo.RedirectStandardError = true; proc.StartInfo.FileName = command; proc.StartInfo.Arguments = arguments; proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; proc.Start(); string error = null; string output = null; proc.OutputDataReceived += (sender, outputLine) => { if (outputLine.Data != null) { output += […]

通过其进程名称取消隐藏进程?

前一段时间我写了一个隐藏/恢复进程窗口的代码,我做的是这样的: 隐藏进程: 1)在正在运行的进程中查找进程名称。 2)将MainWindowHandle添加到Container(在本例中为Dictionary),稍后取消隐藏该过程是必要的。 3)使用ShowWindow API函数隐藏进程。 取消隐藏流程: 1)在正在运行的进程中查找进程名称。 2)从容器中检索指定进程的已保存MainWindowHandle。 3)使用ShowWindow API函数取消隐藏进程。 为什么我使用字典来取消隐藏进程?嗯,因为隐藏进程的MainWindowHandle值为0 ,所以这是我找到的唯一方法来检索在ShowWindow函数中使用的正确句柄来恢复进程。 但我真的不想依赖于Hide进程之前保存所需HWND的Hide方法,我想通过指定进程名称知道如何在VB.NET或C#中执行取消隐藏操作来改进这一切。 (例如: cmd.exe )在MainWindowHandle之前没有保存,这可能吗? 我展示了代码(在VB.NET中),让您了解我为HideProcess方法做了些什么: 但请注意,此代码与问题并不完全相关,我的问题是如何仅通过指定进程名称取消隐藏进程名称以避免下面编写的代码需要检索已保存的句柄以取消隐藏进程。 ‘ Hide-Unhide Process ‘ ‘ Usage Examples : ‘ ‘ HideProcess(Process.GetCurrentProcess().MainModule.ModuleName) ‘ HideProcess(“notepad.exe”, Recursivity:=False) ‘ HideProcess(“notepad”, Recursivity:=True) ‘ ‘ UnhideProcess(Process.GetCurrentProcess().MainModule.ModuleName) ‘ UnhideProcess(“notepad.exe”, Recursivity:=False) ‘ UnhideProcess(“notepad”, Recursivity:=True) Private ProcessHandles As New Dictionary(Of String, IntPtr) Private Shared Function […]

如何从c#获取进程窗口类名?

如何获取某个进程的窗口类名? 我想在c#中实现这一点。 我在c#中尝试了进程类,但我只能得到进程的窗口名称。 谢谢

在另一个进程中处理WCF事件

我有一个不可序列化的对象,我想从一个单独的进程访问。 我环顾四周,似乎唯一可行的选择是使用WCF,但我不知道如何做到这一点,因为我是WCF的新手。 如果我创建一个WCF服务,如何将WinForm挂钩到WCF服务中的各种事件? 例如,用户直接与WCF服务通信,我希望WinForm客户端得到通知。 我怎么能知道用户何时使用WCF服务做了什么并让WinForm客户端接受了这个?

解析更新单个控制台行的进程的输出

问候stackoverflow成员, 在WPF Frontend的BackgroundWorker中,我在System.Diagnostics.Process运行sox (开源控制台声音处理工具)。 以同样的方式,我使用其他几个命令行工具并解析他们的输出,以在我的前端poulate进度条。 这适用于其他工具,但不适用于Sox,因为它不是为每个进度步骤发送新行,而是通过仅使用回车符(\ r)和没有换行符(\ n)更新控制台上的单行。 我在process.StandardError上尝试了异步和同步读取。 使用async process.ErrorDataReceived += (sender, args) => FadeAudioOutputHandler(clip, args); 与process.BeginErrorReadLine();结合使用process.BeginErrorReadLine(); 不会产生任何单独的状态更新,因为由于某种原因,回车不会触发ReadLine,即使MSDN文档建议它应该。 当进程完成时,输出将在一个块中吐出。 然后,我通过流上的char读取尝试了以下代码用于同步char: char[] c; var line = new StringBuilder(); while (process.StandardError.Peek() > -1) { c = new char[1]; process.StandardError.Read(c, 0, c.Length); if (c[0] == ‘\r’) { var percentage = 0; var regex = new Regex(@”%\s([^\s]+)”); var […]

如何禁用打开文件 – 安全警告

我有一个奇怪的问题。 我编写了一个winform服务器应用程序和一个winform客户端应用程序。 客户端的作用是将用于运行某个脚本的命令发送到服务器。 服务器接收这些命令,解析它们并运行它们。 这两个工作很棒。 我编写了一个cmd应用程序,它使用了我客户端的一些function。 该应用程序应该用作cmd客户端。 问题是:当我运行winform客户端时,服务器运行命令完全没有问题。 当我运行cmd客户端时,当服务器尝试执行收到的命令时,服务器端的Windows会弹出是否可以运行脚本的安全问题(请参阅附图)。 为什么会在cmd上发生,而不是在winforms上发生。 这是我的代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Win32; using System.Net.Sockets; using System.ComponentModel; using System.IO; using System.Management; namespace RemoteBatcher { class ClientCmdProgram { private static RegistryKey registryKey; private static Socket clientSock; private static string remoteIpAddress = “192.168.0.1”; private static int remotePort = 8; […]

获取进程的所有DLLS

我想获得为给定进程加载的所有dll的列表。 我目前正在使用.NET Framework 4.0 。 我知道尝试通过Process.Modules属性访问所有托管dll时存在错误 。 (仅列出非托管dll)。 我需要一种以编程方式检索所有这些dll的方法。 Process[] myProcess = Process.GetProcessesByName(“MyProcess”); if(myProcess.Count() > 0) { foreach (ProcessModule processModule in myProcess[0].Modules) //get information } 编辑:我感兴趣的过程不在当前的AppDomain中。