如何使用golang在Windows上检查文件是否可执行?

4

3
检查文件的扩展名可能会有帮助吗? - Arun
1
你的实际使用情况是什么?通常,人们会尝试通过CreateProcessW运行文件,或者通过语言包装Windows API,并通过搜索不同的文件来处理访问被拒绝的错误,记录日志或提示用户。 - Eryk Sun
1
检查访问权限容易出现竞态条件,因此不建议这样做。但是,如果您必须在 POSIX 中进行访问检查,则应使用faccessatX_OKAT_EACCESS,以便将文件的模式和 ACL 权限与进程的有效用户 ID、组 ID 和附加组进行评估。Windows 可以使用AccessCheck来检查是否有FILE_GENERIC_EXECUTE访问权限。首先,您需要调用OpenThreadToken(或者如果失败了,则是 OpenProcessTokenDuplicateToken)以获取模拟令牌,并使用GetNamedSecurityInfoW`获取文件安全信息(所有者、标签、属性和 DACL)。 - Eryk Sun
1
同时请注意,Windows对文件的处理方式与Linux有很大不同。通常情况下,在Linux中,只有可执行文件才具有执行权限,而在Windows上,几乎每个文件都有执行权限,无论它是否实际上是可执行文件。因此,检查文件的执行权限可能并不能告诉您您想知道的内容。 - Adrian
1
父目录继承的可选择和强制性安全通常授予标准用户读取和执行访问权限。除了用户配置文件目录仅授予所有者用户、管理员和系统访问权限,其他用户无法访问。另一组异常情况是 "% ProgramFiles% \WindowsApps" 中的应用程序目录。这些目录具有可继承的条件ACE,只有当访问令牌在安全属性中包含特定应用程序的 "WIN:// SYSAPPID" 时,才向标准用户授予执行访问权限。 - Eryk Sun
显示剩余2条评论
1个回答

4

我看到这样四种方法:

AccessCheck

基于此评论:

Windows有 AccessCheck 函数,您可以使用它来检查文件是否具有 FILE_GENERIC_EXECUTE 权限。首先,您需要调用 OpenThreadToken(或者如果失败,则使用 OpenProcessTokenDuplicateToken)获取模拟令牌,然后使用 GetNamedSecurityInfoW 获取文件安全性(所有者、标签、属性和 DACL )。

我发现了一个 Go 的包含函数 UserHasPermission。我认为这是正确的方法。

GetBinaryTypeW

PHPRust 使用。它检查文件是否为可执行 类型,但不检查可执行 权限

GetFileAttributesW

GoPythonNim 使用。该逻辑是所有文件都可读和可执行,并且只区分文件是否可写。

GetFileInformationByHandle

Ruby 使用。该逻辑是所有文件都可读和可执行,并且只区分文件是否可写。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接