转载:http://blog.csdn.net/zhzuo/article/details/1732937

共享访问在.NET中的编程实现

发布日期:2007-08-08 | 更新日期:2009-03-15

作者:郑佐

摘要:本文简单介绍在.NET中如何通过API实现局域网共享访问编程。

本页内容

概述

API介绍

代码实现

应用示例

结束语

概述

一般用户在访问局域网中的计算机时都需要提供访问凭据,如果想通过编程来实现自动登录,.NET开发人员一般首先会想到通过调用WMI来实现。但是在实现过程中也许你会发现使用ConnectionOptions类不是很理想,因此本文采用了平台调用的方式来介绍共享访问编程实现。

API介绍

mpr.dll是Windws操作系统网络通讯相关模块,通过对功能需求的分析,直接调用mpr.dll来实现该功能。在.NET中需要通过平台调用(platform invoke)来调用其中的方法,这里需要用到mpr.dll中的两个方法。对于mpr.dll中包含的具体功能这里不进行阐述,大家通过MSDN可以找到详细说明,这里只列出方法定义。

方法一

DWORD WNetAddConnection2(

  LPNETRESOURCE lpNetResource,

  LPCTSTR lpPassword,

  LPCTSTR lpUsername,

  DWORD dwFlags

);

该方法主要功能是添加远程网络连接。

参数描述如下:

lpNetResource:是一个包含网络访问资源的结构,在这里作为参数用来指定详细的网络连接信息,具体请看下面。

lpPassword:指出访问远程计算机的密码。在Windows 95/98/Me 系统中,该值必须设置为NULL或空字符串。

lpUsername:指出访问远程计算机的用户名。在Windows 95/98/Me 系统中,该值必须设置为NULL或空字符串。

dwFlags:指出连接选项,包含六种设置,具体可以看MSDN。

方法返回值:如果方法执行成功返回“NO_ERROR”即“0”。如果执行失败返回System Error Code

NETRESOURCE结构通过多个字段指定网络连接资源信息。定义如下:

typedef struct _NETRESOURCE {

  DWORD dwScope;

  DWORD dwType;

  DWORD dwDisplayType;

  DWORD dwUsage;

  LPTSTR lpLocalName;

  LPTSTR lpRemoteName;

  LPTSTR lpComment;

  LPTSTR lpProvider;

} NETRESOURCE;

各个成员描述如下:

dwScope:指定枚举范围。设置RESOURCE_CONNECTED,RESOURCE_GLOBALNET,RESOURCE_REMEMBERED三值之一。

dwType:指定访问的资源类型。设置三个值之一。RESOURCETYPE_ANY表示所有资源;RESOURCETYPE_DISK表示磁盘资源;RESOURCETYPE_PRINT表示打印机。

dwDisplayType:指出资源显示类型。RESOURCEDISPLAYTYPE_DOMAIN;RESOURCEDISPLAYTYPE_SERVER;RESOURCEDISPLAYTYPE_SHARE;RESOURCEDISPLAYTYPE_GENERIC。

dwUsage:描述资源的使用方式。设置RESOURCEUSAGE_CONNECTABLE 或RESOURCEUSAGE_CONTAINER。

lpLocalName:同dwScope关联,指定本地映射。

lpRemoteName:远程访问文件夹路径。

lpComment:描述。

lpProvider:资源提供者,可以设置为NULL。

方法二

DWORD WNetCancelConnection2(

  LPCTSTR lpName,

  DWORD dwFlags,

  BOOL fForce

);

通过该方法实现释放存在的网络连接。

各成员描述如下:

lpName:指定本地驱动器或远程共享资源

dwFlags:表示断开连接方式。设置 0 或CONNECT_UPDATE_PROFILE。

fForce:如果当前正在使用远程资源,是否进行强制断开连接。如果设置FALSE,在有远程资源使用的情况下关闭连接操作将会失败。

方法返回值:如果方法执行成功返回“NO_ERROR”即“0”。如果执行失败返回System Error Code

针对以上两个方法,有些System Error Code返回值并不意味远程资源不可以访问。

例如:

ERROR_SESSION_CREDENTIAL_CONFLICT

1219

Multiple connections to a server or shared resource by the same user, using more than one user name, are not allowed. Disconnect all previous connections to the server or shared resource and try again.

ERROR_REMOTE_SESSION_LIMIT_EXCEEDED

1220

An attempt was made to establish a session to a network server, but there are already too many sessions established to that server.

代码实现

为便于在.NET环境中使用,本文写了一个WNetConnectionHelper静态类,对这些方法进行包装。

P/Invoke需要引用System.Runtime.InteropServices命名空间。由于代码简短,下面给出完整实现代码。

