Tag: 进程

检测对进程的内存访问

我正在尝试检查一个应用程序是否试图操纵一个特定的进程(例如,挂钩它自己)。 我找不到一个合适的方法来实现这一目标。 是否可以计算运行过程的校验和? 如果不是我怎么能检测到这种情况?

“系统找不到指定的文件”错误on process.Start();

我试图让进程响应为一个字符串,所以我可以在我的代码中的不同位置使用它,这是我到目前为止的解决方案: const string ex1 = @”C:\Projects\MyProgram.exe “; const string ex2 = @”C:\Projects\ProgramXmlConfig.xml”; Process process = new Process(); process.StartInfo.WorkingDirectory = @”C:\Projects”; process.StartInfo.FileName = “MyProgram.exe “; process.StartInfo.Arguments = ex2; process.StartInfo.Password = new System.Security.SecureString(); process.StartInfo.UseShellExecute = false; process.StartInfo.RedirectStandardOutput = true; try { process.Start(); StreamReader reader = process.StandardOutput; string output = reader.ReadToEnd(); } catch (Exception exception) { AddComment(exception.ToString()); } […]

.NET Start Process具有更高的权限

我正在尝试通过C#应用程序执行具有管理员权限的程序,该应用程序仅使用用户权限进行调用。 码 ProcessStartInfo psi; try { psi = new ProcessStartInfo(@”WINZIP32.EXE”); psi.UseShellExecute = false; SecureString pw = new SecureString(); pw.AppendChar(‘p’); pw.AppendChar(‘a’); pw.AppendChar(‘s’); pw.AppendChar(‘s’); pw.AppendChar(‘w’); pw.AppendChar(‘o’); pw.AppendChar(‘r’); pw.AppendChar(‘d’); psi.Password = pw; psi.UserName = “administrator”; Process.Start(psi); } catch (Exception ex) { MessageBox.Show(ex.Message); } 它确实启动winzip,但仅限用户权限。 有什么我做错了,或者甚至有可能开始一个更高权利的过程? 谢谢! 编辑:这是问题背后的原因,也许它有助于理解我真正需要的东西。 例如,我使用winzip来大致了解我的代码有什么不对。 实际问题是,我们公司使用2个版本的程序。 但在开始任何版本之前,您需要使用regsvr32(具有管理员权限)导入dll文件。 现在我想编写一个程序,让用户选择版本,导入dll并启动正确的应用程序。

在当前控制台中运行进程

