使用 ACL 的 Powershell 快捷方式权限?

Powershell shortcut permissions using ACL?

我有一个通过 Intune 推送并安装在用户计算机上的 MSI。这个 MSI 基本上是特定 Web 应用程序所需的 Flash 浏览器。我需要做的是创建一个自定义快捷方式并在快捷方式的目标中输入 url 强制浏览器访问该网站(因为浏览器没有输入 URL 的地方)。

我创建快捷方式没有问题,但是我想确保用户无法通过右键单击快捷方式并更改 URL 参数允许他们浏览来进入和修改目标google 或 facebook 或其他浏览器。

这是我目前的快捷方式:

$Shell = New-Object -ComObject ("WScript.Shell")

$ShortCut = $Shell.CreateShortcut("C:\Users\Public\Desktop\Browser - PROD.lnk")

$ShortCut.TargetPath="C:\Program Files (x86)\Company\CompanyBrowser.exe"

$ShortCut.Arguments='-URL "https://company.url"'

$ShortCut.Save()

我将快捷方式弹出到 public 桌面上,这样标准用户就无法修改它,但是其中一些用户是他们计算机上的本地管理员。我希望更改快捷方式属性中的安全选项卡,以允许本地管理员帐户仅访问 read/execute,但不能修改此快捷方式。

我正在玩弄 ACL 功能,但它似乎是全有或全无,当我 运行 以下脚本时,它甚至完全阻止了快捷方式的执行

$ProdACL = Get-Acl -Path "C:\Users\Public\Desktop\Browser - PROD.lnk"
$identity = "BUILTIN\Administrators"
$fileSystemRights = "Modify"
$type = "Deny"
$fileSystemAccessRuleArgumentList = $identity, $fileSystemRights, $type
$fileSystemAccessRule = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule -ArgumentList $fileSystemAccessRuleArgumentList
$ProdACL.SetAccessRule($fileSystemAccessRule)
Set-Acl -Path "C:\Users\Public\Desktop\Browser - PROD.lnk" -AclObject $ProdACL

我不是 Powershell 专家,但我相信我很接近并且可能没有使用正确的 ACL 参数。

任何帮助将不胜感激。

@Doug Maurer 是对的。

您需要先通过保留规则来删除继承:

$ProdACL = Get-Acl -Path "C:\Users\Public\Desktop\Browser - PROD.lnk"
$ProdACL.SetAccessRuleProtection($true, $true)
Set-Acl -Path "C:\Users\Public\Desktop\Browser - PROD.lnk" -AclObject $ProdACL

SetAccessRuleProtection方法的第一个$True是阻塞继承($False继承),第二个是复制继承的规则($False清除继承规则)。如果第一个值设置为 $False.

,则第二个值将被忽略

然后,删除授予管理员完全控制权限的规则:

$ProdACL = Get-Acl -Path "C:\Users\Public\Desktop\Browser - PROD.lnk"
$identity = "BUILTIN\Administrators"
$fileSystemRights = "FullControl"
$type = "Allow"
$fileSystemAccessRuleArgumentList = $identity, $fileSystemRights, $type
$fileSystemAccessRule = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule -ArgumentList $fileSystemAccessRuleArgumentList
$ProdACL.RemoveAccessRule($fileSystemAccessRule)
Set-Acl -Path "C:\Users\Public\Desktop\Browser - PROD.lnk" -AclObject $ProdACL

请注意,一旦将其设置为阻止继承,就必须再次获取 ACL。

我已经复制了你的代码,但它可以简化为这样(这里有继承阻塞):

#Block Inheritance
$ProdACL = Get-Acl -Path "C:\Users\Public\Desktop\Browser - PROD.lnk"
$ProdACL.SetAccessRuleProtection($true, $true)
Set-Acl -Path "C:\Users\Public\Desktop\Browser - PROD.lnk" -AclObject $ProdACL

# Set new ACL
$ProdACL = Get-Acl -Path "C:\Users\Public\Desktop\Browser - PROD.lnk"
$identity = "BUILTIN\Administrators"
$fileSystemAccessRule = $ProdACL.Access | Where IdentityReference -eq $identity
$ProdACL.RemoveAccessRule($fileSystemAccessRule)
Set-Acl -Path "C:\Users\Public\Desktop\Browser - PROD.lnk" -AclObject $ProdACL