2011-01-19 103 views
2

我已经在C#中开发了一个应用程序,其中包含使用注册表(当前用户配置单元)实现的在Windows启动时运行的选项。当我从VS或bin文件夹运行我的应用程序时,此选项有效。ClickOnce部署的应用程序注册表执行问题

当我创建ClickOnce安装程序(从互联网运行)并将其放在Codeplex上时,应用程序安装后,此选项不起作用。没有例外,它只是让注册表编写。我想有一种安全问题。

我试着创建一个ClickOnce安装程序,在安装应用程序后它可以从CD /本地存储中运行。安装完ClickOnce Web安装程序(放在CodePlex上)后,它不起作用。

我看着发布设置,有设置为默认=完全信任。我真的不知道现在要做什么来使启动时运行选项工作。

回答

3

创建第二个(控制台)应用程序,它将执行写操作,并将其添加到您原始应用程序的引用中。

当用户启动应用程序时,检查是否设置了注册表项,如果没有运行前面提到的控制台应用程序with elevated rights。将提示用户输入管理权限,写入操作应成功。

在您的主应用程序中,您必须添加对控制台应用程序的引用。为了简化程序集引用,控制台应用程序应该至少有一个公共类,以便您可以获取它的类型和类型assemby,因此您不必使用魔术字符串来获取文件名。例如:

Process.Start(
     new ProcessStartInfo 
     { 
      Verb = "runas", 
      FileName = typeof(SomeClassInOtherAssembly).Assembly.Location, 
      UseShellExecute = true, 
      CreateNoWindow = true // Optional.... 
     }).WaitForExit(); 

我还发现this很好的博客文章。

+0

在Windows 7上正常工作。在Windows XP上,我被要求选择用户来运行控制台应用程序,因为我选择当前用户(本地管理员),并且控制台应用程序在“无法找到运行时的版本运行这个应用程序“ – 2011-01-19 14:27:54

+0

没有runas动词,它在win xp上工作吗? – m0sa 2011-01-19 14:58:07

0

你应该可以写信给HKCU(我可以成功地做到这一点)。如果你想,回发你使用的代码写入注册表的代码,我会看看。

编辑

这个博客介绍了如何以编程方式读取和注册表写入/。我已经使用ClickOnce部署了它,并且它工作正常。

http://robindotnet.wordpress.com/2010/05/31/enhanced-logging-in-clickonce-deployment/

您的代码看起来不乱捶我,但你可以试试这个代码,看看它是否工作(有在文章的结尾是在VB和C#整体解决方案)。如果确实如此,那么代码有问题。如果它不起作用,那么我不知道该告诉你什么。