我希望能够查询远程windows桌面中的特定文件,但是我有以下约束:
这导致了以下查询:SELECT * FROM CIM_DataFile WHERE Drive ='C:'AND FileName='Fake' AND Extension='dll'
与powershell中的Get-childitem相比,这需要相对较长的时间,它允许我通过文件夹和子文件夹来细化搜索。
但是,我总是可以这样做:SELECT * FROM CIM_DataFile WHERE Drive ='C:'AND FileName='Fake' AND Extension='dll' AND Path like '\\Windows\\System32\\%',但是这个查询会增加远程的负载,而且不会花费更少的时间。
有任何方法可以使用WMI进行某种类型的递归搜索吗?
发布于 2018-08-19 19:18:33
如果目标计算机上没有启用PowerShell远程处理,则必须使用DCOM连接到WMI。默认情况下,DCOM连接在现代windows系统上是关闭的,因此您必须启用它--在这种情况下,您最好启用PowerShell远程处理。
如果您必须使用WMI,您将需要这样的东西
function get-wmifile {
[CmdletBinding()]
param (
[Parameter(Mandatory = $true)]
[string]$path,
[string]$file
)
if ($path.IndexOf('\\') -le 0 ){
$path = $path.replace('\', '\\')
}
if ($path.IndexOf('*') -ge 0 ){
$path = $path.replace('*', '%')
}
Write-Verbose -Message "Path to search: $path"
$folders = Get-CimInstance -ClassName Win32_Directory -Filter "Name LIKE '$path'"
foreach ($folder in $folders){
if ($file) {
Get-CimAssociatedInstance -InputObject $folder -ResultClassName CIM_DataFile |
where Name -Like "*$file" |
Select Name
}
else {
Get-CimAssociatedInstance -InputObject $folder -ResultClassName CIM_DataFile |
Select Name
}
}
}将该函数用作
PS> get-wmifile -path 'c:\test*'
Name
----
c:\test\counters.csv
c:\test\p1.txt
c:\test\test.md
c:\test2\p1.txt
c:\test2\test3\p2.txt
c:\testscripts\eventlogchanges.txt
c:\testscripts\tempfolderlog.csv
c:\testscripts\test.ps1 或者找到一个文件
PS> get-wmifile -path 'c:\test*' -file 'p1.txt'
Name
----
c:\test\p1.txt
c:\test2\p1.txt正如您所说的,使用Get- would将比WMI快得多。没有一种方法可以加快WMI访问文件数据的速度,所以我建议坚持使用get-ChildItem。
https://stackoverflow.com/questions/51884846
复制相似问题