代码之家  ›  专栏  ›  技术社区  ›  David Archer Chris Spicer

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

  •  3
  • David Archer Chris Spicer  · 技术社区  · 17 年前

    对于所有的广告交互,我可以使用域的正确用户名/密码绑定到广告,一切都很好。但是,我现在需要启动一个外部进程(robocopy)来执行一些工作,在.NET3.5中找不到任何这样做的代码示例。

    我需要做的是在一个隐藏窗口中使用备用凭证启动robocopy,捕获标准输出,这样我就有了实际执行情况的日志,并捕获退出代码,这样我就可以判断它是否成功。

    K. Scott Allen's blog

    有没有人有一个很好的例子来说明如何做到这一点?

    编辑:内置的.NET Process和ProcessStartInfo API允许您指定备用凭据,但当您指定备用凭据时,它希望创建一个可视窗口(即使您指定CreateNowInow或WindowStyle Hidden),该窗口在作为Windows服务运行时失败。因此,这些不是此应用程序的选项。模拟也不起作用,因为启动外部进程时,它使用父进程的凭据,而不是模拟的凭据。

    解决方案:正如里德在下面指出的,使用Win32 API函数之一的P/Invoke应该允许您实现这一点。我最终选择了一条稍有不同的路线,使用一辆旧汽车 freeware NT4 utility called RunProcess

    5 回复  |  直到 11 年前
        1
  •  4
  •   Reed Copsey    17 年前

    我想你应该看看:

    ProcessStartInfo

    这提供了一种.NET唯一的方法,可以在具有不同凭据的不同用户下启动进程。不再需要Win32 API。

    其他替代方法可能是使用指定的P/Invoke here CreateProcessWithLogonW .

        2
  •  1
  •   Oskar Duveborn    17 年前

    这只是一个未经验证的想法,但是在.NET2+中使用动态模拟对整个代码块不是有效的吗?因此,模拟所需的用户,然后在模拟的上下文/范围内执行您需要的任何操作,比如以正常方式启动流程?我想我们做了类似的事情,使用已经提供的凭据集成了mstsc.exe。

        3
  •  0
  •   Chris Holmes    17 年前

    StartInfo有一个名为CreateNoWindow的属性,它可以让Reed的建议对您有用。

        4
  •  0
  •   user1254219    16 年前

    它就像robocopy的包装器,为电子邮件通知和报告过滤添加开关。