解决Windows 7中registry操作限制的解决方法?

好了,因为在XP中,大多数人都以pipe理员身份login – 程序员可以很容易地使程序与registry一起工作。 我想要做的是这样的:

该软件已启动,并在registry中作为启动进程添加 – 但是,只有在应用程序closures时才会执行此操作,而不是在此之前。

然而,这在xp中不起作用,因为用户在Vista,7,2008中的限制和相同的事情。

什么是解决方法? 我正在考虑让程序创build一个计划任务,或附加到一个更高级别的进程? 任何工作方式? 因为我的软件是.net相关 – 实际上同样的事情发生,并在C + + – 但我暗暗希望网提供更简单的方法来解决它。 提前10倍!

嗯,这不是Windows 7的限制 ; 这实际上是通过设计。 详情请参阅我的答案 。

你所需要的就是过程标高 这是处理这个问题的标准方式,UAC中内置了一个机制,允许用户以管理员身份进行身份验证,并暂时获得该标题所带来的所有权限和责任。 Windows本身使用这个地方:

Windows UI中显示的海拔盾的示例

这里有一个非常棒的how-to文章: 在.NET中使用Shield图标,UAC和进程提升 。
但只是在链接腐烂的情况下总结,这里是步骤:

  1. 确定用户是否具有适当的权限。 最简单的方法是调用IsUserAnAdmin API函数。

  2. 使用“盾牌”图标通知用户需要提升。 在WinForms中,需要将按钮的FlatStyle属性设置为“System”,并使用P / Invoke来显示屏蔽。 示例代码:

     [DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam); public const int BCM_SETSHIELD = 0x0000160C; public static void SetButtonShield(Button btn, bool showShield) { // Verify that we're running on Vista or later if ((Environment.OSVersion.Platform == PlatformID.Win32NT) && (Environment.OSVersion.Version.Major >= 6)) { SendMessage(btn.Handle, BCM_SETSHIELD, IntPtr.Zero, showShield ? new IntPtr(1) : IntPtr.Zero); } } 
  3. 以管理员权限重新启动进程。 这涉及到显示提升对话框以允许用户提升程序。 示例代码:

     ProcessStartInfo psi = new ProcessStartInfo { Arguments = "-justelevated", ErrorDialog = true, // Handle is the handle for your form ErrorDialogParentHandle = Handle, FileName = Application.ExecutablePath, Verb = "runas" }; try { Process.Start(psi); Close(); } catch (Exception ex) { // the process couldn't be started. This happens for 1 of 3 reasons: // 1. The user cancelled the UAC box // 2. The limited user tried to elevate to an Admin that has a blank password // 3. The limited user tries to elevate as a Guest account MessageBox.Show(ex.Message); } 
  4. [可选]在您的应用程序中添加代码签名,以便使用更令人愉快的灰色或蓝色替换呈现敌意的黄色UAC标高。

它应该是每个用户,然后你将不会有权限问题。 HKCU \软件\微软\的Windows \ CurrentVersion \ Run中

有限的用户的全部目的是防止这种情况。