public static class WNetConnectionHelper
{
[DllImport("mpr.dll", EntryPoint = "WNetAddConnection2")]
private static extern uint WNetAddConnection2(NetResource lpNetResource, string lpPassword, string lpUsername, uint dwFlags); [DllImport("Mpr.dll", EntryPoint = "WNetCancelConnection2"))]
private static extern uint WNetCancelConnection2(string lpName, uint dwFlags, bool fForce); [StructLayout(LayoutKind.Sequential)]
public class NetResource
{
public int dwScope;
public int dwType;
public int dwDisplayType;
public int dwUsage;
public string lpLocalName;
public string lpRemoteName;
public string lpComment;
public string lpProvider;
} public static uint WNetAddConnection(NetResource netResource,string username,string password)
{
uint result = WNetAddConnection2(netResource, password, username, );
return result;
} public static uint WNetAddConnection(string username, string password, string remoteName, string localName)
{
NetResource netResource = new NetResource();
netResource.dwScope = ; //RESOURCE_GLOBALNET
netResource.dwType = ; //RESOURCETYPE_ANY
netResource.dwDisplayType = ; //RESOURCEDISPLAYTYPE_GENERIC
netResource.dwUsage = ; //RESOURCEUSAGE_CONNECTABLE
netResource.lpLocalName = localName;
netResource.lpRemoteName = remoteName.TrimEnd('//');
//netResource.lpRemoteName = lpComment;
//netResource.lpProvider = null;
uint result = WNetAddConnection2(netResource, password, username, );
return result;
} public static uint WNetCancelConnection(string name,uint flags,bool force)
{
uint nret = WNetCancelConnection2(name, flags, force);
return nret;
}
}

应用示例

最后,通过两个简单示例来演示WNetConnectionHelper类的使用。

a.列举远程计算机共享文件夹资源。代码如下:

try
{
string result = WNetConnectionHelper.WNetAddConnection("192.120.40.10//ShareUser", "xxxxxx", @"//192.120.40.10/test", null);
string [] files = Directory.GetFiles(@"//192.120.40.56/test/fw");
string s1 = GetFile(@"//192.120.40.10/test/fw/test.doc");
uint n = WNetConnectionHelper.WNetCancelConnection("//192.120.40.10//test", , true);
}
catch (Exception ex)
{
//编写异常处理代码
}

b.另一个比较常见的应用是在ASP.NET服务器端访问其他计算机的资源,比如文档服务器,然后通过Web页面输出。

主要示例代码如下:

protected void Page_Load(object sender, EventArgs e)
{
uint r = WNetConnectionHelper.WNetAddConnection("192.120.40.10//username", "password", @"//192.120.40.10/test", "Z:");
string filename = @"//192.120.40.10/test/fw/1.doc";
ReadFile(filename);
} 写文件到Web输出:
public void ReadFile(string filename)
{
Response.Clear();
Response.Charset = "utf-8";
Response.Buffer = true;
this.EnableViewState = false;
Response.ContentType = "application/ms-word";
Response.ContentEncoding = System.Text.Encoding.UTF8;
Response.AppendHeader("Content-Disposition", "inline;filename=1.doc");
try
{
Response.WriteFile(filename, true);
}
catch (Exception ex)
{
Response.Write(ex.ToString());
}
Response.Flush();
}

以上方法对于大文件使用Response.WriteFile方法会有些问题,在实际编程中需要做优化处理。

结束语

本文中的有些功能描述可能不够具体或妥当,如果需要了解mpr.dll的更多功能还是建议看MSDN文档。对于WNetConnectionHelper的实现存在一些需要完善的地方,不过对于一般的应用基本可以满足,在实际使用时还需要考虑多线程的情况。另外,在有同名驱动器映射的情况下需要做一些判断,而且弄清楚System Error Code的含义对代码的调试及正确执行有很大的帮助。This is some sample text. You are usingFCKeditor.

