Delphi 如何以编程方式检查修改权限?
如何以编程方式检查文件夹的“创建文件”权限? 修改文件权限?删除文件权限?Delphi 如何以编程方式检查修改权限?,delphi,file-permissions,uac,Delphi,File Permissions,Uac,如何以编程方式检查文件夹的“创建文件”权限? 修改文件权限?删除文件权限? GetNamedSecurityInfo返回我可以写入C:\Program Files但UAC说访问被拒绝(5) 如何有效地确定访问权限 我的代码: function GetAccessRights(const FileName: String; ObjectType: SE_OBJECT_TYPE; var Access: Cardinal): Cardinal; var SecDesc: PSECURITY
GetNamedSecurityInfo
返回我可以写入C:\Program Files
但UAC说访问被拒绝(5)
如何有效地确定访问权限 我的代码:
function GetAccessRights(const FileName: String; ObjectType: SE_OBJECT_TYPE;
var Access: Cardinal): Cardinal;
var
SecDesc: PSECURITY_DESCRIPTOR;
pDacl: PACL;
Trusteee: TRUSTEE_;
begin
result := GetNamedSecurityInfo(PChar(FileName), ObjectType,
DACL_SECURITY_INFORMATION, nil, nil, @pDacl, nil, SecDesc);
if ERROR_SUCCESS = result then
begin
// the pDacl may be NULL if the object has unrestricted access
if pDacl <> nil then
begin
with Trusteee do
begin
pMultipleTrustee := nil;
MultipleTrusteeOperation := NO_MULTIPLE_TRUSTEE;
TrusteeForm := TRUSTEE_IS_NAME;
TrusteeType := TRUSTEE_IS_UNKNOWN;
ptstrName := 'CURRENT_USER';
end;
result := GetEffectiveRightsFromAcl(pDacl^, Trusteee, Access);
end
else
begin
Access := $FFFFFFFF;
result := ERROR_SUCCESS;
end;
if SecDesc <> nil then
LocalFree(Cardinal(SecDesc));
end;
end;
函数GetAccessRights(常量文件名:String;ObjectType:SE_OBJECT_TYPE;
var访问:Cardinal):Cardinal;
变量
SecDesc:PSECURITY\u描述符;
pDacl:PACL;
受托人:受托人;
开始
结果:=GetNamedSecurityInfo(PChar(文件名),ObjectType,
DACL_安全信息,无,无,@pDacl,无,SecDesc);
如果错误\成功=结果,则
开始
//如果对象具有不受限制的访问权限,则pDacl可能为空
如果pDacl为零,则
开始
相信你
开始
pMultipleTruste:=零;
MultipleTrusteOperation:=无多个受托人;
TrusteeForm:=受托人\为\名;
TrusteeType:=受托人\未知;
ptstrName:=“当前用户”;
结束;
结果:=GetEffectiveRightsFromAcl(pDacl^,受信任方,访问);
结束
其他的
开始
访问:=$FFFFFFFF;
结果:=错误\成功;
结束;
如果SecDesc为零,则
LocalFree(基数(SecDesc));
结束;
结束;
我一直在使用它。使用Win2K/XP/Vista/7对我来说效果非常好
我的安装项目示例:
检查修改权限:
Result := CheckAccessToFile($001301BF, 'C:\foo', 'BUILTIN\Users');
关于我答案的说明:以上代码回答了OP问题:
如何以编程方式检查修改权限
但是,如果您需要做的只是检查您的应用程序是否能够写入目录,我将不使用这种ACL解决方案,并实际尝试向其写入临时文件,以便我100%确定可以写入
我使用此代码作为安装过程的一部分,我需要为某些目录授予modify
权限,因此此代码用于检查该目录是否还没有这些权限-这可能与您的情况非常不同
关于这个问题有一些讨论:
因此,您需要根据实际情况选择解决方案。请求宽恕比获得许可更容易。程序文件不需要宽恕。
。Windows在虚拟存储中写入文件。为什么?如果你有一个GUI,你想在其中显示这些信息,那么你需要找出你是否有权限,你没有选择;如果你真的需要写一些东西,没有什么比尝试更好的了:创建一个临时文件,然后删除它。我怀疑其他任何东西是否真正可靠,提示:当服务器软件是Samba时,谁能可靠地说您是否在映射的网络驱动器上有写访问权限?即使完全访问配置文件,也可能很棘手@barbaris UAC虚拟化在您包含带有适当信任信息部分的清单后将被禁用。您可以在任务管理器中查看应用程序是否是UAC虚拟化的,在流程视图中有一个自定义列。这里的所有血淋淋的细节:至于您的需求,您几乎肯定希望requestedExecutionLevel
中的asInvoker
。
Result := CheckAccessToFile($001301BF, 'C:\foo', 'BUILTIN\Users');