Warm tip: This article is reproduced from serverfault.com, please click

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

(其他 - Powershell shortcut permissions using ACL?)

发布于 2020-12-09 15:55:31

我有一个通过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()

我将快捷方式弹出到公共桌面上,以便标准用户无法修改它,但是其中一些用户是其计算机上的本地管理员。我希望更改快捷方式属性中的“安全性”选项卡,以仅允许本地管理员帐户访问读取/执行,而不能修改此快捷方式。

我正在使用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中使用正确的参数。

任何帮助将非常感激。

Questioner
degett
Viewed
0
CFou 2020-12-10 02:17:00

@道格·毛勒(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

第一$TrueSetAccessRuleProtection方法是阻止继承($False继承)和第二是复制继承的规则($False以清除继承的规则)。如果第一个值设置为,则忽略第二个值$False

然后,删除为管理员提供FullControl的规则:

$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设置为阻止继承后,你必须再次获取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