共享访问在.NET中的编程实现的更多相关文章

  1. OC中并发编程的相关API和面临的挑战

    OC中并发编程的相关API和面临的挑战(1) 小引 http://www.objc.io/站点主要以杂志的形式,深入挖掘在OC中的最佳编程实践和高级技术,每个月探讨一个主题,每个主题都会有几篇相关的文 ...

  2. ubuntu如何实现访问实际网络中windows共享文件夹

    方法一: 首先在建立一个挂载目录. sudo mkdir /mnt/share 然后就把共享目录持载进去. 服务器:192.168.6.84 共享名:gg 用户名:administrator 密 码: ...

  3. VB.NET中网络编程的另一种方案----system.net中的HttpWebRequest类的使用

    VB.NET中网络编程的另一种方案---- system.net中的HttpWebRequest类的使用 在VB.net中进行网络编程,除了我之前写的随笔中的使用WinHttp组件进行编程,还有另一种 ...

  4. 实现Redhat Linux 6和Windows通过Windows Server AD统一认证并共享访问Oracle ZS存储系统

    Windows Server 2012 AD设置 1.  建立新的组织单位OU 为用户提前建立好OU,是为了AD用户管理简单清晰. 2.  建立新的用户和用户组 建立新的用户的时候,要同时将用户归属到 ...

  5. c#中异步编程

    异步是现实生活中的很多现象的一种抽象.比如分工合作在很多时间段就是异步合作.异步中也一般要涉及委托方法.c#有3种模式的异步编程:异步模式,基于事件的异步模式,基于任务的异步模式(TAP). 一.   ...

  6. Azure进阶攻略丨共享访问签名是个什么东东?

    Azure 进阶攻略]一经推出便受到了广大粉丝的热情追捧,大家纷纷表示涨了姿势,并希望能了解更多的攻略~根据大家的投票结果,本期,小编将为大家讲解“如何生成 Shared Access Signatu ...

  7. 干货 | 玩转云文件存储——利用CFS实现web应用的共享访问

    京东云文件服务(Cloud File Service,以下简称:CFS)是一种高可靠.可扩展.可共享访问的全托管分布式文件系统.它可在不中断应用服务的情况下,根据您对文件系统的使用,按需扩展或缩减,并 ...

  8. 【Azure 存储服务】代码版 Azure Storage Blob 生成 SAS (Shared Access Signature: 共享访问签名)

    问题描述 在使用Azure存储服务,为了有效的保护Storage的Access Keys.可以使用另一种授权方式访问资源(Shared Access Signature: 共享访问签名), 它的好处可 ...

  9. Android中JNI编程的那些事儿(1)

    转:Android中JNI编程的那些事儿(1)http://mobile.51cto.com/android-267538.htm Android系统不允许一个纯粹使用C/C++的程序出现,它要求必须 ...

随机推荐

  1. Android--Led_Demo_APK控制LED灯

    下面代码主要实现接口定义,实现从.so库文件接口函数在JAVA里面的声明:package com.friendlyarm.AndroidSDK; import android.util.Log; pu ...

  2. [Vim] Vim 常用基本操作

    1. 导航 1.1. 查看行号 :set number  显示行号 :set number!  隐藏行号 :.=  在底部显示当前行号 :=  在底部显示总行号 1.2. 移动光标 0 或 ^    ...

  3. Java枚举根据key获取value

    package com.utcip.crm.common.constants; import com.utcip.crm.common.base.process.ScheduleStatusEnum; ...

  4. 【加解密专辑】对接触到的PGP、RSA、AES加解密算法整理

    先贴代码,有空再整理思路 PGP加密 using System; using System.IO; using Org.BouncyCastle.Bcpg; using Org.BouncyCastl ...

  5. 基于WordNet的英文同义词、近义词相似度评估及代码实现

    源码地址:https://github.com/XBWer/WordSimilarity 1.确定要解决的问题及意义 在基于代码片段的分类过程中,由于程序员对数据变量名的选取可能具有一定的规范性,在某 ...

  6. jQuery的init都做了些什么

    // 初始化jQuery对象,即jQuery.fn.init对象 // @param selector 选择器,可能是DOM对象.html字符串.jQuery对象.函数或其他任意值. // @para ...

  7. linux常用命令大全3--rpm安装软件

    RPM 包 - (Fedora, Redhat,CentOS及类似系统) rpm -ivh package.rpm 安装一个rpm包 rpm -ivh --nodeeps package.rpm 安装 ...

  8. C99中的变长数组(VLA)

    处理二维数组的函数有一处可能不太容易理解,数组的行可以在函数调用的时候传递,但是数组的列却只能被预置在函数内部.例如下面这样的定义: #define COLS 4 int sum3d(int ar[] ...

  9. 【CF827F】Dirty Arkady's Kitchen DP

    [CF827F]Dirty Arkady's Kitchen 题意:给你一张n个点,m条边的有向图,每条边长度为1,第i条边在[li,ri)的时间内可以进入,求1到n的最短路. $n,m\le 5\t ...

  10. linux下jmeter持续集成Jenkins部署时问题解决

    之前成linux下安装了Jenkins,并做了一些简单的工作,这次正好将jmeter也集成进去,在实际操作时发现好多坑,写下做记录 怎么安装这里就不介绍了,网上很多资料,这里只记录问题,以供大家参数 ...