我正在为Windows编写一个基本的shell,我想知道是否有任何方法可以运行子Process process ( Process process ),以便它使用当前的控制台窗口。 我的意思是我不想重定向输入/输出; 我希望进程从当前控制台获取输入并将输出直接打印到同一控制台窗口。 原因是我希望允许此子进程为输出设置控制台颜色,如果我重定向进程的标准输出,则不会发生这种情况。 另外,我目前使用的是代码 while (!process.HasExited) process.StandardInput.WriteLine(Console.ReadLine()); 将标准输入重定向到流程。 但是,如果进程在输入后立即退出(例如,我键入“exit”+ ENTER,并且进程退出),则此循环将再次运行,因此控制台正在等待来自用户的输入,该输入将永远不会被使用通过这个过程(即将退出)。 所以,问题很简单, 如何在当前控制台中运行一个进程,以便它可以设置控制台颜色并直接从控制台获取输入 ? 编辑:以下是我的代码中与此问题相关的方法: static int runExe(string exePath, params string[] args) { ProcessStartInfo startInfo = new ProcessStartInfo(exePath, args) { ErrorDialog = false, UseShellExecute = false, CreateNoWindow = true, RedirectStandardInput = true, RedirectStandardOutput = true, RedirectStandardError = true, RedirectStandardInput = […]

进程内存大小 – 不同的计数器

我试图找出我自己的.Net服务器进程正在使用多少内存(用于监视和记录目的)。 我正在使用: Process.GetCurrentProcess().PrivateMemorySize64 但是,Process对象有几个不同的属性,让我可以读取使用的内存空间:Paged,NonPaged,PagedSystem,NonPagedSystem,Private,Virtual,WorkingSet 然后是“峰值”:我猜测它只存储了最后一次所用的最大值。 阅读每个属性的MSDN定义对我来说并没有太大帮助。 我必须承认我对内存管理方式的了解(就分页和虚拟内容而言)非常有限。 所以我的问题显然是“我应该使用哪一个?”,我知道答案是“它取决于”。 这个过程基本上会在内存中保存一堆列表,而其他进程与它进行通信并查询它。 我期待运行它的服务器需要大量的RAM,所以我随着时间的推移查询这些数据,以便能够估计RAM要求与其保留的列表大小相比。 那么……我应该使用哪一个?为什么?

线程如何节省时间?

我正在学习C#中的线程。 但是,我无法理解线程的哪些方面实际上正在提高性能。 考虑只存在单个核心处理器的情况。 将您的任务拆分为多个线程使用相同的进程上下文(共享资源)并且它们同时运行。 由于线程只是共享时间,为什么它们的运行时间(周转时间)小于单线程进程?

使用WMI处理启动事件 – 未检测到所有进程启动

我在Windows服务(运行为NT_AUTHORITY\SYSTEM )中使用以下C#代码来创建用于接收进程创建事件的事件处理程序(使用WMI和WQL): string queryString = “SELECT * FROM Win32_ProcessStartTrace”; ManagementEventWatcher watcher = new ManagementEventWatcher(new WqlEventQuery(queryString)); watcher.EventArrived += new EventArrivedEventHandler(ProcessStartEvent); watcher.Start(); 在ProcessStartEvent : int processId = int.Parse(e.NewEvent.Properties[“ProcessId”].Value.ToString()); Process proc = Process.GetProcessById(processId); Out(“Received process: ” + proc.ProcessName); 我遇到的问题是(出于一些奇怪的原因) 并非每个进程启动都被程序捕获并报告。 如果我同时启动大约6个进程,则可能不会在输出中显示。 我曾尝试使用WMI对捕获进程创建事件进行一些研究,但是可用的信息有限。 我已经看到也可以使用类似的东西捕获进程开始: SELECT TargetInstance FROM __InstanceCreationEvent WITHIN 2 WHERE TargetInstance ISA ‘Win32_Process’ ( 如此Stack Overflow答案中所示 ) 使用__InstanceCreationEvent和Win32_ProcessStartTrace之间是否有任何重大差异? […]

在VB.NET中检查使用process.start()启动的文件中的更改

我正在开发一个基于vbnet / c#.NET的应用程序,它打开具有不同应用程序(excel,word等)的文件。 使用Dim app As Process = Process.Start(ProcessProperties)启动Dim app As Process = Process.Start(ProcessProperties) 现在,当我必须终止进程时,我使用app.Kill()但我需要检查文档是否已被修改,然后才能app.Kill()它。 我该怎么处理? 如果可能,我如何启动应用程序本机提示进行保存? 谢谢

从Windows服务的特定凭据启动进程

我已经花了几天时间来解决这个问题,尽管网上有很多不同的例子,这是一个棘手的问题,我不能让他们在我的场景中工作。 我有一个在本地系统帐户下运行的Windows服务。 它有一个WCF端点侦听API请求。 当通过API告知时,该服务应该在系统会话(0)和“工作者”帐户凭证中启动新进程。 该进程是一个检查队列中的工作并执行此操作的工作程序。 如果找不到工作,它会睡一会儿并再次检查。 如果确实找到了工作,它会在同一会话中启动一个新进程并使用相同的凭据并完成工作。 完成工作后关闭。 “Worker”是域帐户,是计算机上本地管理员组的成员,对可执行文件具有执行权限。 该计算机与该帐户位于同一域中。 问题是,当服务尝试启动进程时,它会从CreateProcessAsUser方法获取ERROR_ACCESS_DENIED (5)错误代码。 我尝试在具有相同凭据的Windows 7计算机上运行相同的代码并且工作正常,但在Windows Server 2008上运行时会获得该错误代码。 代码太大了,不能在这里显示,所以我把它放在其他地方…… ProcessHelper : http : //pastie.org/private/y7idu3nw4xv1fxzeizbn9g 该服务调用StartAsUserFromService方法来启动进程,该进程在建立会话后在内部调用CreateProcessAsUser 。 该进程调用StartAsUserFromApplication方法来启动其后继,后者在内部调用CreateProcessWithLogonW 。 ImpersonationContext : http : //pastie.org/private/xppc7wnoidajmpq8h8sg 该服务需要获取用户令牌以启动进程。 该过程不需要启动其后继者。 据我所知,模拟在Server 2008上是成功的,但它没有一些权限,我无法弄清楚哪个。 编辑: 我在Windows 7计算机上尝试了本地管理员帐户和域帐户,它们运行正常。 但它们都不能在Server 2008机器上运行。 某处必须有遗失许可,但我不知道在哪里; 错误消息没有帮助。 我还尝试在可执行文件的兼容性选项卡中勾选“以管理员身份运行”框,但它没有任何区别。 编辑: 我使用进程监视器来查看服务中发生了什么,这是它收到错误的地方…… Date & Time: 12/02/2014 11:44:03 Event Class: File System Operation: […]

等待进程结束异步,然后调用主表单中的函数

我正在用C#编写一个游戏编辑器。 我的程序通过启动notepad.exe进程打开为.txt文件。 如果该进程退出,我想调用主窗体中的函数(更新文本框)。 这是我到目前为止所做的事情: void OpenTextEditor(TreeNode node) { Process editor = new Process(); editor.StartInfo.WorkingDirectory = “%WINDIR%”; editor.StartInfo.FileName = “notepad.exe”; var txtfilelocation = GetRealPathByNode(node); var txtfile = File.ReadAllText(txtfilelocation,Encoding.Default); txtfile = txtfile.Replace(“\n”, “\r\n”); File.WriteAllText(txtfilelocation,txtfile,Encoding.Default); editor.StartInfo.Arguments = txtfilelocation; editor.EnableRaisingEvents = true; editor.Exited += delegate { NotePadHasEnded(node); }; editor.Start(); //starten } public Delegate NotePadHasEnded(TreeNode node) { var txtfilelocation = […]