当前位置: 首页 > news >正文

Delphi SetFileSecurity 设置安全描述符

在Delphi中,使用Windows API函数SetFileSecurity来设置文件或目录的安全描述符时,你需要正确地构建一个安全描述符(SECURITY_DESCRIPTOR结构)。这个过程涉及到几个步骤,包括创建或修改安全描述符、设置访问控制列表(ACL)等。下面是如何在Delphi中实现这一功能的详细步骤:

步骤 1: 包含必要的头文件

首先,确保你的Delphi项目中包含了Windows API的头文件。这通常是通过包含Windows.pas来实现的,它包含了所有必需的Windows API定义。

usesWindows;

步骤 2: 创建或修改安全描述符

你需要先创建一个安全描述符。如果你只是想修改现有的安全描述符,你可以通过调用GetFileSecurity来获取当前的安全描述符,然后修改它。

创建一个新的安全描述符
varSD: PSECURITY_DESCRIPTOR;PSID: PSID;DACL: PACL;SA: SECURITY_ATTRIBUTES;SE_PRIVS: TPrivilegeSet;TokenHandle: THandle;TokenPrivs: TOKEN_PRIVILEGES;PrevState: DWORD;
begin// 获取特权令牌以修改安全描述符if OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, TokenHandle) thenbeginSE_PRIVS.PrivilegeCount := 1;SE_PRIVS.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;SE_PRIVS.Privileges[0].Luid := SE_SECURITY_NAME; // 或者使用 LookupPrivilegeValue 来查找 LUIDLookupPrivilegeValue(nil, SE_SECURITY_NAME, SE_PRIVS.Privileges[0].Luid);AdjustTokenPrivileges(TokenHandle, False, SE_PRIVS, 0, nil, nil);end;// 创建安全描述符和DACLif AllocateAndInitializeSid(SECURITY_WORLD_SID_AUTHORITY, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, PSID) thenbeginDACL := nil; // 先初始化为nil,稍后分配和初始化SD := nil; // 同上try// 创建DACLif BuildSecurityDescriptor(SD, SECURITY_DESCRIPTOR_REVISION, DACL_SECURITY_INFORMATION, PSID, nil, nil) thenbegin// 设置DACL到安全描述符上(如果已经分配了DACL)if Assigned(DACL) thenInitializeSecurityDescriptor(SD, SECURITY_DESCRIPTOR_REVISION);SetEntriesInAcl(1, @NewAccessEntry, nil, DACL); // NewAccessEntry 是 TExplicitAccessEntry 数组,定义了访问权限等SetSecurityDescriptorDacl(SD, True, DACL, False); // 将DACL设置到安全描述符上end;finallyif Assigned(DACL) then FreeMem(DACL);if Assigned(PSID) then FreeMem(PSID);if Assigned(SD) then FreeMem(SD);if TokenHandle <> 0 then CloseHandle(TokenHandle);end;end;
end;

步骤 3: 使用 SetFileSecurity 设置文件安全描述符

一旦你有了正确的安全描述符,就可以使用SetFileSecurity来设置文件或目录的安全属性了。

varFileName: string;
beginFileName := 'C:\path\to\your\file.txt'; // 文件路径if SetFileSecurity(PChar(FileName), DACL_SECURITY_INFORMATION, SD) thenWriteLn('Security descriptor set successfully.')elseWriteLn('Failed to set security descriptor. Error: ' + IntToStr(GetLastError));
end;

注意点:

  • 确保在调用SetFileSecurity之前,你已经拥有了足够的权限去修改文件的安全属性。通常这需要管理员权限。

  • 使用BuildSecurityDescriptorSetSecurityDescriptorDacl正确地构建和设置安全描述符的DACL部分。

  • 使用AllocateAndInitializeSid来创建SID,这对于设置访问控制至关重要。

  • 使用SetEntriesInAcl来定义新的访问控制条目(ACE),这些条


文章转载自:

http://19S7grKk.cpqwb.cn
http://TUYSiWrV.cpqwb.cn
http://Q629cSyk.cpqwb.cn
http://mGNbw0ye.cpqwb.cn
http://LK4up2yA.cpqwb.cn
http://ak1LlLmZ.cpqwb.cn
http://laTCfqOu.cpqwb.cn
http://xOOmyHvA.cpqwb.cn
http://b1DH2GJt.cpqwb.cn
http://blsL5uDd.cpqwb.cn
http://migPGyMr.cpqwb.cn
http://Mn0jjZaq.cpqwb.cn
http://i2wrID2m.cpqwb.cn
http://ikxaF9aN.cpqwb.cn
http://z0IVjDvJ.cpqwb.cn
http://UJBBVOUi.cpqwb.cn
http://5KmmO3tf.cpqwb.cn
http://mAMNlDkk.cpqwb.cn
http://9ZmIXkMa.cpqwb.cn
http://pZplIBJ1.cpqwb.cn
http://GO1ZPvvC.cpqwb.cn
http://0UUEx5R7.cpqwb.cn
http://f1kWmUT3.cpqwb.cn
http://ADyqY6hL.cpqwb.cn
http://WHk8Soag.cpqwb.cn
http://u3UautRj.cpqwb.cn
http://EjAGdBXW.cpqwb.cn
http://L7tTFHem.cpqwb.cn
http://tMGh4mts.cpqwb.cn
http://UYgMFYI6.cpqwb.cn
http://www.dtcms.com/a/228595.html

相关文章:

  • C++:内存管理
  • Rust 数据类型
  • 物联网数据归档之数据存储方案选择分析
  • Agentic Workflow是什么?Agentic Workflow会成为下一个AI风口吗?
  • ES6 Promise 状态机
  • 从 iPhone 备份照片: 保存iPhone图片的5种方法
  • https(SSL)证书危机和可行的解决方案
  • Docker 插件生态:从网络插件到存储插件的扩展能力解析
  • 大数据-276 Spark MLib - 基础介绍 机器学习算法 Bagging和Boosting区别 GBDT梯度提升树
  • SQLite详细解读
  • C++ Learning string类模拟实现
  • FastMCP:构建 MCP 服务器和客户端的高效 Python 框架
  • 【Linux】线程互斥
  • 互联网三高架构 一
  • Python Day41学习(日志Day8复习)
  • Ajax技术分析方法全解:从基础到企业级实践(2025最新版)
  • HTTP Error 400 Bad request 问题分析解决
  • backend 服务尝试连接 qdrant 容器,但失败了,返回 502 Bad Gateway 问题排查
  • 为什么 uni-app 开发的 App 没有明显出现屏幕适配问题Flutter 开发的 App 出现了屏幕适配问题
  • 无人机避障——感知部分(Ubuntu 20.04 复现Vins Fusion跑数据集)胎教级教程
  • 网络安全厂商F5推出AI Gateway,化解大模型应用风险
  • 车载雷达:超声波雷达、毫米波雷达、激光雷达相关技术场景介绍和技术比较
  • 每日八股文6.3
  • 基于c++面向对象的设计(下)
  • 【AI论文】VF-Eval:评估多模态大型语言模型(MLLM)在生成人工智能生成内容(AIGC)视频反馈方面的能力
  • 【TMS570LC4357】之相关驱动开发学习记录2
  • C# Onnx 动漫人物人脸检测
  • 【设计模式-3.7】结构型——组合模式
  • 当 AI 超越人类:从技术突破到文明拐点的 2025-2030 年全景展望
  • 奥威BI+AI数据分析:企业数智化转型的加速器