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

时间:2016-11-28 13:15:06

标签: windows perl permissions perl-module

我不是一个Perl开发人员,但我需要它来为perforce制作触发器。

所以这就是背景:
我有一个以管理员身份运行的Windows服务,可以在Windows上调用Perl脚本。

脚本需要在网络存储上创建一个文件,该文件都配置为使用Windows和UNIX权限\安全类型。

由于运行脚本的用户是管理员用户,因此在所有目录下创建的所有文件夹和文件都不会继承目录权限,但只能对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 :(“如何?”问题)在Windows上运行Perl脚本,获取父文件夹权限并将其应用于脚本在支持Windows和Unix安全/权限类型的网络存储中创建的文件(我想要应用的权限是窗口,如组和用户的权限。)

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

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的存储的用户标识符。

这很奇怪,因为当我选择一个文件夹作为例子并执行“右键单击 - >属性 - >安全选项卡”时,我会看到数字,然后将它们解析为unixUid \ user1等...

知道怎么解决吗?

1 个答案:

答案 0 :(得分:0)

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

我调用“icacls”系统命令,并从上面的文件夹中为域用户手动设置权限。

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

上面的代码为用户提供了完全递归权限,该权限由服务与admin用户创建的文件夹(导致该文件夹仅在我们的配置中为rood或admin用户锁定)。

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

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