以管理员身份运行不带UAC弹出窗口的可执行文件

时间:2016-09-16 05:48:21

标签: powershell vbscript uac administrator

我正在开展一项大型研究,我们在不同国家/地区的员工收集有关运行Windows 10 Enterprise的平板电脑的信息。每位员工都被分配到平板电脑,他们使用标准用户名和密码登录平板电脑。这些用户在计算机上没有本地管理员权限,但所有平板电脑都有一个管理员用户名和密码,我知道这些用户名和密码在平板电脑上是统一的。

每晚,用户在平板电脑上调用一个程序,将数据上传到我们的服务器,然后在此同步过程中将信息传回平板电脑。否则,他们将脱离互联网。在同步过程结束时,执行一个程序,允许我运行我喜欢的任何脚本,但脚本在标准用户帐户下执行(即没有提升权限)。

我需要更新所有平板电脑,修复他们在平板电脑上使用的软件,我想在同步过程中执行此操作。错误修复包含在一个简单的可执行文件中,可以轻松地将其推送到工作人员的平板电脑以及同步期间我喜欢的任何代码。如果用户以管理员身份运行同步程序,这不会有问题,因为我可以在同步结束时通过脚本简单地运行可执行文件。但它们不是,所以我试图找到一种方法可以运行脚本(我真的不在乎它是什么。它可能是一个Windows批处理文件,一个vbs脚本,VB.NET,powershell,等)并使该脚本以管理权限执行并在没有UAC提示干扰的情况下运行安装。

我甚至不介意用纯文本提供管理密码,因为这些用户都是我们的员工,他们无法真正做任何与我们有关的事情(我总是可以通过以下方式部署后续文件)同步过程删除其中有密码的程序)。我意识到这听起来有点复杂,但简而言之,我想执行这些步骤:

  1. 将错误更新可执行文件发送到平板电脑(我现在可以这样做)
  2. 开发自定义代码,将管理员凭据传递到平板电脑并在不显示UAC的情况下将可执行文件安装在1中(我可以在同步期间将脚本发送到平板电脑但不知道如何以管理员身份执行它而不会获得UAC提示)。
  3. 我有什么想法可以做到这一点?我使用PowerShell脚本(例如herehere所描述的脚本,一整天都在探索这一点。这是我在$cred中存储凭据后得到的最接近的,但它继续给我UAC提示:

    Start-Process PowerShell.exe -Cred $cred -ArgumentList '-command &{Start-Process -FilePath C:\MySyncPath\BugFix32.exe -Verb runas}]
    

    更新

    经过一些额外的工作后,我想我能够运行,如果我可以通过一个可以在普通用户帐户下运行并将管理员凭据传递给它的脚本以某种方式禁用UAC控制。知道我怎么能够做到这一点?如果我可以让它工作,即使重新启动,我也能够完成我需要的工作。

4 个答案:

答案 0 :(得分:1)

以域管理员帐户运行脚本...并在脚本运行之前设置执行策略,然后以管理员身份运行...某些应用仍然对UAC保持挑剔,但是Set-ExecutionPolicy [bypass / remotesigned]将确保没有提示您。但是,如果域管理员帐户无权访问共享,则共享和权限可能仍然是一个问题。 psexec可以做到这一点,但这实际上只是我刚才提到的事情,而psexec文件实际上是在脚本末尾写出了权限。目的是确保密码不是以明文形式编写的,而是对密码值进行哈希处理。无论哪种方式,如果您希望安全地完成此操作,请使用GPO并确保您的文件权限/共享处于最高级别,这可能会使提示重复。这就是为什么您会看到某些批处理文件使用%1%2%3%4%5%6%7%8%9 ...的原因。这是因为它会自动请求海拔高度,并且会以迭代周期循环,直到UAC提示符不没必要。

我知道我遇到了一个老问题,但这就是我发现的,试图将旧的cmd批次与powershell混合并匹配...要考虑导致调用的执行策略与调用期间的执行策略,需要考虑很多...

答案 1 :(得分:0)

这个问题属于“当人们要求安全漏洞作为功能时”。

您无法绕过(或者,如果您更喜欢这种措辞,“以编程方式接受”)UAC提示并自动提升而无需交互式确认。 UAC专门用于防止这种情况发生。 (如果可能的话,所有恶意软件都会这样做。)

答案 2 :(得分:0)

您遇到的实际问题是您要更新应用程序,但应用程序位于程序文件文件夹(或标准用户不允许修改的其他位置) )。

为了让任何用户都能够更新您的程序,您必须将所有用户完全控制授予您的文件夹。理想情况下,您的应用程序的安装程序会在安装期间(当安装程序以管理员身份运行时)对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 usually have a shim applied by Microsoft that gives所有用户控制应用程序文件夹。

答案 3 :(得分:-1)

这不是PowerShell的东西,而是一般的Windows 10。您需要为此禁用UAC。但是在Windows 10上没有它的经验。

您可以尝试将EnableLUA注册表项设置为0。关键可以在: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System

这可能需要重新启动才能激活。