尝试列出服务器上共享的用户权限,其中共享的路径中包含公共文件路径元素。
我有一个成功使用Win32_LogicalShareSecuritySetting
WMI类的脚本来枚举服务器上所有共享的共享权限,但不幸的是,该类没有共享的文件路径作为属性...我可以使用Win32_Share
类并执行以下操作:
$FinShares = Get-WmiObject -Class Win32_Share -Filter "Path LIKE '%Finance%'" -ComputerName $computername
我确实得到了所需股票的清单。但是如何将该列表传递给下一个Get-WmiObject语句?我尝试过类似的东西:
$FinShares = (Get-WmiObject -Class Win32_Share -Filter "Path LIKE '%Finance%'" -ComputerName $computername | Select-Object Name)
foreach ($ShareInst in $FinShares)
{
$FinShareSS = Get-WmiObject -Class Win32_LogicalShareSecuritySetting -Filter "Name = '$ShareInst'" -ComputerName $computername
$SecurityDescriptor = $FinShareSS.GetSecurityDescriptor()
(...)
当我尝试这个时,变量$FinShareSS
仍然为空...有人可以给我一个指针(或者某种更好的方式),我怎么能这样做?
答案 0 :(得分:2)
问题是您的过滤器使用$ ShareInst;它不起作用,因为它没有像你期望的那样返回Name。尝试在你的foreach循环中放入“$ ShareInst”;你应该看到像这样的东西:
\ COMPUTERNAME \根\ CIMV2:Win32_Share.Name = “ADMIN $”
哪个是WMI对象的PATH,而不是它的名字。你在$ ShareInst中拥有的是System.Management.ManagementObject#root \ cimv2 \ Win32_Share类型的对象,而不是字符串。当您将该变量放在双引号内时,PowerShell使用对象.ToString()方法将变量扩展为字符串。对于此Win32_Share对象,返回对象的PATH,而不是名称。
所以基本上你只需要在-Filter字符串中获取实际的名字字符串,这样它就会实际返回你正在寻找的共享安全对象。有几种方法可以做到这一点:
将属性名称嵌入字符串中,如下所示:
-Filter "Name = '$($ShareInst.Name)'"
$()包装器告诉PowerShell在将变量扩展为该长PATH值之前评估.Name属性,因此您只需获得您正在寻找的短名称。
如果您只需要名称的Win32_Share对象,那么您只需将foreach行更改为如下所示:
foreach ($ShareInst in ($FinShares | Select-Object -ExpandProperty Name))
Select-Object的-ExpandProperty参数告诉PowerShell获取每个对象的Name属性,然后返回该属性,而不是完整对象。现在$ ShareInst将只是Win32_Share的名称,因此您可以按原样保留过滤器。
有许多其他方法可以解决这个问题,但这两种方式对我来说似乎最直接。