运行 python 具有管理员权限但没有 UAC 提示的程序
Running python program with admin priviledges without the UAC prompt
我正在制作一个 python 应用程序并使用 pyinstaller 编译它。当用户只为 himself/herself 安装应用程序时没有问题,但是当 he/she 为所有用户安装应用程序时,它会给出权限被拒绝的错误。
它基本上是我为一个项目制作的聊天机器人。当程序第一次 运行 时,它从用户那里获取一些基本数据并存储在一个文件中。只为该用户安装程序时没有问题,即程序存储在用户的 appdata 文件夹中。
但是当用户尝试为所有用户安装它时,即程序存储在程序文件(x86)文件夹中,由于该文件夹受系统保护,它会给出权限错误。
我试图通过添加 --uac-admin 标志来绕过它,但是每次用户想要 运行 程序时都要通过 UAC 提示并不方便。
我想知道是否有办法在没有 UAC 提示的情况下以管理员身份 运行 程序。
非常感谢任何帮助!
- 您希望所有用户都能够在 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 = [=10=]000020; // 32 --> S-1-5-32
DOMAIN_ALIAS_RID_ADMINS = [=10=]000220; //544 --> S-1-5-32-544
DOMAIN_ALIAS_RID_USERS = [=10=]000221; //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;
这也意味着恶意软件可以随时修改您的程序。但是您对此没有意见,正如您所说,您希望任何标准用户都能够修改您的应用程序。
我正在制作一个 python 应用程序并使用 pyinstaller 编译它。当用户只为 himself/herself 安装应用程序时没有问题,但是当 he/she 为所有用户安装应用程序时,它会给出权限被拒绝的错误。
它基本上是我为一个项目制作的聊天机器人。当程序第一次 运行 时,它从用户那里获取一些基本数据并存储在一个文件中。只为该用户安装程序时没有问题,即程序存储在用户的 appdata 文件夹中。
但是当用户尝试为所有用户安装它时,即程序存储在程序文件(x86)文件夹中,由于该文件夹受系统保护,它会给出权限错误。
我试图通过添加 --uac-admin 标志来绕过它,但是每次用户想要 运行 程序时都要通过 UAC 提示并不方便。
我想知道是否有办法在没有 UAC 提示的情况下以管理员身份 运行 程序。
非常感谢任何帮助!
- 您希望所有用户都能够在 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 = [=10=]000020; // 32 --> S-1-5-32
DOMAIN_ALIAS_RID_ADMINS = [=10=]000220; //544 --> S-1-5-32-544
DOMAIN_ALIAS_RID_USERS = [=10=]000221; //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;
这也意味着恶意软件可以随时修改您的程序。但是您对此没有意见,正如您所说,您希望任何标准用户都能够修改您的应用程序。