在 windows 上 运行 时 Perl 获取父文件夹权限的最佳做法是什么

what is the best practice for Perl getting parent folder permissions while running on windows

我不是 Perl 开发人员,但我需要它来为 perforce 创建触发器。

这是背景:
我有一个以管理员身份运行的 windows 服务,它在 windows.

上调用 Perl 脚本

脚本需要在网络存储上创建一个文件,该文件配置为使用 windows 和 UNIX permissions\security 类型。

由于 运行 用户是管理员用户,因此它在所有目录下创建的所有文件夹和文件都不会继承目录权限,但只能对 root 用户进行编辑。

我尝试做的是创建文件,然后将其更改为父文件夹的 "stat" 结果。

my ($perms, $uid, $gid) = (stat $ParentDirFullPath)[2, 4, 5];  
$perms = sprintf("%04o", $perms & 0777);
chmod($perms, $NewFileFullPath);

问题是 windows 上的 stat 命令没有得到 unix\gid 和 unix\uid + chmod 命令不受真正支持。

我研究了 file::stat 模块以找到一种显示 windows 权限的方法(因为它们也存在于那里)以获取它们并使用我未测试的命令应用它们然而,它可能应该在模块 Win32::FileSecurity 下。 我没有找到从那里获取权限的方法(我得到 stat=ARRAY(0x46d0f8))。

有什么想法或建议吗?

TL;DR:("How to?" 问题)运行 windows 上的 Perl 脚本获取父文件夹权限并将它们应用于脚本在网络存储中创建的文件支持 Windows 和 Unix security/permissions 类型(我想申请的权限是 windows 像组和用户的权限)。

编辑:
我尝试了下一个代码:

use Win32::FileSecurity qw(Get EnumerateRights);
use Win32;

my $dir1 = "\\NetworkStorage\home\user1";
my $dir2 = "\\NetworkStorage\home\user1\PerlFileSecTest";

my %permissions;
Win32::FileSecurity::Get($dir1, \%permissions);
Win32::FileSecurity::Set($dir2, \%permissions);

我得到下一个错误:

S-1-5-11-2038111172-1292333386-11111-20315(this is not an original number and it changes this is unix FS user identifier that the AD knows how to parse)
Error handling error: 1332, LookupAccountName.

所以看起来 FileSecurity 无法处理来自同时支持 unixfs 和 NTFS 的基于 unix 的存储的用户标识符。

这很奇怪,因为当我选择一个文件夹并执行 "right click -> properties -> security tab" 时,我看到了数字,然后它们被解析为 unixUid\user1 等...

知道如何解决吗?

特别针对我的问题是网络驱动器上的混合模式,我发现下一个解决方案对我来说已经足够好了。

我调用 "icacls" 系统命令并手动为上述文件夹中的域用户设置权限。

my $error = system("icacls $CreatedDir /grant domain\user:(OI)(CI)F /T");

上面的代码为用户提供了对管理员用户服务创建的文件夹的完全递归权限(这导致文件夹在我们的配置中只为 rood 或管理员用户锁定)。

请注意,上面的命令 不会覆盖 现有权限,但对我来说已经足够了。

所以最终我得到了一个文件夹和文件,用户可以访问这些文件夹和文件,调用以管理员用户运行的特定服务。