我正在进行一项大型研究,各国的工作人员正在收集关于运行Windows 10 Enterprise的平板电脑的信息。每个工作人员都被分配到一个平板电脑上,他们用标准用户名和密码登录到平板电脑。这些用户在机器上没有本地的管理权限,但是所有的平板电脑都有一个管理员用户名和密码,我知道这些都是统一的。
每天晚上,用户在平板电脑上调用一个程序,将数据上传到我们的服务器,然后我们在同步过程中将信息传回给平板电脑。否则,它们就会与互联网断开连接。在同步过程结束时,执行一个允许我运行任何我喜欢的脚本的程序,但是脚本在标准用户帐户下执行(即没有提升的权限)。
我需要用他们在平板电脑上使用的软件的错误补丁来更新所有的平板电脑,我想在同步过程中这样做。bug修复包含在一个简单的可执行文件中,该文件可以很容易地被推送到staff的平板上,以及我在同步过程中喜欢的任何代码。如果用户以管理员的身份运行同步程序,这就不是问题,因为我可以通过同步结束时的脚本运行可执行文件。但事实并非如此,所以我正试图找到一种方法来运行一个脚本(我并不在乎它是什么。它可以是一个windows批处理文件、一个vbs脚本、VB.NET、powershell等等)并让该脚本以管理权限执行,并在不受UAC提示干扰的情况下运行安装。
老实说,我甚至不介意以明文形式提供管理密码,因为这些用户都是我们的员工,他们实际上不能对我们做任何与我们有关的事情(而且我总是可以通过同步过程部署一个后续文件,以删除其中包含密码的程序)。我意识到这听起来有点复杂,但简单地说,我想执行以下步骤:
知道我该怎么做吗?我一整天都在探索这个问题,但使用PowerShell脚本(如这里和这里 )的效果微乎其微。这是我在$cred中存储凭据后得到的最近的一次,但是它继续给我UAC提示:
Start-Process PowerShell.exe -Cred $cred -ArgumentList '-command &{Start-Process -FilePath C:\MySyncPath\BugFix32.exe -Verb runas}]更新
在做了一些额外的工作之后,我想如果我可以通过一个脚本禁用UAC控件,并将管理员凭据传递给它,我就可以让它运行起来。知道我怎么能做到这一点吗?如果我能让它工作起来,即使是重新启动,我也能完成我所需要的。
发布于 2016-09-23 21:47:42
实际问题是要更新应用程序,但应用程序位于Program 文件夹中(或其他一些不允许标准用户修改的位置)。
为了让任何用户能够更新您的程序,您必须将所有用户完全控制授予您的文件夹。理想情况下,应用程序的安装程序应该在安装期间(当安装程序作为管理员运行时)对DACL进行此调整。
现在,您将不得不满足最后一次用户提升为管理员的要求。然后,您可以禁用应用程序上的所有安全性-允许任何用户(恶意或非恶意)随意修改应用程序。
GrantEveryoneFullControlToFileOrFolder("C:\Program Files\Contoso");具有以下伪码实现:
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 = GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE;
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);
}对于任何用户都可以修改的应用程序,这并不是完全闻所未闻的:大多数MMO在播放时安装更新。MMOs通常有一个由微软应用的垫片,它提供所有用户控制应用程序文件夹。
发布于 2019-01-22 04:49:31
将脚本作为域管理帐户运行..。并在脚本运行之前设置执行策略,然后以管理员身份运行.有些应用程序仍然对UAC很挑剔,但是旁路/远程签名将确保您不会被提示。但是,如果域管理帐户无法访问共享,则共享和权限可能仍然是一个问题。psexec做到了这一点,但实际上是做我刚才提到的事情,psexec文件实质上是在脚本结束时写出权限。这样做的目的是确保密码不是用明文写的,而是哈希密码值。无论哪种方式,如果您希望安全地完成这一任务,那么使用GPO并确保您的文件权限/共享处于最高级别可能会迭代提示符。这就是为什么你会看到一些批处理文件使用%1 %2 %3 %4 %5 %6 %7 %8 %9 .这是因为它是自动请求高度,并将循环在一个迭代周期,直到UAC提示是不必要的。
我知道我碰到了一个旧线程,但这就是我所发现的,试图将遗留的cmd批与powershell混合起来.很多需要考虑的执行策略导致呼叫vs在通话期间.
发布于 2016-09-17 11:20:06
这个问题属于“当人们要求安全漏洞作为功能时”的范畴。
您不能绕过UAC提示符(或者,如果您更喜欢这个短语,“以编程方式接受”),并且在没有交互确认的情况下自动提升。UAC是专门为防止这种情况而设计的。(如果这是可能的话,所有恶意软件都会这么做。)
https://stackoverflow.com/questions/39524492
复制相似问题