在堆栈和其他论坛上有许多关于禁用/绕过/抑制 UAC 的帖子问题/答案。也有解决方案。但在程序上可能不是。我只能看到一种解决方案以编程方式禁用 UAC,但那里可能没有真正的编程解决方案。
是否有一个程序化的解决方案来保存用户,每次他/她运行像 wamp 这样的程序时都会提示他们,他们总是必须点击是,所以最好告诉 windows 他们的选择总是是的。我相信会有
我在这里发现windows通过GUI在任务计划程序中提供了这个工具,所以它也必须可以通过代码实现。
在堆栈和其他论坛上有许多关于禁用/绕过/抑制 UAC 的帖子问题/答案。也有解决方案。但在程序上可能不是。我只能看到一种解决方案以编程方式禁用 UAC,但那里可能没有真正的编程解决方案。
是否有一个程序化的解决方案来保存用户,每次他/她运行像 wamp 这样的程序时都会提示他们,他们总是必须点击是,所以最好告诉 windows 他们的选择总是是的。我相信会有
我在这里发现windows通过GUI在任务计划程序中提供了这个工具,所以它也必须可以通过代码实现。
快速描述:创建一个新的控制台/窗口应用程序以运行绕过 UAC 的任何应用程序,按照以下指导在此应用程序中选择目标应用程序的路径,编译该程序一次,并随时运行
一步步
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
为<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
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 it dynamic
//even of user choice giving an interface in win-form or wpf application
td.Actions.Add(new ExecAction(program_path, null));
ts.RootFolder.RegisterTaskDefinition("anyNamefortask", td);
}
}
6.现在编译并运行你的应用程序(这个应用程序)
现在,您的应用程序(例如 WAMP)将运行,而不会在您想要的时间表上提示任何 UAC 对话框(在我的情况下,每次您登录 Windows 时)
来源
发起自:您可以为单个应用关闭 UAC 吗?和有选择地为 Windows 7 上的特定程序禁用 UAC
基本思想来自:使用任务计划程序使 Vista 在启动时启动 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,您必须快速切换用户才能以管理员身份运行某些东西。
然后,您将可执行文件显示为运行asInvoker,因为您不需要管理权限。
问你自己:
我会在 Windows XP 上做什么?
在禁用 UAC 的 Windows 7 上我会做什么?
如果他们是标准用户,你的程序会死机吗?