【C#App】C#使用管理员权限启动程序

本文介绍了一种用于监控SQLServer内存占用并自动重启的服务程序。通过判断当前用户是否为管理员来决定是否以管理员权限运行,从而实现SQLServer服务的自动重启。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近服务器SQLServer内存占用率总是超高,每次手动重启服务器太麻烦,于是写一个自动跑的程序,去检查内存使用率,如果Sqlserver内存占用超过一定数值,就将其关闭,重新启动。
测试的时候遇到的第一个问题就是,程序写好了,但是不能关闭服务,并报出“无法启动”的异常,猜测可能是用户权限不够,于是使用管理员身份运行后,可以将服务重启。于是我们需要在程序中加入代码,使得程序判断当前是否是管理员账号,若不是则使用管理员身份启动,具体代码如下:
1.将程序中的Program.cs替换为以下:

  [STAThread]
        static void Main(string[] Args)
        {

            //Application.EnableVisualStyles();
            //Application.SetCompatibleTextRenderingDefault(false);
            //Application.Run(new fmRebootWindowsService());
            //获得当前登录的Windows用户标示
            System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent();
            //创建Windows用户主题
            Application.EnableVisualStyles();

            System.Security.Principal.WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal(identity);
            //判断当前登录用户是否为管理员
            if (principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator))
            {
                //如果是管理员,则直接运行
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new fmRebootWindowsService());
            }
            else
            {
                //创建启动对象
                System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
                //设置运行文件
                startInfo.FileName = System.Windows.Forms.Application.ExecutablePath;
                //设置启动参数
                startInfo.Arguments = String.Join(" ", Args);
                //设置启动动作,确保以管理员身份运行
                startInfo.Verb = "runas";
                //如果不是管理员,则启动UAC
                System.Diagnostics.Process.Start(startInfo);
                //退出
                System.Windows.Forms.Application.Exit();
            }

        }
<think>根据用户的问题,需要实现C#程序管理员权限启动。结合引用内容,关键点有两个:管理员权限和开机自启动。引用[1]和[2]提供了自启动的方法,但未强调管理员权限;引用[3]提到以管理员身份启动;引用[4]提供了自启动路径。正确方法应该同时满足这两个条件。分析引用内容:-自启动方法:引用[1]使用快捷方式(不需要管理员权限),引用[2]通过修改注册表(解决权限问题需改用CurrentUser),引用[4]提到系统启动文件夹。-管理员权限:引用[3]建议通过app.manifest文件设置程序始终以管理员身份运行。因此,完整方案应分两步:1.确保程序运行时具有管理员权限(修改app.manifest)2.设置开机自启动(优先选择注册表方式,因为启动文件夹需要管理员权限才能写入系统目录)具体步骤:(一)添加管理员权限-修改app.manifest:取消以下节点的注释并修改为`level="requireAdministrator"````xml<requestedExecutionLevellevel="requireAdministrator"uiAccess="false"/>```(二)设置自启动-注册表位置:`HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run`-写入注册表时无需管理员权限(引用[2]已验证)代码实现示例:1.在项目属性中启用app.manifest(选择"创建不带清单的应用程序"后添加清单)2.自启动设置方法:```csharpusingMicrosoft.Win32;publicstaticvoidSetAutoStart(stringappName,stringappPath,boolenable){RegistryKeyrk=Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run",true);if(enable)rk.SetValue(appName,"\""+appPath+"\"");elserk.DeleteValue(appName,false);}```调用示例:```csharpSetAutoStart("MyApp",Application.ExecutablePath,true);```注意事项:-程序必须以管理员身份运行(由清单文件保证)-自启动时系统会提示UAC确认(管理员权限必然触发)-避免写入系统目录(如引用[4]路径)需要管理员权限,故不推荐引用说明:-管理员权限实现参考引用[3][^3]-自启动注册表方法参考引用[2][^2]§§相关问题§§1.如何避免管理员权限导致的UAC弹窗频繁出现?2.哪些情况必须使用系统启动文件夹设置自启动?3.C#如何检测当前程序是否以管理员身份运行?</think> 以下是C#实现程序管理员权限启动的综合解决方案,结合引用资料和最佳实践: ### 完整实现方案 ```csharp // 1. 启用管理员权限(app.manifest设置) // 在项目属性中启用清单文件,添加以下配置: /* <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/> */ // 2. 自启动注册表操作类 public class AutoStarter { private const string RunKey = @"Software\Microsoft\Windows\CurrentVersion\Run"; public static void SetAutoStart(string appName, string appPath, bool enable) { using (RegistryKey rk = Registry.CurrentUser.OpenSubKey(RunKey, true)) { if (rk == null) return; if (enable) { // 添加引号确保路径包含空格时正常工作 rk.SetValue(appName, "\"" + appPath + "\""); } else { rk.DeleteValue(appName, false); } } } } // 3. 程序启动调用(Program.cs) static class Program { [STAThread] static void Main() { // 设置自启动(需管理员权限) string appName = "MyAdminApp"; string appPath = Application.ExecutablePath; // 检测是否管理员权限 if (IsAdministrator()) { AutoStarter.SetAutoStart(appName, appPath, true); Application.Run(new MainForm()); } else { // 自动请求管理员权限重启 var processInfo = new ProcessStartInfo(appPath) { Verb = "runas", UseShellExecute = true }; Process.Start(processInfo); } } private static bool IsAdministrator() { WindowsIdentity identity = WindowsIdentity.GetCurrent(); WindowsPrincipal principal = new WindowsPrincipal(identity); return principal.IsInRole(WindowsBuiltInRole.Administrator); } } ``` ### 关键要点说明 1. **管理员权限实现** - 使用`app.manifest`配置文件设置`<requestedExecutionLevel level="requireAdministrator"/>` - 程序启动时自动请求UAC提升权限[^3] - 通过`WindowsPrincipal.IsInRole(WindowsBuiltInRole.Administrator)`检测当前权限状态 2. **自启动实现** - 使用`Registry.CurrentUser`避免需要管理员权限写入注册表[^2] - 目标注册表路径:`HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run` - 路径带引号处理空格问题:`"\"" + appPath + "\""` 3. **部署注意事项** - 安装路径避免系统盘(如`Program Files`)减少权限问题 - 首次运行需用户同意UAC提权 - 自启动项会在任务管理器"启动"标签页可见 ### 替代方案比较 | 方法 | 需管理员权限 | 可靠性 | 实现复杂度 | |--------------------|------------|--------|----------| | 注册表(CurrentUser) | ❌ | ★★★★ | ★★ | | 系统启动文件夹[^4] | ✅ | ★★★ | ★★ | | 任务计划程序 | ✅ | ★★★★★ | ★★★★ | > 推荐优先使用注册表方案,因其实现简单且不需要额外权限。若需要更高可靠性(如系统服务类程序),可考虑结合任务计划程序实现[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值