【问题标题】:Powershell shortcut permissions using ACL?使用 ACL 的 Powershell 快捷方式权限?
【发布时间】:2021-03-21 00:49:04
【问题描述】:

我有一个通过 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 参数。

任何帮助将不胜感激。

【问题讨论】:

  • 您的方法的问题是修改包括读取/执行和拒绝优先于允许。

标签: powershell permissions acl shortcut


【解决方案1】:

@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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    相关资源
    最近更新 更多