到目前为止,我知道要做以下事情:
(Get-WmiObject -Query "SELECT StartName FROM win32_service where name = 'mssqlserver'").StartName
accesschk -q -d $env:TEMP
但这导致我无处可去:
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以管理员身份运行时,该命令可以正常工作。理想情况下,我想要一个不需要提升的解决方案。
答案 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及更高版本。