如何让Delphi程序启动自动“以管理员身份运行
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何让Delphi程序启动自动“以管理员身份运行相关的知识,希望对你有一定的参考价值。
参考技术A 把快捷方式发送到桌面后右键点击。然后进入属性。进入属性后点击‘高级’。
在以管理员身份运行前面打上勾。然后确定。以后次次打开都是以管理员身份运行的。
这种运行方式好像只用于软件的快捷方式,比好压缩文件是不可用的。
图片也是如此。所以只能用于软件。
bit文件的话就可以单个使用管理员身份运行,但是呢不用直接运行。所以只能单个以管理员身份运行。
其他的运行方式你们就可以寻找到,只能帮你们到这里拉。
从以管理员身份运行的进程以用户身份启动进程
【中文标题】从以管理员身份运行的进程以用户身份启动进程【英文标题】:Start a process as user from an process running as admin 【发布时间】:2015-07-27 07:01:03 【问题描述】:我想从以管理员身份运行的程序启动另一个以用户身份运行的程序。
问题是第二个程序需要使用outlook,如果程序以管理员身份运行,这是不可能的。主程序需要以管理员身份运行。
我确实已经想出了这两个解决方案:
Process.Start("cmd.exe", @"/C runas.exe /savecred /user:" + Environment.UserDomainName + "\\" + Environment.UserName + " " + "\"SomeProgram.exe" + "\"");
或
Process.Start("explorer.exe", "SomeProgram.exe");
但我对这两种解决方案都有疑问。 第一个询问用户密码(仅在 Windows 重新启动后的第一次)。 第二个可能不会在未来工作,因为据我发现它被认为是一个错误,可能会在未来的更新中修复。
所以我想知道有没有其他解决方案,用户不需要输入密码?
这似乎对我有用:
Process.Start("cmd.exe", @"/C runas.exe /TrustLevel:0x20000 " + "\"SomeProgram.exe" + "\"");
【问题讨论】:
Raymond Chen 在How can I launch an unelevated process from my elevated process and vice versa? 中很好地描述了这一点(还涵盖了各种细节,例如当提升使用与会话其余部分不同的帐户凭据时)跨度> 但这不就是使用exploer.exe 完成工作的另一种方式吗?无论如何,我找到了另一个解决方案,我确实将它添加到原始帖子中。 您的解决方案是否正确处理从 Alice 的管理员帐户降级到 Bob 的用户帐户(使用 Raymonds 链接中的示例)?runas /trustlevel
使进程处于奇怪的状态,应该避免。见***.com/q/30970433/886887
一种解决方法是拥有一个以用户身份运行的父程序,它启动管理进程,然后启动用户进程。但雷蒙德的解决方案可能是合理的;是的,它使用资源管理器,但它合法地这样做。
【参考方案1】:
Process
类具有StartInfo
属性,它是ProcessStartInfo
类的一个实例。此类公开UserName
、Domain
和Password
成员以指定您要运行该进程的用户。
Process myProcess = new Process();
myProcess.StartInfo.FileName = fileName;
myProcess.StartInfo.UserName = userName;
myProcess.StartInfo.Domain = domain;
myProcess.StartInfo.Password = password;
myProcess.Start();
【讨论】:
这意味着我需要知道用户密码,但事实并非如此。该程序被许多不同的用户使用,所以这不是我的选择。 @FKorni 我不认为您可以在不知道凭据的情况下冒充其他用户 好吧,主程序请求具有清单的管理员权限,但第二个程序应该只与当前会话的普通用户一起运行。 @FKorni 管理员没有上帝权限,您不能在没有正确凭据的情况下冒充其他用户 @FKorni 如果必须运行该进程的用户是已登录的用户,您可以点击 Damien_The_Unbeliever 提供的链接【参考方案2】:我遇到了同样的问题,无法获取当前登录的用户。注意:查询 wmi 不是解决方案,因为当时可能有很多用户登录 所以我的解决方案是反过来。以当前用户身份启动我的应用,如果当前用户不是管理员,我请求以管理员身份运行。
if (IsAdministrator())
// run whatever you want as elevated user
else
//launch the same app as admin
ExecuteAsAdmin(PATHH_TO_THE_SAME_APP.EXE);
//execute whatever you want as current user.
public static void ExecuteAsAdmin(string fileName)
Process proc = new Process();
proc.StartInfo.FileName = fileName;
proc.StartInfo.UseShellExecute = true;
proc.StartInfo.Verb = "runas";
proc.Start();
proc.WaitForExit();
public static bool IsAdministrator()
var identity = WindowsIdentity.GetCurrent();
var principal = new WindowsPrincipal(identity);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
【讨论】:
以上是关于如何让Delphi程序启动自动“以管理员身份运行的主要内容,如果未能解决你的问题,请参考以下文章
Delphi:如何创建像 Skype 一样的 Windows 自动启动应用程序?
Delphi:如何确定应用程序是不是在 Win32 / Win64 下运行并在 64 位上自动启动 64 位版本?