c#运行应用程序,因为另一个用户因System.ComponentModel.Win32Exception

时间:2015-10-09 19:47:10

标签: c#

我使用紧急服务,他们有一个应用程序,使用地图文件让他们知道他们需要去哪里,它使用GPS让他们知道他们在哪里。我们必须在事情发生变化时更新地图文件,在我开始之前,他们是通过开始失败的VB脚本完成的。我决定用C#编写我自己的应用程序来做这个工作正常。

我在SCCM 2012中创建了一个包,它在本地缓存所有文件,然后将缓存中的文件与计算机上的文件进行比较,然后替换任何旧文件。这一切都运行正常,但他们使用的名为MobileCAD的应用程序会锁定文件,因此我必须终止此过程,然后执行文件复制并再次启动应用程序。我们永远不知道什么时候发生紧急情况,所以这个更新可能会在他们上路时开始,所以尽快重新启动应用程序非常重要。如果它没有启动应用程序,那么紧急服务人员可能会尝试手动执行此操作,但如果核心文件正在更新,则可能无法启动或导致问题。

我编写了我的应用程序,该应用程序使用应用程序清单强制它作为文件副本的管理员运行。该应用程序通过SCCM运行,该SCCM使用本地系统'帐户做所有的工作,杀死MobileCAD和复制文件很好。我最初发现它确实启动了MobileCAD,但它在System帐户下完成,并且该过程将在那里,但它不可见。我认为这是他们最初遇到的同样的问题所以紧急服务人员需要重新启动计算机并等待它重新登录然后启动无线服务,以便他们可以重新进入MobileCAD。

为了解决这个问题,我做了研究,发现我可以在.NET中使用ProcessStartInfo并强制它使用另一个帐户。当我们对这些机器使用自动登录时,用户名,密码和域都在注册表中,因此很容易将其拉出并将其注入代码中。太棒了,看起来很容易,所以我编写代码,当我在管理员帐户下运行时,它确实运行得很好。在我的基本测试中,一切都运行良好,直到我在SCCM中尝试相同,现在它失败并出现以下错误消息。

System.ComponentModel.Win32Exception (0x80004005): Access is denied
at System.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfo    startInfo)
at System.Diagnostics.Process.Start()
at System.Diagnostics.Process.Start(ProcessStartInfo startInfo)
at UpdateFDM.Program.StartProcess(String processName)

我很抱歉所有的话,但我相信如果你对这个问题和我想要做的事情有一个很好的理解会有所帮助。我还将用户信息硬编码到代码中,而不是从注册表中提取,但我得到了同样的错误。同样,这在我的管理员帐户下工作正常但在通过SCCM推送时失败并且仅启动失败的MobileCAD。

这是我用于启动MobleCAD的代码,你看到我的问题可能在哪里吗?我知道SCCM会混淆它,但SCCM基本上就像从命令行那样运行,但它使用的是本地系统帐户。

感谢您的帮助。

// Declares the new start instance
ProcessStartInfo process = new ProcessStartInfo();

// Gets the process to start
process.FileName = processName;
// Maximizes the process windows at start-up
process.WindowStyle = ProcessWindowStyle.Maximized;

// Gets the user name from the autologon information
process.UserName = GetDefaultUserInfo("DefaultUserName");
// Gets the domain for the user
process.Domain = GetDefaultUserInfo("DefaultDomainName");

// Holds the password for the default user
SecureString password = new SecureString();
// Gets the raw password from the registry
string rawPassword = GetDefaultUserInfo("DefaultPassword");

// Copies the password in a secure string
foreach (char ch in rawPassword)
{
    password.AppendChar(ch);
}

// Sets the password
process.Password = password;

// Needed to launch the app as the logged on user
process.LoadUserProfile = true;
process.UseShellExecute = false;

// Starts the process
Process.Start(process);

// Process started, return true
return true;

0 个答案:

没有答案