我不得不为某人做一个肮脏的Linux黑客攻击,这样他们就可以cupsenable printername在非root用户的情况下使用shell命令启动打印机.我不希望他们能够以cupsenableroot 身份使用整个语法,所以我只写了一个C包装器来清理输入argv[1]和调用system("cupsenable sanitizedprintername").
我使程序setuid root,但即便如此,cupsenable失败了"权限被拒绝".然后我setuid(0)在之前插入了一个电话system(),并且看,它起作用了.
忽视有更好的方法让用户控制打印机的问题.可能有更好的方法.我感兴趣的是chmod u+svs setuid(0)vs. 的错综复杂system().为什么这样做?
我已经阅读了几个关于UAC和特权提升的问题,但我没有找到一个令人满意/全面的答案.
我有这种情况:在Windows 6或更高版本上,当用户打开配置窗口时,我必须BCM_SETSHIELD在OK按钮上显示shield(),只有在完成任务时才需要权限提升. - 我知道在Windows UI中,屏蔽始终可视化为"管理任务",即使UAC已禁用,但客户也有此特定请求.
我已经草拟了这个条件以显示图标:
TOKEN_ELEVATION_TYPE == TokenElevationTypeLimited条件#1很简单:如果用户没有管理权限,则无论UAC如何,总是需要提升.#2表示用户具有管理权限,而任何其他值TOKEN_ELEVATION_TYPE表示不需要提升.
真的那么简单吗?我错过了什么?并且 - 有关于此主题的文档或众所周知的模式?
我的应用程序并不总是需要"admin"权限,大多数时间都会以当前用户身份运行.有什么办法,我可以在程序运行后通过在运行时抛出UAC来升级privs吗?这只会在我需要私人时才会发生.而不是从高权限开始.
我知道"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