C# 以编程方式选择性地禁用Windows上特定程序的UAC
在stack和其他论坛上有几十篇关于禁用/绕过/抑制UAC的帖子和问题/答案。也有解决办法。但从程序上来说,也许不是。我只能看到一个解决方案,但可能没有给出真正的编程解决方案 是否有一种编程解决方案可以让用户在每次运行wamp之类的程序时都得到提示,并且用户总是必须单击“是”,因此最好告诉windows他们的选择总是“是”。我相信会有 我发现windows通过GUI在任务调度程序中提供了这种功能,因此也必须通过代码实现C# 以编程方式选择性地禁用Windows上特定程序的UAC,c#,windows,scheduled-tasks,uac,C#,Windows,Scheduled Tasks,Uac,在stack和其他论坛上有几十篇关于禁用/绕过/抑制UAC的帖子和问题/答案。也有解决办法。但从程序上来说,也许不是。我只能看到一个解决方案,但可能没有给出真正的编程解决方案 是否有一种编程解决方案可以让用户在每次运行wamp之类的程序时都得到提示,并且用户总是必须单击“是”,因此最好告诉windows他们的选择总是“是”。我相信会有 我发现windows通过GUI在任务调度程序中提供了这种功能,因此也必须通过代码实现 更新:我已经准备了一个纯编程的解决方案,它正在工作。参见我的答案。正确的方法
更新:我已经准备了一个纯编程的解决方案,它正在工作。参见我的答案。正确的方法不是忽略用户访问控制(UAC),而是在这些参数内进行测试。这样,您就不会破坏安全性,而是在安全范围内工作 通过禁用安全性,您将面临被利用的风险。据Secuna所说,提供几项安全测试的公司已经注意到,小公司、懒惰的开发人员应用程序以及公然无视安全性的应用程序是人们关注的焦点 这意味着您的应用程序可能在某个时候成为受害者 我将采取的方法是在UAC内部进行测试。确保有适当的权限来执行任务,这样它就不会以提升的权限持续运行。例如:
class Elevated_Rights
{
// Token Bool:
private bool _level = false;
#region Constructor:
protected Elevated_Rights()
{
// Invoke Method On Creation:
Elevate();
}
#endregion
public void Elevate()
{
// Get Identity:
WindowsIdentity user = WindowsIdentity.GetCurrent();
// Set Principal
WindowsPrincipal role = new WindowsPrincipal(user);
#region Test Operating System for UAC:
if (Environment.OSVersion.Platform != PlatformID.Win32NT || Environment.OSVersion.Version.Major < 6)
{
// False:
_level = false;
}
#endregion
else
{
#region Test Identity Not Null:
if (user == null)
{
// False:
_level = false;
}
#endregion
else
{
#region Ensure Security Role:
if (!(role.IsInRole(WindowsBuiltInRole.Administrator)))
{
// False:
_level = false;
}
else
{
// True:
_level = true;
}
#endregion
}
}
}
类权限
{
//令牌布尔:
私有布尔值_级别=false;
#区域构造函数:
受保护的权利()
{
//创建时调用方法:
提升();
}
#端区
公共图书馆
{
//获取身份:
WindowsIdentity用户=WindowsIdentity.GetCurrent();
//设定本金
WindowsPrincipal角色=新的WindowsPrincipal(用户);
#UAC的区域测试操作系统:
if(Environment.OSVersion.PlatformID.Win32NT | | Environment.OSVersion.Version.Major<6)
{
//错误:
_级别=假;
}
#端区
其他的
{
#区域测试标识不为空:
if(user==null)
{
//错误:
_级别=假;
}
#端区
其他的
{
#确保区域安全的作用:
if(!(role.IsInRole(WindowsBuiltInRole.Administrator)))
{
//错误:
_级别=假;
}
其他的
{
//正确:
_级别=真;
}
#端区
}
}
}
按照这些思路,您可以对UAC进行测试,然后执行一项任务。我不太清楚您为什么要禁用UAC,但这将是我的方法
希望这会有所帮助。快速描述:创建一个新的控制台/窗口应用程序,以绕过UAC运行任何应用程序。请按照下面的指导选择此应用程序中目标应用程序的路径,编译此程序一次,然后随时运行 一步一步
到
6.现在编译并运行应用程序(此应用程序)
现在,您的应用程序(例如WAMP)将在不提示任何UAC对话框的情况下运行(在我的情况下,每次登录windows时) 来源 发起人:和 基本思想来自:
的基本实现如果您想绕过作为标准用户运行所获得的保护,那么更好的解决方案是更改文件夹和注册表项的权限,以便允许所有用户修改应用程序的文件夹
GrantAllUsersFullControlToFileOrFolder("C:\Program Files\Grobtastic");
使用伪代码实现:
void GrantAllUsersFullControlToFileOrFolder(String path)
{
PACL oldDACL;
PACL newDACL;
PSECURITY_DESCRIPTOR sd;
//Get the current DALC (Discretionary Access Control List) and Security Descriptor
GetNamedSecurityInfo(path, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION,
nil, nil, ref oldDACL, nil, ref sd);
//Create an SID for the "Users" group
PSID usersSid = StringToSid("S-1-5-32-545");
// Initialize an EXPLICIT_ACCESS structure for the new Access Control Entry (ACE)
EXPLICIT_ACCESS ea;
ZeroMemory(@ea, SizeOf(EXPLICIT_ACCESS));
ea.grfAccessPermissions = GENERIC_ALL;
ea.grfAccessMode = GRANT_ACCESS;
ea.grfInheritance = SUB_CONTAINERS_AND_OBJECTS_INHERIT;
ea.Trustee.TrusteeForm = TRUSTEE_IS_SID;
ea.Trustee.TrusteeType = TRUSTEE_IS_GROUP;
ea.Trustee.ptstrName = PChar(usersSID);
// Create a new ACL that merges the new ACE into the existing ACL.
// SetEntriesInAcl takes care of adding the ACE in the correct order in the list
SetEntriesInAcl(1, @ea, oldDACL, ref newDACL); //use LocalFree to free returned newDACL
//Attach the new ACL as the object's new DACL
SetNamedSecurityInfo(path, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION,
nil, nil, newDACL, nil);
LocalFree(HLOCAL(sd));
LocalFree(HLOCAL(newDACL));
FreeSid(usersSID);
}
即使在禁用UAC的情况下(即用户是标准用户,并且没有方便的提升方式),此功能也适用于Windows XP,在Windows XP中,没有UAC便利功能,您必须快速切换用户才能以管理员身份运行某项功能
然后,由于不需要管理权限,您可以将可执行文件显化为运行asInvoker
问问自己: 在Windows XP上我会做什么?
在禁用UAC的Windows 7上,我会怎么做
如果他们是标准用户,您的程序会死机吗?您为什么要绕过UAC@JakobBowyer因为无论我在哪里部署我的c#,mysql桌面应用程序(需要在系统上运行wamp),当wamp启动时,用户会对UAC对话感到恼火。这听起来是个愚蠢的想法。如果有人利用你的软件,你已经为他们做了UAC旁路,你现在打开了一个巨大的该死的安全漏洞,怎么办flaw@JakobBowyer你太咄咄逼人了,不能讨论。我在个人电脑上运行的桌面应用程序没有安全风险尤特。你可能仍然是对的。你可以否决投票,你可以劝阻其他人来指导我。这是你的权利。但是你的语言和论据没有说服力,但就像表现出厌恶一样。我很抱歉,但这就是我的感受。这个问题有-4个,另一个有10个。这两个问题都是关于禁用UAC的;其中一个有
void GrantAllUsersFullControlToFileOrFolder(String path)
{
PACL oldDACL;
PACL newDACL;
PSECURITY_DESCRIPTOR sd;
//Get the current DALC (Discretionary Access Control List) and Security Descriptor
GetNamedSecurityInfo(path, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION,
nil, nil, ref oldDACL, nil, ref sd);
//Create an SID for the "Users" group
PSID usersSid = StringToSid("S-1-5-32-545");
// Initialize an EXPLICIT_ACCESS structure for the new Access Control Entry (ACE)
EXPLICIT_ACCESS ea;
ZeroMemory(@ea, SizeOf(EXPLICIT_ACCESS));
ea.grfAccessPermissions = GENERIC_ALL;
ea.grfAccessMode = GRANT_ACCESS;
ea.grfInheritance = SUB_CONTAINERS_AND_OBJECTS_INHERIT;
ea.Trustee.TrusteeForm = TRUSTEE_IS_SID;
ea.Trustee.TrusteeType = TRUSTEE_IS_GROUP;
ea.Trustee.ptstrName = PChar(usersSID);
// Create a new ACL that merges the new ACE into the existing ACL.
// SetEntriesInAcl takes care of adding the ACE in the correct order in the list
SetEntriesInAcl(1, @ea, oldDACL, ref newDACL); //use LocalFree to free returned newDACL
//Attach the new ACL as the object's new DACL
SetNamedSecurityInfo(path, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION,
nil, nil, newDACL, nil);
LocalFree(HLOCAL(sd));
LocalFree(HLOCAL(newDACL));
FreeSid(usersSID);
}