如果要以管理员身份开机自启执行程序。注册表实现不了,启动菜单目录也实现不了。因为即使设置了程序的兼容性以管理员身份运行,但弹出的那个UAC确认框谁来点呢?据我所知,用计划任务是目前唯一可以实现以管理员身份启动并且不需要UAC确认的。
-------win7中使用runas命令
在win7中,由于账户控制,使用cmd就不太方便,因为权限问题,比方说最简单的,输入“net start mssqlserver”(开启sql server服务),就会提示“拒绝访问”。最简单的解决办法就是右键选择“以管理员身份运行”,获取权限就够了。
现在发现这样也不方便,就想着是不是有什么命令可以达到这样的效果。查了下,就是“runas”。
在cmd里输入“runas /?”查看帮助,其实我要的只是以管理员账号运行就够了,输入“runas /user:administrator cmd”(用administrator运行cmd),之后会让输入密码,输入密码后报错了 “RUNAS 错误: 无法运行 - cmd 1058: 无法启动服务,原因可能是已被禁用或与其相关联的设备没有启动。”
这个是因为 “Secondary Logo”服务没有启动,这个服务是“在不同凭据下启用启动过程”。直接在cmd中输入services.msc,将服务从禁用改为手动就好了,之后再次输入runas命令,就会弹出新的cmd窗口,且是以administrator账号运行的,权限问题搞定。
在Vista 和 Windows 7 及更新版本的操作系统,增加了 UAC(用户账户控制) 的安全机制,如果 UAC 被打开,用户即使以管理员权限登录,其应用程序默认情况下也无法对系统目录、系统注册表等可能影响系统正常运行的设置进行写操作。这个机制大大增强了系统的安全性。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Security.Principal;
using System.Diagnostics;
namespace ConsoleApp4
{
class Program
{
public static bool IsAdministrator()
{
bool result;
try
{
WindowsIdentity identity = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(identity);
result = principal.IsInRole(WindowsBuiltInRole.Administrator);
}
catch
{
result = false;
}
return result;
}
static void Main(string[] args)
{
if (IsAdministrator())
{
Process.Start("cmd.exe");
Console.WriteLine("管理员");
}
else {
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.UseShellExecute = true;
startInfo.WorkingDirectory = Environment.CurrentDirectory;
startInfo.FileName = "cmd.exe";
//设置启动动作,确保以管理员身份运行
startInfo.Verb = "runas";
try
{
System.Diagnostics.Process.Start(startInfo);
}
catch
{
return;
}
Console.WriteLine("非管理员");
}
Console.ReadLine();
}
}
}