出于某种原因,我的C#程序需要使用提升的权限重新启动.我使用以下代码来实现它:
private static void RestartForPermissionsFix()
{
ProcessStartInfo processInfo = new ProcessStartInfo();
processInfo.Verb = "runas";
processInfo.FileName = Assembly.GetExecutingAssembly().Location;
Process.Start(processInfo);
}
Run Code Online (Sandbox Code Playgroud)
这非常有效.
之后,我"解决我的特权",我要重新启动程序unelevated.没有"runas",我尝试了与上面相同,但它不起作用.我假设从提升的进程启动的进程自动升高.任何的想法?
在这篇伟大的MSDN文章的帮助下,我的第一个想法是简单地检查进程是否使用提升的Administrator组,并使用AdjustTokenGroups()
我将Administrator组设置为SE_GROUP_USE_FOR_DENY_ONLY
.不幸的是,我们无法修改当前正在运行的进程的管理员组,因为它还具有该SE_GROUP_MANDATORY
属性,这使得它无法进行更改.
MSDN文档有这样的说法:
该AdjustTokenGroups
函数无法禁用具有结构中SE_GROUP_MANDATORY
属性的组TOKEN_GROUPS
.请CreateRestrictedToken
改用.
所以,我完成了以下代码来实现这一目标;
bool _IsNewProcessLaunched()
{
HANDLE hToken = NULL;
bool hasRestarted = false;
if (!OpenProcessToken( GetCurrentProcess(),
TOKEN_ASSIGN_PRIMARY | TOKEN_QUERY | TOKEN_DUPLICATE | TOKEN_ADJUST_GROUPS,
&hToken ))
{
return hasRestarted;
}
PSECURITY_DESCRIPTOR pSID = NULL;
SID_IDENTIFIER_AUTHORITY SIDAuth = SECURITY_NT_AUTHORITY;
if(! AllocateAndInitializeSid( &SIDAuth, 2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS,
0, 0, 0, 0, 0, 0,
&pSID) )
{
CloseHandle(hToken);
hToken = NULL;
return hasRestarted;
}
BOOL isAdmin = …
Run Code Online (Sandbox Code Playgroud) winapi uac privilege-elevation access-token elevated-privileges
一旦启动具有管理员权限的应用程序,ShellExecute
在该应用程序中使用的程序将继承管理员权限.但这不是我想要的:它必须在没有额外权限的情况下定期开始.ShellExecute
接受参数OPEN
(常规)和RUNAS
(管理员).但是,如果您OPEN
在以管理员身份启动应用程序后使用它,它仍然会像RUNAS
.
以下示例演示了这一点:如果您使用常规权限启动它,则会显示"Started regular".一旦你为'admin'按1,它将以管理员身份启动.如果在新创建的提示中按2,它将不会启动"常规"提示,而是再次启动"管理员"提示.
我在RUNAS(https://superuser.com/a/374866)中找到了一些关于某些参数的内容,但是它们无法传入ShellExecute
.有任何想法吗?
program WindowsPrivilegeTest;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
Winapi.Windows,
Winapi.ShellAPI;
function CheckTokenMembership(TokenHandle: THANDLE; SidToCheck: Pointer; var
IsMember: BOOL): BOOL; stdcall; external advapi32 name 'CheckTokenMembership';
// Source: http://stackoverflow.com/a/28572886/1870208
function IsAdministrator: Boolean;
var
psidAdmin: Pointer;
B: BOOL;
const
SECURITY_NT_AUTHORITY: TSidIdentifierAuthority = (Value: (0, 0, 0, 0, 0, 5));
SECURITY_BUILTIN_DOMAIN_RID = $00000020;
DOMAIN_ALIAS_RID_ADMINS = $00000220;
SE_GROUP_USE_FOR_DENY_ONLY = $00000010;
begin
psidAdmin := nil;
try …
Run Code Online (Sandbox Code Playgroud) 是否有一种简单的方法可以从提升的管理员进程创建正常的管理员进程(未提升)?我正在使用Windows 10专业版.情况是我正在尝试制作某种部署工具.该工具将使用提升的管理员上下文运行,以便将文件写入"Program Files"(并访问其他特权资源).但其中一个步骤是调用外部程序.使用提升的管理员权限创建时,该程序似乎存在奇怪的问题.我们必须在非提升的管理员环境中启动它.我在MSDN博客中尝试了这种方法,https://blogs.msdn.microsoft.com/winsdk/2010/05/31/dealing-with-administrator-and-standard-users-context它根本不起作用.