0

0

C# 文件系统配额查询 C#如何获取Windows或Linux用户的磁盘配额信息

月夜之吻

月夜之吻

发布时间:2026-03-04 11:23:35

|

736人浏览过

|

来源于php中文网

原创

getdiskfreespaceex 和 driveinfo 不返回用户配额信息,因windows配额是ntfs卷级sid策略;需用wmi(win32_quotasetting/win32_diskquota)或netapi32查询,且须管理员权限。

c# 文件系统配额查询 c#如何获取windows或linux用户的磁盘配额信息

Windows 下用 GetDiskFreeSpaceEx 只能看总量,不返回配额

很多人调用 GetDiskFreeSpaceExDriveInfo 后发现 AvailableFreeSpace 和磁盘实际“剩余额度”对不上——不是 bug,是它压根不感知用户配额。Windows 配额是 NTFS 卷级策略,按用户 SID 限制,和卷总空间无关。

真正要查配额,得走 WMI 或 Win32 API 的 Win32_QuotaSetting + Win32_DiskQuota。但注意:Win32_DiskQuota 在 Windows 10/11 默认禁用,且仅对启用了配额的 NTFS 卷有效。

  • 必须以管理员权限运行,否则查询返回空或拒绝访问
  • Win32_DiskQuotaLimitUsage 字段单位是字节,不是 KB/MB,别直接除 1024 搞错量级
  • 查当前用户配额,得先用 WindowsIdentity.GetCurrent().User.Value 拿 SID,再匹配 QuotaEntryUserId

Linux 下没有统一“用户磁盘配额”API,靠 quotactl 系统调用

.NET 6+ 的 System.IO.DriveInfo 在 Linux 上完全忽略配额——它只读 /proc/mountsstatvfs,而配额信息存在 /aquota.user/quota.user 文件里,需用 quotactl

C# 没有内置封装,得 P/Invoke libcquotactl 函数。参数极易出错:比如 cmdQCMD(Q_GETQUOTA, USRQUOTA) 而不是硬编码数字;id 是 uid_t 类型(32 位),不是 .NET 的 int(可能溢出)。

  • 必须确保文件系统挂载时带 usrquotagrpquota 选项,否则 quotactl 返回 ENOSYS
  • 目标路径得是挂载点(如 /home),不是任意目录;传 /home/user 会失败
  • struct dqblk 的字段顺序、填充字节与 libc 版本强相关,建议用 Marshal.SizeOf<dqblk>()</dqblk> 校验,别手写偏移

跨平台抽象层别硬造,配额逻辑天然不兼容

试图写一个 IQuotaProvider.GetQuota(string path, string user) 并让它在 Windows/Linux 都工作,大概率掉坑里。两边模型根本不同:Windows 配额绑定 SID + 卷,Linux 绑定 uid + 挂载点 + quota 文件位置,且 Linux 还分 v1/v2 quota 格式。

WPS灵犀
WPS灵犀

WPS灵犀是WPS推出的一款AI智能办公和学习助手

下载

更现实的做法是分环境实现,用 #if WINDOWS / #if LINUX 隔离。别把配额当“文件系统属性”去泛化,它其实是操作系统策略子系统的一部分。

  • Windows 侧优先用 WMI(可读性强),性能差就换 NetApi32.dllNetUserGetInfo 查配额状态(但不返回用量)
  • Linux 侧不要依赖 quota 命令行工具输出——格式随 locale 变,解析不可靠;坚持用 quotactl
  • 没配额时,Windows 返回 Limit = 0,Linux 返回 dqb_bsoftlimit = 0,别当成“无限”,得结合 dqb_bhardlimit 判断是否启用

权限和错误处理比逻辑本身更关键

配额查询失败,90% 不是代码写错,而是权限或配置问题。Windows 报 UnauthorizedAccessException,大概率没管理员权限;Linux 报 EPERM,八成是没开 quota 或进程没 CAP_SYS_ADMIN

别在 catch 里吞掉异常然后返回 “0 bytes available”。真实场景中,配额未启用、服务未启动、路径不在配额卷上,都该区分反馈。

  • Windows:检查 Win32_QuotaSetting.QuotaState == true 再查配额项,否则直接跳过
  • Linux:先 access("/path/aquota.user", F_OK) 确认 quota 文件存在,再调 quotactl
  • 所有路径输入必须做 Path.GetFullPath 归一化,Linux 下 /home/../home 可能绕过挂载点判断

配额不是文件系统自带能力,它是额外开启的策略控制模块。查不到数据时,先确认它是否真的被启用,而不是急着改代码。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

910

2023.08.02

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

839

2023.08.22

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

910

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

600

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

294

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

212

2025.08.29

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1381

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1159

2023.07.27

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

0

2026.03.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 10.1万人学习

Git 教程
Git 教程

共21课时 | 4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号