以编程方式为Windows上的特定程序select性地禁用UAC

有关堆栈和其他论坛关于禁用/绕过/压制UAC的几十个post问题/答案。 也有解决scheme。 但是可能不是。 我只能看到一个解决scheme禁用UAC编程,但也许没有真正的程序化解决scheme。

能不能有一个程序化的解决scheme来保存用户每次运行一个像wamp这样的程序时都会被提示,而且他们总是需要点击yes,所以最好告诉windows他们的select总是肯定的。 我相信会有

我发现在这里 Windows通过GUI在Task Scheduler中提供了这个function,所以它也必须通过代码来实现。

更新:我准备了一个正在工作的纯程序化解决scheme。 看到我的答案。

  1. 从此Codeplex链接下载Microsoft.Win32.TaskScheduler.dll
  2. 使交流#应用程序(Windows或控制台),并添加对上述DLL的引用
  3. 添加新项目(应用程序清单文件)到您的项目(此应用程序)
  4. <requestedExecutionLevel level="asInvoker" uiAccess="false" />更改为<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
  5. 在你的program.cs文件中写下面的代码

 using System; using Microsoft.Win32.TaskScheduler; class Program { static void Main(string[] args) { TaskService ts = new TaskService(); TaskDefinition td = ts.NewTask(); td.Principal.RunLevel = TaskRunLevel.Highest; //td.Triggers.AddNew(TaskTriggerType.YourDesiredSchedule); td.Triggers.AddNew(TaskTriggerType.Logon); //td.Actions.Add(new ExecAction("Path Of your Application File", null)); td.Actions.Add(new ExecAction(@"c:\wamp\wampmanager.exe", null)); ts.RootFolder.RegisterTaskDefinition("anyNamefortask", td); } } 

6.现在编译并运行你的应用程序(这个程序)


现在你的应用程序(例如WAMP)将会运行而不会提示你想要的时间表上的任何UAC对话框(每当你登录窗口的时候)

来源

发起: 你可以关闭UAC的单个应用程序? 以及在Windows 7上针对特定程序选择性地禁用UAC

基本思想来自: 让Vista在启动时使用Task Scheduler启动UAC受限程序

创建计划任务的基本实现

正确的方法不会忽略用户访问控制(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 } } } 

沿着这些线路可以让你测试UAC,然后执行任务。 我不太清楚你为什么要禁用UAC,但这是我的方法。

希望有帮助。

如果要绕过以标准用户身份运行而获得的保护,则更好的解决方法是更改​​文件夹和注册表项的权限,以便允许所有用户修改应用程序的文件夹。

 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禁用的情况下(即用户是标准用户,并且没有提升的方便方法),这也是有效的。 它也适用于没有UAC便利功能的Windows XP,而且您必须快速切换到管理员身份才能运行。

然后,您将可执行文件显示为以运行状态运行,因为您不需要管理权限。


问你自己:

我会在Windows XP上做什么?
在UAC禁用的情况下,我将在Windows 7上完成什么?

如果他们是一个标准的用户,你的程序是否已经过时了?