1

试图列出服务器上共享的用户权限,其中共享的路径中有一个公共文件路径元素。

我有一个脚本,成功使用Win32_LogicalShareSecuritySettingWMI类枚举服务器上所有共享的共享权限,但不幸的是该类没有共享的文件路径作为属性...我可以使用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仍然为空......有人可以给我一个指针(或某种更好的方法)关于我如何做到这一点?

4

1 回答 1

2

问题是您使用 $ShareInst; 的过滤器;它不起作用,因为它没有像您期望的那样返回名称。尝试将“$ShareInst”放在你的 foreach 循环中;你应该看到如下内容:

\COMPUTERNAME\root\cimv2:Win32_Share.Name="ADMIN$"

哪个是 WMI 对象的 PATH,而不是它的名称。您在 $ShareInst 中拥有的是 System.Management.ManagementObject#root\cimv2\Win32_Share 类型的对象,而不是字符串。当您将该变量放在双引号内时,PowerShell 会使用 objects .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 的名称,因此您可以保持过滤器不变。

有许多其他方法可以解决此问题,但这两种方法对我来说似乎是最直接的。

于 2013-07-10T21:31:57.643 回答