获取远程共享上已打开(占用)的文件的列表

时间:2019-05-23 10:25:20

标签: c# powershell

[这是重新开放的问题,提供了一些额外的信息]

我在网络中具有远程共享,例如:

\\server\share_folder\

此文件夹包含文件:

File01.txt
File02.mdb
File03.xls

以此类推。

我正在尝试在C#上编写程序,该程序显示用户当前在指定共享中打开的文件列表。我可以在服务器上手动获得此信息,但这不舒服且太慢。

除了一些有关WMI脚本(https://docs.microsoft.com/en-us/windows/desktop/wmisdk/wmi-tasks-for-scripts-and-applications)的信息外,找不到任何有效的解决方案,但是我所需的内容却没有。

如果有问题-我具有远程共享(Windows Server 2012)的管理员权限。

我在stackoverflow的其他主题中找到的一些代码,获取远程服务器上所有共享的列表:

    using (ManagementClass shares = new ManagementClass(@"\\server\root\cimv2", "Win32_Share", new ObjectGetOptions()))
            {
                foreach (ManagementObject share in shares.GetInstances())
                {
                    Console.WriteLine(share["Name"]);
                }
            }

但是仍然找不到获取文件信息的功能-是否有人打开它。

[upd2]

我终于找到了脚本,该脚本正是我想要的:

http://andrewmorgan.ie/2012/12/viewing-open-files-on-a-file-server-from-powershell/

function get-openfiles{
param(
$computername=@($env:computername),
$verbose=$false)
$collection = @()
foreach ($computer in $computername){
$netfile = [ADSI]"WinNT://$computer/LanmanServer"
$netfile.Invoke("Resources") | foreach {
try{
$collection += New-Object PsObject -Property @{
Id = $_.GetType().InvokeMember("Name", ‘GetProperty’, $null, $_, $null)
itemPath = $_.GetType().InvokeMember("Path", ‘GetProperty’, $null, $_, $null)
UserName = $_.GetType().InvokeMember("User", ‘GetProperty’, $null, $_, $null)
LockCount = $_.GetType().InvokeMember("LockCount", ‘GetProperty’, $null, $_, $null)
Server = $computer
}
}
catch{
if ($verbose){write-warning $error[0]}
}
}
}
Return $collection
}
get-openfiles -computername server | select server,itempath,UserName | Sort-Object itempath

但是有两个问题:1)它是PowerShell; 2)在具有多个份额和数百个已连接用户的大型服务器上,它执行20-60秒,这太多了。

我仍在搜索此任务的c#实现。

[upd3]

好吧,

https://www.codeproject.com/Articles/18229/How-to-run-PowerShell-scripts-from-C

它是PowerShell,但是现在使用C#!疯狂的事情。仍然希望有更好的方法可以在没有PS的情况下执行此任务。

0 个答案:

没有答案