powershell 相同的脚本在不同的系统上给出不同的结果

0md85ypi  于 2023-04-21  发布在  Shell
关注(0)|答案(2)|浏览(138)

我有一个powershell脚本来收集一个系统上的文件夹和权限,还有一个脚本来创建文件夹结构,并在高度受限的环境中在不同的系统上应用权限。
我不能使用robocopy到新系统。我必须使用ftp,所以我使用csv文件来收集和应用权限。仅文件夹-文件夹和权限到位后,文件通过ftp传输(H/T帮助我解决“应用权限”脚本上的早期问题的人(Powershell与导入csv的Set-ACL问题))。
当我在本地笔记本电脑上测试“apply permissions”脚本时,文件夹按照预期的权限创建,当我在安全系统上用相同的csv文件运行脚本时,它创建了文件夹结构,但是它将电子表格中的每一个显式权限应用到每个列出的文件夹。脚本中唯一的区别是我设置为起点的根文件夹。这两个系统都是Windows 10,并且具有相同版本的PowerShell。
我在创建目录的地方有完全的NTFS权限,但我没有在安全环境中运行脚本的权限,所以我必须选择所有并使用“运行选择”选项。我在笔记本电脑上做了同样的事情,以排除任何可能不同的行为。
以下是文件夹/acl电子表格的示例:
| 文件夹路径|IdentityReference|文件系统权限|继承标志|
| --------------|--------------|--------------|--------------|
| 企业活动|AD\User-ACTIVITIES.T|阅读|无|
| 企业活动|AD\user.adm|FullControl|ContainerInherit、ObjectInherit|
| 活动\BWOVC1|AD\User-BWOVC1|修改|ContainerInherit、ObjectInherit|
以下是脚本:

# Location Where your folders are to be created
$RootDir = "C:\Users\User1\Documents\ACL"
Set-Location "$RootDir" 

# Import CSV file from location
$Folders = Import-Csv "$RootDir\ACL-File.csv"

# Create Folders from FolderPath column in csv; set ACL
ForEach ($Folder in $Folders) 
{ 
if(Test-Path $RootDir\$Folder.FolderPath) {continue} #{Write-Verbose "Folder: $Path Already Exists"}
else{
 
New-Item $Folder.FolderPath -type directory
}

        $IdentityReference = $Folder.IdentityReference
        $FileSystemRights = $Folder.FileSystemRights
        $InheritanceFlag = "ContainerInherit, ObjectInherit"
        $PropagationFlag = "None"
        $AccessControlType = "Allow"

#From stackoverflow response;
# Define the access rule(s) to add to the ACL
$New_ACR = New-Object Security.AccessControl.FileSystemAccessRule $IdentityReference, $FileSystemRights, $InheritanceFlag, $PropagationFlag, $AccessControlType
# Get Access Control List from directory
$ACL = Get-Acl -Path ($RootDir + "\" + $Folder.FolderPath)
# Add new rule to ACL
$ACL.AddAccessRule($New_ACR)
# Apply updated ACL to directory
Set-Acl -Path ($RootDir + "\" + $Folder.FolderPath) -AclObject $ACL

}

你知道为什么我在不同的系统上得到不同的行为吗?

dfty9e19

dfty9e191#

这可能不是你唯一的问题,但Test-Path $RootDir\$Folder.FolderPath并不像你期望的那样工作:

  • 作为一个命令参数,$RootDir\$Folder.FolderPath被 * 隐式地 * 处理,就好像它被包含在"..."中一样,即作为一个可扩展(双引号)字符串("..."
  • 你不能 * 不 * 使用 * 表达式 * -例如试图在"..."中访问变量的 * 属性 *-按原样-.FolderPath子字符串将被 * 逐字 * 使用而不是属性访问。你需要将表达式括在$(...)中,子表达式操作符:
# "..." isn't strictly necessary here, but advisable for conceptual clarity
Test-Path "$RootDir\$($Folder.FolderPath)"
  • 或者,使用 string concatenation,后面的代码中也会用到:
Test-Path ($RootDir + "\" + $Folder.FolderPath)
Test-Path (Join-Path $RootDir $Folder.FolderPath)
ctzwtxfj

ctzwtxfj2#

Mklement拿走了金子。
“您在$InheritanceFlag =“ContainerInherit,ObjectInherit”中硬编码继承标志-它不应该是$InheritanceFlag = $Folder.InheritanceFlag吗?”
是的。更改我的硬编码继承标志以使用电子表格中列出的标志解决了这个问题。事实证明,这是唯一需要调整的事情。然而,我非常感谢所有的回复,我会记住可能出现的其他问题的建议。

相关问题