如何解决从 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 举报,一经查实,本站将立刻删除。