PowerShell 学习笔记 - 4 Provider, ItemProperty 与 ACL
本章主要探讨 PowerShell 中的 Provider 这一基本概念与如何获取文件等依靠 PSProvider 提供的对象所具有的属性等。由于移植进度或底层异构等原因,PSProvider 现今于 PowerShell Core 下不推荐使用,这里的阐述以 Windows PowerShell 为例:
PSProvider
PSProvider 即 PowerShell 提供的文件系统抽象功能,即将其他结构映射至文件系统结构的功能:
# 获取现在注册的 PSProvider 列表PS C:\Windows\system32> Get-PSProviderName Capabilities Drives ---- ------------ ------ Registry ShouldProcess, Transactions {HKLM, HKCU} Alias ShouldProcess {Alias} Environment ShouldProcess {Env} FileSystem Filter, ShouldProcess, Credentials {C, E, D} Function ShouldProcess {Function} Variable ShouldProcess {Variable}
以 Registry
即注册表为例,其提供了两个驱动器,即文件系统入口:
PS C:\Windows\system32> Get-PSProvider RegistryName Capabilities Drives ---- ------------ ------ Registry ShouldProcess, Transactions {HKLM, HKCU} # 因此可利用驱动器模式进入,即 Set-Location 至 $Drive + ":" 下,之后即可以用文件系统的 cmdlet 进行操作PS C:\Windows\system32> cd HKLM:PS HKLM:\> ls Hive: HKEY_LOCAL_MACHINEName Property ---- -------- BCD00000000 HARDWARE SAM ls : 不允许所请求的注册表访问权。所在位置 行:1 字符: 1+ ls+ ~~ + CategoryInfo : PermissionDenied: (HKEY_LOCAL_MACHINE\SECURITY:String) [Get-ChildItem], SecurityException + FullyQualifiedErrorId : System.Security.SecurityException,Microsoft.PowerShell.Commands.GetChildItemCommand SOFTWARE SYSTEM PS HKLM:\> cd .\SYSTEMPS HKLM:\SYSTEM> ls Hive: HKEY_LOCAL_MACHINE\SYSTEMName Property ---- -------- ActivationBroker ControlSet001 DriverDatabase Version : 167772160 SchemaVersion : 65536 Architecture : 9 UpdateDate : {32, 198, 183, 38...} OemInfMap : {191, 128} ...
另一个常用于 Windows 平台下的主要功能,即为发现已经挂载的驱动器:
# Windows “多根文件系统架构”,即每个驱动器均可作为“根”PS C:\Users\chuny> (Get-PSProvider FileSystem).DrivesName Used (GB) Free (GB) Provider Root CurrentLocation---- --------- --------- -------- ---- ---------------C 51.98 65.07 FileSystem C:\ Users\chunyE 28.05 87.19 FileSystem E:\D FileSystem D:\# UNIX “单根文件系统架构”,即单个 UNIX 操作系统的管控域下只有一个根,即 rootPS /> (Get-PSProvider FileSystem).DrivesName Used (GB) Free (GB) Provider Root CurrentLocation---- --------- --------- -------- ---- ---------------/ 4.50 54.31 FileSystem /
ItemProperty
事实上,文件系统即为提供于 PSProvider 上面的对象,因此每个文件均存在其对应的根(PSProvider)以及所对应的驱动器:
PS C:\Users\chuny> (Get-ItemProperty -LiteralPath .\.bash_history).PSProviderName Capabilities Drives---- ------------ ------FileSystem Filter, ShouldProcess, Credentials {C, E, D}PS C:\Users\chuny> (Get-ItemProperty -LiteralPath .\.bash_history).PSDriveName Used (GB) Free (GB) Provider Root CurrentLocation---- --------- --------- -------- ---- ---------------C 51.98 65.07 FileSystem C:\ Users\chuny
上面所涉及到的 Get-ItemProperty
即为获取文件系统路径对应对象属性的基本 cmdlet,由于注册表也被抽象为了一个 PSProvider,我们甚至可以通过路径直接获取注册表中的信息:
PS HKLM:\> Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\BootDriverFlags : 28CurrentUser : USERNAMEEarlyStartServices : {RpcSs, Power, BrokerInfrastructure, SystemEventsBroker...}PreshutdownOrder : {vmms, UsoSvc, DeviceInstall, gpsvc...}SvcHostSplitThresholdInKB : 3670016WaitToKillServiceTimeout : 5000SystemStartOptions : NOEXECUTE=OPTIN HYPERVISORLAUNCHTYPE=AUTOSystemBootDevice : multi(0)disk(0)rdisk(0)partition(4)FirmwareBootDevice : multi(0)disk(0)rdisk(0)partition(2)LastBootSucceeded : 1LastBootShutdown : 0DirtyShutdownCount : 5PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSetPSChildName : ControlPSDrive : HKLMPSProvider : Microsoft.PowerShell.Core\Registry
ACL
同时引入的一个重要概念即为 ACL(Access Control List,访问控制列表),对于每一个路径用户亦可以获取其访问权限设置,并检查自身是否可以访问。
以如下的 .\.bash_history
为例,该文件是 DESKTOP-H5Q0G1S
域下的用户 chuny
创建的,且除自身外还允许 BUILTIN\Administrators
和 NT AUTHORITY\SYSTEM
两个用户进行完全控制:
PS C:\Users\chuny> Get-Acl .\.bash_history 目录: C:\Users\chunyPath Owner Access---- ----- ------.bash_history DESKTOP-H5Q0G1S\chuny NT AUTHORITY\SYSTEM Allow FullControl...PS C:\Users\chuny> (Get-Acl .\.bash_history).AccessFileSystemRights : FullControlAccessControlType : AllowIdentityReference : NT AUTHORITY\SYSTEMIsInherited : TrueInheritanceFlags : NonePropagationFlags : NoneFileSystemRights : FullControlAccessControlType : AllowIdentityReference : BUILTIN\AdministratorsIsInherited : TrueInheritanceFlags : NonePropagationFlags : NoneFileSystemRights : FullControlAccessControlType : AllowIdentityReference : DESKTOP-H5Q0G1S\chunyIsInherited : TrueInheritanceFlags : NonePropagationFlags : None
但 Windows NT 系列的 ACL 系统设计得相当复杂,而进入 Windows AD 后的 ACL 更加复杂,已经脱离本机的 ACL 范围,交由 AD 中心控制(这也是用户名会被标识为域下的用户的原因,如 IdentityReference : DESKTOP-H5Q0G1S\chuny
)。这已经超出了本章范畴,详细可以参考 。