微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从 Net Share 命令解析资源“列”

如何解决从 Net Share 命令解析资源“列”

我们的环境正在删除一堆 Windows 2003 服务器,为了尝试获取现有共享的权限,我一直在尝试想出一个解决方案来编写脚本。

然而,问题在于 WMI 无法在这些服务器上运行,因此我无法执行 GWMI Win32_Share。考虑到服务器的年龄,更现代的 powershell 命令不起作用。

我可以做的是一个 Get-ACL,但是我需要提供共享的路径。我能看到获得股票完整路径的唯一方法是通过 Net Share 或 Get-ItemProperty HKLM ,我没有运气。

如果有比我更聪明的人知道一种方法来解析净份额的“资源”列,那你就帮了我大忙了。

解决方法

你可以用一点正则表达式来达到你想要的结果

Powershell V1 兼容

switch -regex (net share){
    '^(\S+)\s+(\w:.+?)(?=\s{2,})' {
        New-Object PSObject -Property @{
            ShareName = $matches.1
            Resource  = $matches.2
        }
    }
}

Powershell 3.0+

switch -regex (net share){
    '^(\S+)\s+(\w:.+?)(?=\s{2,})' {
        [PSCustomObject]@{
            ShareName = $matches.1
            Resource  = $matches.2
        }
    }
}

在 powershell 5.1 上,您可以将 ConvertFrom-String 与“训练”数据一起使用。它可以是真实的样本数据或通用数据。可能需要针对您的特定环境进行一些调整,但这在测试中效果很好。

$template = @'
{Share*:ADMIN$}       {Path: C:\Windows}                      {Note:Remote Admin}
{Share*:Admin}        {Path: E:\Admin}                        {Note:Default share}
{Share*:Apps}         {Path: D:\Apps}                         {Note:test}
'@

net share | Select-Object -Skip 4 | Select-Object -SkipLast 2 |
    ConvertFrom-String -TemplateContent $template -OutVariable ShareList

显示的任何输出现在都应该包含在变量 $ShareList

$Sharelist | Get-Member -MemberType NoteProperty


   TypeName: System.Management.Automation.PSCustomObject

Name  MemberType   Definition              
----  ----------   ----------              
Note  NoteProperty string Note=Remote Admin
Path  NoteProperty string Path=C:\Windows  
Share NoteProperty string Share=ADMIN$ 

您还可以使用 psexec 远程获取信息并应用任一建议的解决方案。

switch -regex (.\PsExec.exe -nobanner \\$RemoteComputer cmd "/c net share"){
    '^(\S+)\s+(\w:.+?)(?=\s{2,})' {
        [PSCustomObject]@{
            ShareName = $matches.1
            Resource  = $matches.2
        }
    }
}

$template = @'
{Share*:ADMIN$}       {Path: C:\Windows}                      {Note:Remote Admin}
{Share*:Admin}        {Path: E:\Admin}                        {Note:Default share}
{Share*:Apps}         {Path: D:\Apps}                         {Note:Test}
'@

.\PsExec.exe -nobanner \\$RemoteComputer cmd "/c net share" |
    Select-Object -Skip 4 | Select-Object -SkipLast 2 |
        ConvertFrom-String -TemplateContent $template -OutVariable ShareList
,

不幸的是,对 net share 输出的稳健解析非常重要,需要两遍方法:

  • net share 的输出中收集所有共享名称
  • 对于每个共享名称 $shareName,调用 net share $shareName 并将特定于共享的属性解析为自定义对象。

尝试仅解析 net share 的输出的问题是太长的值可能会被截断(使用 ...)或导致换行;也就是说,您无法稳健地获得完整值;相比之下,net share $shareName 使用列表格式,其中值不会被截断。

下面的代码实现了两遍方法:

注意:

  • 我已经验证它可以在 PowerShell v2 中运行;我无法再访问 v1。

  • 根据 net share $shareName 的输出,表示本地目标路径的属性名称是 Path,而不是 Resource 的输出中的 net share

  • 如果您在没有提升的情况下运行(不是作为管理员),由于缺乏权限而无法查询以下属性:Users、{ {1}},Caching;代码悄悄地忽略了它们。

Permission

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。