好了,因为在XP中,大多数人都以pipe理员身份login – 程序员可以很容易地使程序与registry一起工作。 我想要做的是这样的:
该软件已启动,并在registry中作为启动进程添加 – 但是,只有在应用程序closures时才会执行此操作,而不是在此之前。
然而,这在xp中不起作用,因为用户在Vista,7,2008中的限制和相同的事情。
什么是解决方法? 我正在考虑让程序创build一个计划任务,或附加到一个更高级别的进程? 任何工作方式? 因为我的软件是.net相关 – 实际上同样的事情发生,并在C + + – 但我暗暗希望网提供更简单的方法来解决它。 提前10倍!
嗯,这不是Windows 7的限制 ; 这实际上是通过设计。 详情请参阅我的答案 。
你所需要的就是过程标高 。 这是处理这个问题的标准方式,UAC中内置了一个机制,允许用户以管理员身份进行身份验证,并暂时获得该标题所带来的所有权限和责任。 Windows本身使用这个地方:
这里有一个非常棒的how-to文章: 在.NET中使用Shield图标,UAC和进程提升 。
但只是在链接腐烂的情况下总结,这里是步骤:
确定用户是否具有适当的权限。 最简单的方法是调用IsUserAnAdmin
API函数。
使用“盾牌”图标通知用户需要提升。 在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); } }
以管理员权限重新启动进程。 这涉及到显示提升对话框以允许用户提升程序。 示例代码:
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); }
[可选]在您的应用程序中添加代码签名,以便使用更令人愉快的灰色或蓝色替换呈现敌意的黄色UAC标高。
它应该是每个用户,然后你将不会有权限问题。 HKCU \软件\微软\的Windows \ CurrentVersion \ Run中
有限的用户的全部目的是防止这种情况。