如果服务具有对某个文件夹的读取权限,如何检入PowerShell?

时间:2016-12-17 03:37:23

标签: powershell file-permissions access-control

到目前为止,我知道要做以下事情:

  1. 确定服务登录帐户 - (Get-WmiObject -Query "SELECT StartName FROM win32_service where name = 'mssqlserver'").StartName
  2. 获取对该文件夹具有读取权限的帐户 - accesschk -q -d $env:TEMP
  3. 但这导致我无处可去:

    PS C:\> (Get-WmiObject -Query "SELECT StartName FROM win32_service where name = 'mssqlserver'").StartName
    LocalSystem
    PS C:\> accesschk -q -d $env:TEMP
    c:\Users\MKHARI~1\AppData\Local\Temp
      RW NT AUTHORITY\SYSTEM
      RW BUILTIN\Administrators
      RW DAYFORCE\mkharitonov
    PS C:\> accesschk LocalSystem -q -d $env:TEMP
    
    Accesschk v5.2 - Reports effective permissions for securable objects
    Copyright (C) 2006-2014 Mark Russinovich
    Sysinternals - www.sysinternals.com
    
      Error looking up account: LocalSystem:
      The operation completed successfully.
    PS C:\> accesschk "DAYFORCE\mkharitonov" -q -d $env:TEMP
    RW c:\Users\MKHARI~1\AppData\Local\Temp
    PS C:\>
    

    AccessChk似乎无法识别LocalSystem。此外,如果我使用属于BUILTIN\Administrators的帐户运行它,它似乎不会确认访问权。

    这是否意味着AccessChk不适合这个或我使用它错了?有没有办法完全没有实际尝试访问相关帐户下的文件夹?

    当PowerShell以管理员身份运行时:

    PS C:\> $service = Get-WmiObject -EnableAllPrivileges Win32_Service | Where-Object {$_.Name -eq "MSSQLSERVER"}
    PS C:\> '{0:x}' -f $service.GetSecurityDescriptor().ReturnValue
    80070522
    PS C:\>
    

    对应于客户端不持有所需的权限。当PowerShell以管理员身份运行时,该命令可以正常工作。理想情况下,我想要一个不需要提升的解决方案。

2 个答案:

答案 0 :(得分:2)

localsystem使用nt authority \ System的令牌,因此该命令行将起作用(您需要将localsystem映射到系统中的代码):

TABLE_NAME = locations
`pri_id` varchar(20) NOT NULL,
`pri_att` varchar(100) NOT NULL,
`value` float DEFAULT NULL,
PRIMARY KEY (`pri_id`,`pri_att`)

我创建了一个片段来获取正确的名称并将其传递给accesschk(在PowerShell v5中测试并需要提升访问权限):

PRI_ID, PRI_ATT, VALUE
1       DIST     2
PRI_ID, PRI_ATT, VALUE
1       ALT      100
PRI_ID, PRI_ATT, VALUE
2       LAT      10
PRI_ID, PRI_ATT, VALUE
2       LONG     100
PRI_ID, PRI_ATT, VALUE
2       ALT      10

$ desc.Domain +" \" + $ desc.name将返回NT AUTHORITY \ SYSTEM而不是localsystem

PS:可以优化脚本

答案 1 :(得分:0)

$account = 'whatever you like'
$acl = Get-Acl 'folder'
$acl.access | where { $_.IdentityReference -like "*$account*"}).FileSystemRights

我不确定这适用于PowerShell v.2,但它适用于PowerShell v.3及更高版本。