【问题标题】:what is the best practice for Perl getting parent folder permissions while running on windowsPerl 在 Windows 上运行时获取父文件夹权限的最佳做法是什么
【发布时间】:2017-04-12 05:33:03
【问题描述】:

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

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

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

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

我尝试做的是创建文件,然后将其 chmod 到父文件夹的“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 等...

知道怎么解决吗?

【问题讨论】:

  • 我要试试这个解决方案,我会更新:stackoverflow.com/a/302694/5965588my %permissions; Win32::FileSecurity::Get($dir, \%permissions); $permissions{'Power Users'} = MakeMask( qw( READ GENERIC_READ GENERIC_EXECUTE ) ) }); Win32::FileSecurity::Set($dir, \%permissions);
  • 使用 FileSecurity 的工作几乎可以工作,但仅适用于“Get”而不适用于“Set”。问题“编辑”部分中的更多信息。

标签: windows perl permissions perl-module


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2015-07-09
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 2017-04-21
    • 2010-09-13
    相关资源
    最近更新 更多