2008-12-23 37 views
2

我的(.NET)应用程序允许用户调整数据库值。然后,他们需要根据他们的编辑生成报表,无论是Crystal还是Reporting Services,但这并不重要 - 重要的是这一代人不一定能够在他们的本地盒子上发生,例如,他们可能没有在他们的机器上安装Crystal Reports(或其他)。运行远程触发作业时的模仿

因此,我在网络机器上设置了一个消息队列(它可以生成报告),我的应用程序将向该队列发送一条消息,该消息沿着一个包含所有必需信息的对象发送。到现在为止还挺好。

我已经使用规则和触发器配置了目标队列,因此任何新消息都会自动激发该远程计算机上的控制台应用程序以尝试处理消息。

问题是,虽然一切工作正常,触发的控制台应用程序作为本地计算机帐户运行。该应用程序需要与数据库进行交互(使用集成身份验证)。

当我将其作为实际用户运行时,控制台应用完美工作,但在消息队列触发时无法正常工作。

问题是,我可以配置规则,触发器或控制台应用程序作为特定用户运行吗?我尝试了所有可以看到的配置选项,但无济于事。

也许我可以模仿应用程序代码本身的用户(在app.config中)?这在ASP.NET代码中是可行的,但在WinForms代码中看不到它。

编辑:模拟建议很有效......直到从Process.Start()函数中调用startwithcreateprocess()时出现“Access is Denied”错误时。

我正在模拟的用户有权在本地机器上运行进程(因此它可以在没有问题的情况下自然运行)。

回答

0

尝试在应用程序内使用模拟?

更粗暴地说,你可以运行你的应用程序。

+0

在应用内模仿。现在,这是一个想法... 你如何“运行”与触发的应用程序?这不是一个明显的配置选项... – Unsliced 2008-12-23 17:07:41

2
Process p = new Process(); 

    p.StartInfo.UseShellExecute = false; 

    SecureString password = new SecureString(); 
    string pwd = "mysecret123"; 
    foreach (char c in pwd) 
    { 
     password.AppendChar(c); 
    } 

    p.StartInfo.Domain = "DomainHere"; 
    p.StartInfo.UserName = "Natthawut"; 
    p.StartInfo.Password = password; 

    p.StartInfo.FileName = "cmd"; 
    p.StartInfo.Arguments = "/c dir"; 
    p.Start(); 

参考.NET安全博客 - http://blogs.msdn.com/shawnfa/archive/2004/06/02/146915.aspx

顺便说一句,我认为这是无关的MSMQ :)

编辑:也许我失去了一些东西。不确定MSMQ如何挑起新进程,或者它只是用于启动控制台应用程序的应用程序。

+0

这看起来有希望... – Unsliced 2008-12-23 17:41:58