在没有UAC提示的情况下使用管理员权限运行python程序
我正在制作一个python应用程序,并使用pyinstaller进行编译。当用户仅为自己安装应用程序时没有问题,但当用户为所有用户安装应用程序时,会出现权限拒绝错误 它基本上是我为一个项目制作的聊天机器人。当程序第一次运行时,它从用户那里获取一些基本数据并存储在一个文件中。如果仅为该用户安装程序,即存储在用户appdata文件夹中的程序,则不会出现问题 但是,当用户尝试为所有用户安装它时,即程序存储在program files(x86)文件夹中,由于该文件夹受系统保护,因此会出现权限错误 我试图通过添加--uac admin标志来绕过它,但是每次用户想要运行程序时都要通过uac提示符是不方便的 我想知道是否有一种方法可以在没有UAC提示的情况下以管理员身份运行程序 任何帮助都将不胜感激在没有UAC提示的情况下使用管理员权限运行python程序,python,windows,pyinstaller,uac,Python,Windows,Pyinstaller,Uac,我正在制作一个python应用程序,并使用pyinstaller进行编译。当用户仅为自己安装应用程序时没有问题,但当用户为所有用户安装应用程序时,会出现权限拒绝错误 它基本上是我为一个项目制作的聊天机器人。当程序第一次运行时,它从用户那里获取一些基本数据并存储在一个文件中。如果仅为该用户安装程序,即存储在用户appdata文件夹中的程序,则不会出现问题 但是,当用户尝试为所有用户安装它时,即程序存储在program files(x86)文件夹中,由于该文件夹受系统保护,因此会出现权限错误 我试图
- 您希望所有用户都能够在应用程序的程序文件(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;
过程GrantAllUsersFullControlOfFileOrFolder(路径:字符串);
常数
安全性_NULL_SID_AUTHORITY:TSIDIdentifierAuthority=(值:(0,0,0,0,0))//S-1-0 ntifs.h
SECURITY_WORLD_SID_AUTHORITY:TSIDIdentifierAuthority=(值:(0,0,0,0,1))//S-1-1
SECURITY_LOCAL_SID_AUTHORITY:TSIDIdentifierAuthority=(值:(0,0,0,0,2))//S-1-2
安全创建者SID权限:TSIDIdentifierAuthority=(值:(0,0,0,0,0,3))//S-1-3
安全授权:TSIDIdentifierAuthority=(值:(0,0,0,0,0,5))//S-1-5
//相对标识符(RID)
安全性\u NULL\u RID=0//在权限S-1-0中
安全世界RID=0//授权S-1-1
安全\u本地\u RID=0//授权S-1-2
安全\u创建者\u所有者\u RID=0//授权S-1-3
安全\u创建者\u组\u RID=1//授权S-1-3
安全性内置域RID=$00000020;//32-->S-1-5-32
域\u别名\u RID\u管理员=$00000220//544-->S-1-5-32-544
域别名用户=00000221美元//545-->S-1-5-32-545表示域中所有用户的本地组。
变量
usersSID:PSID;
//研究:布尔;
sd:PSECURITY_描述符;
oldAcl,newAcl:PACL;
dw:DWORD;
ea:显式访问;
开始
//为“用户”组(S-1-5-32-545)创建已知SID
usersSid:=StringToSid('S-1-5-32-545')//知名“用户”群体
尝试
//获取当前的DACL。带有LocalFree的Free SecurityDescriptor
标准差:=零;
dw:=GetNamedSecurityInfo(PChar(路径),SE_文件_对象,DACL_安全性_信息,nil,nil,@oldAcl,nil,{var}sd);
如果(dw错误\成功),则
上升误差;
尝试
//初始化新ACE的显式\u访问结构
零内存(@ea,SizeOf(显式访问));
ea.grfAccessPermissions:=泛型\读或泛型\写或泛型\执行{或泛型\全部}//是的,它不是“真正的”完全控制
ea.grfAccessMode:=授予_访问权;
ea.grfInheritance:=子容器和对象继承;
ea.Trustee.TrusteeForm:=受托人\u为\u SID;
ea.Trustee.TrusteeType:=受托人是受托人组//受托人是知名的集团;
ea.Trustee.ptstrName:=PChar(usersSID);
//创建新ACL,将新ACE合并到现有ACL中。使用LocalFree释放新ACL
dw:=setEntriesAcl(1,@ea,oldAcl,{var}newAcl)//使用LocalFree释放新ACL
如果dw错误\成功,则
赖斯拉塞尔罗(dw);
尝试
//附加新ACL作为对象的新DACL
dw:=SetNamedSecurityInfo(PChar(路径),SE_文件对象,DACL_安全信息,nil,nil,newAcl,nil);
如果(dw错误\成功),则
上升误差;
最后
LocalFree(HLOCAL(newAcl));
结束;
最后
本地自由(HLOCAL(sd));
结束;
最后
LocalFree(HLOCAL(usersSid));
结束;
结束;
这也意味着恶意软件可以随时修改您的程序。但是你可以接受,正如你所说,你希望任何标准用户都能修改你的应用程序。简短的回答是不,你不能这样做。如果出现UAC提示,则无法“绕过”(或自动接受,即“是”按钮)UAC提示。(想象一下,如果这是可能的话:这正是所有恶意软件都会做的。)但有没有一种合法的方法可以做到这一点。因为像microsoft团队这样的商业应用程序即使存储在program files(x86)文件夹中也不要求uac权限,这需要管理员权限。管理员级进程将程序安装到受保护的位置并不意味着该程序在运行该程序时需要管理员权限。但在我的情况下,这是给我一个权限拒绝错误。我无法将数据写入文件。任何合法的方式,你都需要更新你的问题,用你想要做的事情的精确细节。如前所述,您的问题提供的信息不足。感谢您的回复,我们一定会尝试一下。顺便说一句,目前,我已禁用该应用程序的通用安装,因为这是问题的根源。