【问题标题】:Running python program with admin priviledges without the UAC prompt在没有 UAC 提示的情况下以管理员权限运行 python 程序
【发布时间】:2021-05-21 00:13:28
【问题描述】:

我正在制作一个 python 应用程序并使用 pyinstaller 编译它。当用户只为自己安装应用程序时没有问题,但是当他/她为所有用户安装应用程序时,它给出了权限被拒绝的错误。

它基本上是我为一个项目制作的聊天机器人。当程序第一次运行时,它会从用户那里获取一些基本数据并存储在一个文件中。只为该用户安装程序时没有问题,即存储在用户的appdata文件夹中的程序。

但是当用户尝试为所有用户安装它时,即程序存储在程序文件(x86)文件夹中,它会给出权限错误,因为该文件夹受系统保护。

我尝试通过添加--uac-admin标志来绕过它,但是每次用户想要运行程序时都通过UAC提示并不方便。

我想知道是否有办法在没有 UAC 提示的情况下以管理员身份运行程序。

任何帮助将不胜感激!

【问题讨论】:

  • 简短的回答是否定的,你不能那样做。如果出现 UAC 提示,则不能“绕过”(或自动接受“是”按钮)UAC 提示。 (想象一下,如果这是可能的:这正是所有恶意软件都会做的事情。)
  • 但是有没有合法的方法可以这样做。因为像微软团队这样的商业应用程序不会要求 uac 权限,即使它们存储在程序文件 (x86) 文件夹中,这需要管理员权限..
  • 管理员级进程安装程序到受保护位置的事实并不意味着该程序在运行该程序时需要管理员权限.
  • 但在我的情况下,它给了我一个权限被拒绝的错误。我无法将数据写入文件。任何合法的方式这样做
  • 您将需要使用您正在尝试做的确切细节来更新您的问题。正如所写,您的问题提供的信息不足。

标签: python windows pyinstaller uac


【解决方案1】:
  • 您希望所有用户都能够在其 Program Files (x86) 文件夹中修改您的应用程序
  • 让您的安装程序更改文件夹的权限
  • 这样每个人都可以完全控制文件夹

如果您决定任何人都可以随时修改您的聊天程序,而无需成为管理员:那么请授予他们权限。

这里有一些伪代码将授予所有用户完全控制权。

procedure GrantAllUsersFullControlOfFileOrFolder(Path: string);
const
    SECURITY_NULL_SID_AUTHORITY:    TSIDIdentifierAuthority = (Value: (0,0,0,0,0,0));  //S-1-0  ntifs.h
    SECURITY_WORLD_SID_AUTHORITY:   TSIDIdentifierAuthority = (Value: (0,0,0,0,0,1));  //S-1-1
    SECURITY_LOCAL_SID_AUTHORITY:   TSIDIdentifierAuthority = (Value: (0,0,0,0,0,2));  //S-1-2
    SECURITY_CREATOR_SID_AUTHORITY: TSIDIdentifierAuthority = (Value: (0,0,0,0,0,3));  //S-1-3
    SECURITY_NT_AUTHORITY:          TSIDIdentifierAuthority = (Value: (0,0,0,0,0,5));  //S-1-5

    //Relative identifiers (RIDs)
    SECURITY_NULL_RID  = 0;         //in authority S-1-0
    SECURITY_WORLD_RID = 0;         //in authority S-1-1
    SECURITY_LOCAL_RID = 0;         //in authority S-1-2
    SECURITY_CREATOR_OWNER_RID = 0; //in authority S-1-3
    SECURITY_CREATOR_GROUP_RID = 1; //in authority S-1-3

    SECURITY_BUILTIN_DOMAIN_RID = $00000020; // 32 --> S-1-5-32
    DOMAIN_ALIAS_RID_ADMINS     = $00000220; //544 --> S-1-5-32-544
    DOMAIN_ALIAS_RID_USERS      = $00000221; //545 --> S-1-5-32-545 A local group that represents all users in the domain.
var
    usersSID: PSID;
//  res: BOOL;
    sd: PSECURITY_DESCRIPTOR;
    oldAcl, newAcl: PACL;
    dw: DWORD;
    ea: EXPLICIT_ACCESS;
begin
    //Create a well-known SID for the "Users" group (S-1-5-32-545)
    usersSid := StringToSid('S-1-5-32-545'); //well-known "Users" group
    try
        //Get the current DACL. Free SecurityDescriptor with LocalFree
        sd := nil;
        dw := GetNamedSecurityInfo(PChar(Path), SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, nil, nil, @oldAcl, nil, {var}sd);
        if (dw <> ERROR_SUCCESS) then
            RaiseLastWin32Error;
        try
            // Initialize an EXPLICIT_ACCESS structure for the new ACE
            ZeroMemory(@ea, SizeOf(EXPLICIT_ACCESS));
            ea.grfAccessPermissions  := GENERIC_READ or GENERIC_WRITE or GENERIC_EXECUTE {or GENERIC_ALL}; //Yes, it's not "really" full control
            ea.grfAccessMode         := GRANT_ACCESS;
            ea.grfInheritance        := SUB_CONTAINERS_AND_OBJECTS_INHERIT;
            ea.Trustee.TrusteeForm   := TRUSTEE_IS_SID;
            ea.Trustee.TrusteeType   := TRUSTEE_IS_GROUP; //TRUSTEE_IS_WELL_KNOWN_GROUP;
            ea.Trustee.ptstrName     := PChar(usersSID);

            // Create a new ACL that merges the new ACE into the existing ACL. Use LocalFree to free newAcl
            dw := SetEntriesInAcl(1, @ea, oldAcl, {var}newAcl); //use LocalFree to free newAcl
            if dw <> ERROR_SUCCESS then
                RaiseLastOSError(dw);
            try
                //Attach the new ACL as the object's new DACL
                dw := SetNamedSecurityInfo(PChar(Path), SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, nil, nil, newAcl, nil);
                if (dw <> ERROR_SUCCESS) then
                    RaiseLastWin32Error;
            finally
                LocalFree(HLOCAL(newAcl));
            end;
        finally
            LocalFree(HLOCAL(sd));
        end;
    finally
        LocalFree(HLOCAL(usersSid));
    end;
end;

这也意味着恶意软件可以随时修改您的程序。但是您可以接受,正如您所说,您希望任何标准用户都能够修改您的应用程序。

【讨论】:

  • 感谢您的回复,一定会试一试。顺便说一句,我暂时禁用了该应用的通用安装,因为这是导致问题的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-28
  • 1970-01-01
  • 1970-01-01
  • 2012-01-01
相关资源
最近更新 更多