选择性地禁用Windows上特定程序的UAC

busg9geu  于 2023-03-04  发布在  Windows
关注(0)|答案(3)|浏览(252)

在stack和其他论坛上有很多关于禁用/绕过/抑制UAC的问题/答案。也有解决方案。但从程序上看可能没有。我只能看到一个解决方案Disabling UAC programmatically,但可能没有真正的程序解决方案。
有没有一个程序化的解决方案,保存用户提示每次他/她运行一个程序,如wamp,他们总是要点击是,所以这将是更好地告诉窗口,他们的选择总是是。我相信会有作为
我已经发现Here,windows通过GUI在任务计划程序中提供了这个工具,所以它必须通过代码也是可能的。

更新:我已经准备了一个纯程序化的解决方案,它正在工作。

wmvff8tz

wmvff8tz1#

    • 简单描述:**创建一个新的控制台/窗口应用程序来运行任何应用程序,绕过UAC,按照下面的指导在此应用程序中选择目标应用程序的路径,编译此程序一次,随时运行
    • 一步一步**

1.从This link =〉Original Source => dllme.com下载Microsoft.Win32.TaskScheduler.dll
1.制作一个c#应用程序(Windows或控制台)并添加对上述dll的引用
1.将新项(应用程序清单文件)添加到项目(此应用程序)
1.将<requestedExecutionLevel level="asInvoker" uiAccess="false" />更改为<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
1.在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.Logon);          
      td.Triggers.AddNew(TaskTriggerType.Once);    // 
      string program_path = @"c:\wamp\wampmanager.exe";
      // you can have dynamic value for 'program_path'
      //even of user choice giving an interface in win-form app

      td.Actions.Add(new ExecAction(program_path, null));
      ts.RootFolder.RegisterTaskDefinition("anyNamefortask", td);          
   }
}

6.现在编译并运行您的应用程序(此应用程序)
现在你的应用程序(如WAMP)将运行,而不会提示任何UAC对话框上你想要的时间表(每次你登录窗口在我的情况下)

    • 资料来源**

发起人:Can you turn off UAC for a single app?Selectively disabling UAC for specific programs on Windows 7
基本思想来源:Make Vista launch UAC restricted programs at startup with Task Scheduler

nfzehxib

nfzehxib2#

正确的方法不是忽略用户访问控制(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,但这将是我的方法。
希望能有所帮助。

7lrncoxx

7lrncoxx3#

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

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,那里没有UAC便利功能,你必须快速切换用户才能以管理员身份运行一些东西。
然后,您将显示可执行文件以运行asInvoker,因为您不需要管理权限。
扪心自问:
我在Windows XP上会做什么?
如果禁用了UAC,我会在Windows 7上做什么?
如果他们是一个标准用户,你的程序会崩溃吗?

相关问题