首页 > 系统相关 >.NET Core(C#)通过SharpCifs访问操作Windows(smb)共享目录方法代码

.NET Core(C#)通过SharpCifs访问操作Windows(smb)共享目录方法代码

时间:2023-09-12 13:55:46浏览次数:43  
标签:Core Console C# Windows SmbFile var using SharpCifs smb

.NET Core(C#)通过SharpCifs访问操作Windows(smb)共享目录方法代码

本文主要介绍.NET Core中,使用SharpCifs访问windows共享目录或smb协义共享目录,或操作共享文件的方法代码。

 

1、SharpCifs的安装引用

使用Nuget管理工具搜索"SharpCifs"=>找到选择 "安装"

相关文档:VS(Visual Studio)中Nuget的使用

代码地址:https://github.com/zinkpad/SharpCifs

2、获取共享目录中路径和文件的方法

//using System;
//using SharpCifs.Smb;
//获取文件夹的SmbFile-Object
var folder = new SmbFile("smb://UserName:Password@ServerIP/ShareName/FolderName/");
//UnixTime
var epocDate = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
//列出 items
foreach (SmbFile item in folder.ListFiles())
{
    var lastModDate = epocDate.AddMilliseconds(item.LastModified())
                                .ToLocalTime();
    var name = item.GetName();
    var type = item.IsDirectory() ? "dir" : "file";
    var date = lastModDate.ToString("yyyy-MM-dd HH:mm:ss");
    var msg = $"{name} ({type}) - LastMod: {date}";
    Console.WriteLine(msg);
}

3、连接共享目录和验证帐户密码

//using System;
//using SharpCifs.Smb;
//设置本地udp广播端口。
//连接时使用主机名,
//将默认本地端口(137)更改为大于1024的值。
//在许多情况下,使用这个著名的港口是受到限制的。
//
// **如果可能,使用IP地址而不是主机名
// **获得更好的性能。
//
SharpCifs.Config.SetProperty("jcifs.smb.client.lport", "8137");
//string to Auth-Object.
var auth1 = new NtlmPasswordAuthentication("UserName:Password");
var smb1 = new SmbFile("smb://192.168.0.1/ShareName/FolderName/", auth1);
Console.WriteLine($"exists? {smb1.Exists()}");
//3 string to Auth-Object.
var auth2 = new NtlmPasswordAuthentication(null, "UserName", "Password");
var smb2 = new SmbFile("smb://HostName/ShareName/FolderName/", auth2);
Console.WriteLine($"exists? {smb2.Exists()}");
//插入用户密码到URL中.
var smb3 = new SmbFile("smb://UserName:Password@HostName/ShareName/FolderName/");
Console.WriteLine($"exists? {smb3.Exists()}");
//您可以将身份验证信息存储在SharpCifs.Std中。
SharpCifs.Config.SetProperty("jcifs.smb.client.username", "UserName");
SharpCifs.Config.SetProperty("jcifs.smb.client.password", "Password");
var smb4 = new SmbFile("smb://HostName/ShareName/FolderName/");
Console.WriteLine($"exists? {smb4.Exists()}");

4、从共享目录中读取文件

//using System;
//using System.IO;
//using System.Text;
//using SharpCifs.Smb;
//获取目录的SmbFile.
var file = new SmbFile("smb://UserName:Password@ServerIP/ShareName/Folder/FileName.txt");
//获取可读的流。
var readStream = file.GetInputStream();
//创建读取缓存
var memStream = new MemoryStream();
//获取 bytes.
((Stream)readStream).CopyTo(memStream);
//Dispose可读的流。
readStream.Dispose();
Console.WriteLine(Encoding.UTF8.GetString(memStream.ToArray()));

 

5、在共享目录中创建新文件

//using System.Text;
//using SharpCifs.Smb;
//获取指定要创建的文件名的SmbFile。
var file = new SmbFile("smb://UserName:Password@ServerIP/ShareName/Folder/NewFileName.txt");
//创建文件
file.CreateNewFile();
//获取可写的stream.
var writeStream = file.GetOutputStream();
//写入 bytes内容.
writeStream.Write(Encoding.UTF8.GetBytes("Hello!"));
//Dispose 可写的 stream.
writeStream.Dispose();

6、浏览在局域网中的共享服务

//using System;
//using SharpCifs.Smb;
//设置本地udp广播端口。
//连接时使用主机名,
//将默认本地端口(137)更改为大于1024的值。
//在许多情况下,使用这个著名的港口是受到限制的。
//
// **如果可能,使用IP地址而不是主机名
// **获得更好的性能。
//
SharpCifs.Config.SetProperty("jcifs.smb.client.lport", "8137");
//得到本地的工作组
var lan = new SmbFile("smb://", "");
var workgroups = lan.ListFiles();
foreach (var workgroup in workgroups)
{
    Console.WriteLine($"Workgroup Name = {workgroup.GetName()}");
    try
    {
        //Get servers in workgroup.
        var servers = workgroup.ListFiles();
        foreach (var server in servers)
        {
            Console.WriteLine($"{workgroup.GetName()} - Server Name = {server.GetName()}");
            try
            {
                //Get shared folders in server.
                var shares = server.ListFiles();
                foreach (var share in shares)
                {
                    Console.WriteLine($"{workgroup.GetName()}{server.GetName()} - Share Name = {share.GetName()}");
                }
            }
            catch (Exception)
            {
                Console.WriteLine($"{workgroup.GetName()}{server.GetName()} - Access Denied");
            }
        }
    }
    catch (Exception)
    {
        Console.WriteLine($"{workgroup.GetName()} - Access Denied");
    }
}

7、主机名称解析

 

//using System;
//using System.Net;
//using SharpCifs.Netbios;
//设置本地udp广播端口。
//连接时使用主机名,
//将默认本地端口(137)更改为大于1024的值。
//在许多情况下,使用这个著名的港口是受到限制的。
//
// **如果可能,使用IP地址而不是主机名
// **获得更好的性能。
//
SharpCifs.Config.SetProperty("jcifs.smb.client.lport", "8137");
var naddr = NbtAddress.GetByName("HostName");
IPAddress addr = naddr.GetInetAddress();
Console.WriteLine($"IP = {addr}");

8、设置共享参数 

 

 

//设置本地IP地址。
//如果发生连接错误(例如:连接失败:[NET BIOS NAME]),
//尝试设置本地IP地址。
//当设备的主机名作为DNS名称无效时,
//要确定当地的地址可能是不可能的。
SharpCifs.Config.SetProperty("jcifs.smb.client.laddr", "192.168.0.2");
//设置本地udp广播端口。
//连接时使用主机名,
//将默认本地端口(137)更改为大于1024的值。
//在许多情况下,使用这个著名的港口是受到限制的。
//
// **如果可能,使用IP地址而不是主机名
// **获得更好的性能。
//
SharpCifs.Config.SetProperty("jcifs.smb.client.lport", "8137");
//您可以将身份验证信息存储在SharpCifs.Std中。
SharpCifs.Config.SetProperty("jcifs.smb.client.username", "UserName");
SharpCifs.Config.SetProperty("jcifs.smb.client.password", "Password");
//如果您不使用DFS(分布式文件系统),
//禁用DFS可以提高NetBios名称解析的速度。
SharpCifs.Config.SetProperty("jcifs.smb.client.dfs.disabled", "true");
//更多的配置参数在JCIFS官方站点中。
//https://jcifs.samba.org/src/docs/api/overview-summary.html

9、刷新设置和连接缓存

 

 

//----------------------------------------
//必选:版本0.2.9或更高。
//----------------------------------------
//
//强制应用设置值。
//在默认操作上,应用第一次smb处理时的设置值,并且不能更改。
//该方法强制应用SMB处理后更改的设置值。
//
//并且,这个方法处理当前无效的缓存连接。
//例如,在连接后30分钟内不能工作的连接将被处理。
SmbFile.Initialize();
//重置无效的连接。
//使用此方法处理无效连接,而无需操作设置值。
SmbTransport.ClearCachedConnections();
//重置所有(包括活动)连接。
//使用此方法处理所有连接,包括当前连接。
//注意,即使在数据传输期间,它也会处理连接。
SmbTransport.ClearCachedConnections(true);
 

 

 

推荐文档

标签:Core,Console,C#,Windows,SmbFile,var,using,SharpCifs,smb
From: https://www.cnblogs.com/Leo_wl/p/17695987.html

相关文章

  • leetcode841钥匙和房间
    使用深度优先遍历构造的图,只要访问过就标记已访问intnum=0;vector<bool>vis;voiddfs(vector<vector<int>>&rooms,intx){vis[x]=true;num++;for(auto&v:rooms[x]){if(!vis[v])dfs(rooms,v);//说明这个房间没有进去过,所以可以访问}}intmai......
  • Breaking Changes When Upgrading from EF Core 6 to 7: What You Need to Know
    EntityFrameworkCore(EFCore)isapopularObject-RelationalMapping(ORM)frameworkusedby.NETdevelopersfordatabaseoperations.WiththereleaseofEFCore7,manydevelopersareconsideringupgradingtheirprojectstotakeadvantageofthenewfe......
  • 文心一言 VS 讯飞星火 VS chatgpt (91)-- 算法导论8.3 4题
    四、用go语言,说明如何在O(n)时间内,对0到$n^3-1$区间内的n个整数进行排序。文心一言:在O(n)时间内对0到n^3-1区间内的n个整数进行排序,可以使用基数排序(RadixSort)算法。基数排序是一种非比较型整数排序算法,其时间复杂度为O(d*(n+k)),其中d是数字的最大位数,k是基......
  • Financial - 看涨期权 和 看跌期权
     总结1.买入看涨期权(认购期权),就是指赋予看涨期权买方一个权利:在未来某个特定时间,以行权价格,从看涨期权卖方,买进一种资产(股票,外汇,商品,利率等)的权利。买入看跌期权(认沽期权),就是指赋予看跌期权买方一个权利:在未来某个特定时间,以行权价格,对看跌期权卖方,卖出一种资产(股票,外汇,......
  • ARVGIS中创建NetCDF栅格图层无法自动读取变量的解决方法(包括netCDF4包查看nc文件属性)
    下载了.nc后缀的文件,准备通过Arcgis转为tif栅格形式,但是出现了如下问题:1.将nc文件拖入到输入栏后并不会自动提取变量、X维度、Y维度和输出栅格图层。 在尝试解决的过程中,使用python的netCDF4包查看nc文件属性,准备手动填写importnumpyasnpimportpandasaspdimportnet......
  • 如何使用Oracle Enterprise Manager Database Express连接到PDB数据库
    1.问题重复弹出登录框,无法登陆关闭登录框,显示invalidcontainername2.解决方法参考链接为PDB启动EMExpress要为PDB启动EMExpress,请确保PDB以读/写模式打开,然后尝试本主题中描述的以下方法之一(按所示顺序):连接到包含PDB的CDB的CDB$ROOT容器,并发出以下SQL......
  • Codeforces Round 896 (Div. 2)
    CodeforcesRound896(Div.2)A.MakeItZero代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingi128=__int128;intn,m;voidsolve(){scanf("%d",&n);vector<int>a(n+1);for(inti......
  • 用 Rust 的 declarative macro 做了个小东西
    最近几天在弄ddnspod的时候,写了个宏:custom_meta_struct解决什么问题#[derive(Debug,Clone,serde::Serialize,serde::Deserialize)]structActionA{url:String,//https://example.comversion:String,//v1.2.3a:u64,//...}#[derive(Deb......
  • C# Word VBA 获取所有CommandBarID
    foreach(Office.CommandBarControlcin.CommandBars.Controls){if(c.Id==){}}SubSample()Application.CommandBars.FindControl(ID:=927).ExecuteEndSubSub插入按钮名称和ID()DimwdAppAsObject'Word.ApplicationDimcbAsObject......
  • 平衡二叉树(Balanced Binary Tree)
    平衡二叉树(BalancedBinaryTree)平衡二叉树是一种特殊的二叉搜索树,它具有以下特点:每个节点的左子树和右子树的高度差不超过1。所有的子树也都是平衡二叉树。通过保持平衡性,平衡二叉树可以在最坏情况下仍然具有较好的性能,保证查找、插入和删除操作的时间复杂度为O(logn)。......