我们在最近的博客文章中介绍了 Azure StorageFiles的预览版,请单击此处。该文章包含
Azure Files 的相关信息,说明了如何申请预览版并开始使用,还介绍了一些有助于创建共享和传输数据的工具。本文章将重点阐述如何才能创建与 Azure File共享的持久连接,以便您的计划任务、应用程序或已登录用户在
VM重新启动后仍可以使用该共享。

Windows IaaS VM

默认情况下,Windows在重新启动过程中会尝试保持到
SMB共享的连接。但是,系统在此过程中不会自动保存 Azure Files凭据,因此,重新启动后系统将无法重新连接到
Azure Files共享。保存这些凭据的方法多种多样,以下详细介绍了其中的几种方法。

保存凭据

CmdKey

要建立持久连接,最简单的方法是使用“CmdKey”命令行实用程序将您的存储帐户凭据保存到
Windows 中。以下是一个把您的存储帐户凭据保存到 VM中的命令行示例:

C:\>cmdkey/add:<yourstorageaccountname>.file.core.chinacloudapi.cn/user:<yourstorageaccountname> /pass:<YourStorageAccountKeyWhichEndsIn==>

Note:yourstorageaccountname is not yourlive id but the name in the endpoint.

借助 CmdKey,您还可以列出系统存储的凭据:

C:\>cmdkey /list

Currently stored credentials:

Target:Domain:target=filedemo.file.core.chinacloudapi.cn

Type:DomainPassword

User:filedemo

保存凭据后,以后在连接到共享时将不再需要提供这些凭据。也就是说,无需指定任何凭据,您就能连接:

C:\>net use * \\filedemo.file.core.chinacloudapi.cn\demo1

Drive Z:is now connected to\\filedemo.file.core.chinacloudapi.cn\demo1.

The command completed successfully.

然后,您可以重新启动 VM(此操作将断开与
VM 的连接):

shutdown –t 0 –r

VM重新启动并重新连接后,您可以打开另一个命令窗口来确认是否已自动重新连接:

C:\>net use

New connections will be remembered.

Status   Local    Remote       Network

-----------------------------------------------------------------------------

OK       Z:       \\filedemo.file.core.chinacloudapi.cn\demo1

Microsoft Windows Network

The command completed successfully.

凭据管理器

您还可以借助凭据管理器(位于“控制面板”\“用户帐户”下)来保存存储帐户凭据。

用户上下文

Windows会为在 VM上运行的每个用户维护不同的上下文,有时同一时间在同一
VM上运行的同一用户的上下文会有所不同。每个上下文均可独立连接到一组不同的 SMB共享,并且每个上下文都有自己的映射到所连接共享的盘符。

由 CmdKey保存的凭据可供运行“CmdKey”的用户使用。同样,由“net
use”记住的连接可供运行 net use的用户使用。因此,如果您的应用程序会在不同的用户名下运行,您可能还希望为其他用户保存凭据和连接。要执行此操作,您可以使用“runas”命令:

runas /user:<username> cmd.exe

此命令将打开一个新的命令窗口。命令窗口的标题将显示为“cmd.exe (running as COMPUTERNAME\username)”。如果在此命令窗口中运行“net
use”,您会看到此用户未连接到任何共享:

C:\>net use

New connections will be remembered.

There are no entries in the list.

您可以针对该用户按上所述运行“CmdKey”和“net
use”,为其保存您的存储凭据以及与 Azure File的连接。

管理员上下文

如果您在 VM上创建了一个新的本地用户,并将此用户添加到了管理员组,您可以在提升和非提升上下文中运行此用户的命令。提升和非提升上下文中的连接并不共享,因此您可能会希望通过执行“net
use”在各自的上下文中单独进行连接。但是,保存的凭据是共享的,因此您仅需在其中一个上下文中运行“CmdKey”即可。

处理计划任务

您可以创建在任何 VM用户下运行的计划任务,并且这些计划任务能够使用该用户通过
CmdKey建立的持久凭据。但是,这些计划任务可能会在此登录用户以外的其他用户上下文中运行,因此与 SMB共享的连接不会在运行该任务的用户上下文中自动重新连接。

例如,如果您创建的计划任务运行调用“net use”的脚本并将输出写入到本地文件,而此用户先前已与
Azure File 共享创建持久连接,还具有该共享的持久凭据,则输出将包含以下内容:

Status     Local    Remote       Network

-----------------------------------------------------------------------------

UnavailableZ:       \\filedemo.file.core.chinacloudapi.cn\demo1

Microsoft Windows Network

The command completed successfully.

但是,该上下文中的凭据可以重新连接到共享。因此,如果向您的脚本添加以下命令,则将重新建立网络连接:

net use z:\\filedemo.file.core.chinacloudapi.cn\demo1

或者,您的脚本可以使用完整的 UNC路径(而不是已映射的盘符)访问文件:

dir \\filedemo.file.core.chinacloudapi.cn\demo1

另外还要注意,由于计划任务不在登录用户所处的环境中运行,因此由该计划任务创建的连接可能不会在此环境中建立。

Windows PaaS角色

PaaS角色的功能与持久连接恰好相反。对于
PaaS角色,无论系统是否启动了全新的实例,还是重新启动了您的实例,都要确保您的代码可以自动进行连接。

对WNetAddConnection2进行平台调用

您可以通过对WNetAddConnection2进行平台调用来映射
PaaS角色启动代码中的盘符。以下代码声明了一组建立从 Azure Files共享到本地盘符的映射所需的结构。

[DllImport("Mpr.dll",

EntryPoint ="WNetAddConnection2",

CallingConvention = CallingConvention.Winapi)]

privatestaticexternint
WNetAddConnection2(NETRESOURCElpNetResource,

string
lpPassword,

string
lpUsername,

System.UInt32 dwFlags);

[DllImport("Mpr.dll",

EntryPoint ="WNetCancelConnection2",

CallingConvention = CallingConvention.Winapi)]

privatestaticexternint
WNetCancelConnection2(string lpName,

System.UInt32 dwFlags,

System.Boolean fForce);

[StructLayout(LayoutKind.Sequential)]

privateclass
NETRESOURCE

{

publicint
dwScope;

public
ResourceType dwType;

publicint
dwDisplayType;

publicint
dwUsage;

publicstring
lpLocalName;

publicstring
lpRemoteName;

publicstring
lpComment;

publicstring
lpProvider;

};

publicenum
ResourceType

{

RESOURCETYPE_DISK = 1,

};

然后,您可以编写一个用于在给定盘符上挂载共享的方法:

publicstaticvoid
MountShare(string shareName,

string
driveLetterAndColon,

string
username,

string
password)

{

if(!String.IsNullOrEmpty(driveLetterAndColon))

{

//确保我们未使用此盘符进行其他映射

WNetCancelConnection2(driveLetterAndColon, 0,true);

}

NETRESOURCE nr =new
NETRESOURCE();

nr.dwType = ResourceType.RESOURCETYPE_DISK;

nr.lpRemoteName = shareName;

nr.lpLocalName = driveLetterAndColon;

int
result =WNetAddConnection2(nr, password, username, 0);

if
(result != 0)

{

thrownew
Exception("WNetAddConnection2failed with error " +result);

}

}

然后,可以从您角色的“OnStart()”方法中调用此方法:

MountShare("\\\\filedemo.file.core.chinacloudapi.cn\\demo1",

"z:",

"filedemo",

"<YourStorageAccountKeyWhichEndsIn==>");

从此时起,一直到 Worker Role,您都能够使用盘符或完整
UNC 路径读取文件并将其写入到 Azure File共享:

File.Create("z:\\WNetAddConnection2.txt");

File.Create(\\\\filedemo.file.core.chinacloudapi.cn\\demo1\\UNC.txt);

Web Role和用户上下文

Azure Web Role的
OnStart()方法不在用于显示网站页面的用户上下文中运行。因此,如果希望从显示页面的代码中引用您的 Azure Files共享,您应该将上述代码放在
Global.Application_Start()方法,而不是WebRole.OneStart()中。

Linux VM

Linux具有多种在启动过程中自动挂载共享的方法,但是我们仅在
Ubuntu 14.04 LTS上对其中一种方法进行试验。

保持与 Fstab的连接

Linux的 /etc中有一个称为“fstab”的文件,该
/etc 在启动过程中可用于挂载驱动器和共享。在启动过程中自动挂载 Azure Files共享的一种方法是,向
/etc/fstab添加一行。应将以下文本放在文件中的一行:

//<yourstorageaccountname>.file.core.chinacloudapi.cn/demo1/home/azureuser/smb cifsvers=2.1,dir_mode=0777,file_mode=0777,username=<yourstorageaccountname>,password=<YourStorageAccountKeyWhichEndsIn==>

下表详细介绍了此行包含的各个部分:

部分

示例

描述

共享 URL

//filedemo.file.core.chinacloudapi.cn/demo1

之前创建的 Azure Files共享的
URL

挂载点

/home/azureuser/smb

您之前创建以挂载共享的 Linux VM上空白目录的路径。

文件系统

Cifs

要挂载的文件系统的类型。对于 Azure Files,其文件系统类型为“cifs”。

挂载参数

vers=2.1

要使用的 SMB版本,在本示例中为
2.1

dir_mode=0777

用于 Azure Files共享目录的权限掩码,在本示例中为完整权限。

file_mode=0777

用于 Azure Files共享文件的权限掩码,在本示例中为完整权限。

username=filedemo

对于 Azure Files,此用户名必须为您的存储帐户名称。

password=StorageAccountKey==

对于 Azure Files,此密码必须为您的完整存储帐户密钥。

您的 fstab文件中还可以包含许多其他选项。有关详细信息,请参阅您正在使用的
Linux版本的相关文档。

总结

我们之前发布的介绍
Azure Files 的文章
和本文章集中介绍了帮助您创建到
Azure File 共享的持久连接的步骤,从而使您可以在重新启动后使用共享连接。我们始终乐于倾听您的反馈,请通过本博客和Azure
Storage MSDN论坛
发表评论或发送电子邮件至mastoragequestions@microsoft.com

Andrew Edwards

有关详细信息,请参阅以下链接:

Azure Files 2014-04-14版本

Microsoft
Azure File服务简介

AzCopy

Storage .NET Client Library 4.3.0

本文翻译自:

http://blogs.msdn.com/b/windowsazurestorage/archive/2014/05/27/persisting-connections-to-microsoft-azure-files.aspx

保持与 Microsoft Azure Files 的连接的更多相关文章

  1. Docker on Microsoft Azure

    Docker蓬勃发展,如日中天.微软自然也不甘落后,且不说即将发布的.支持Docker技术的Windows Nano Server和Windows Server 2016.我们来看看在Microsof ...

  2. 使用VNET-to-VNET连接Microsoft Azure国际版和中国版

    Microsoft Azure的VNET-to-VNET功能可以实现跨虚拟网络的VPN连接,通过VNET-to-VNET互联的两个虚拟网络可以在同一个订阅下或者隶属不同的订阅,而且可以跨数据中心.这实 ...

  3. 如何修复在Microsoft Azure中“虚拟机防火墙打开,关闭RDP的连接端口”问题

     注:下列步骤并不一定适用所有场景,提供思路,请灵活应用 我们在使用Microsoft Azure 中Windows 虚拟机,有时会发生错误打开防火墙或一些管家软件错误的关闭了"远程桌面 ...

  4. Microsoft Azure Point to Site VPN替代方案

    Microsoft Azure提供了Point to Site VPN,但有时候这并不能满足我们的需求,例如:Point to Site VPN是SSTP VPN,只能支持Window客户端拨入,而且 ...

  5. Microsoft Azure File 服务简介

    我们非常高兴地宣布在微软Azure中国区推出 Microsoft Azure File 服务预览版.Azure File 服务使用标准 SMB 2.1 协议提供文件共享.Azure 中运行的应用程序现 ...

  6. Microsoft Azure Web Sites应用与实践【4】—— Microsoft Azure网站的“后门”

    Microsoft Azure Web Sites应用与实践 系列: [1]—— 打造你的第一个Microsoft Azure Website [2]—— 通过本地IIS 远程管理Microsoft ...

  7. Microsoft Azure Web Sites应用与实践【2】—— 通过本地IIS 远程管理Microsoft Azure Web Site

    Microsoft Azure Web Sites应用与实践 系列: [1]—— 打造你的第一个Microsoft Azure Website [2]—— 通过本地IIS 远程管理Microsoft ...

  8. Microsoft Azure 的负载平衡器的Session Sticky

    Microsoft Azure 的负载平衡器是一种 Layer-4负载平衡器.Microsoft Azure 负载平衡器通过针对给定输入端点上接收到的流量计算哈希函数,在一组可用的服务器(虚拟机)之间 ...

  9. 新版Microsoft Azure Web管理控制台 - Microsoft Azure New Portal - (1)

    国际版Microsoft Azure的Preview Portal已经于12月2日正式GA,现在登录国际版的Microsoft Azure,默认就会进入Microsoft Azure New Port ...

随机推荐

  1. WTL 中CComboBoxEx显示不了的问题

    在使用WTL的CComboBoxEx时,InsertItem之后,运行程序,ComboBox显不了问题,其原因如下: I guess you want to place combo box to di ...

  2. linux系统制作简单流程

    制作嵌入式平台使用的Linux内 核, 方法和制作PC平台 的Linux内 核基本一致, 下面使用 对比的方式介绍如何制作用 于6410开发板的内 核. 1. 清除原有配置与中间文件x86: make ...

  3. jQuery(function(){})与(function(){})(jQuery)的区别

    jQuery(function(){ });/$(function(){ });全写为 $(document).ready(function(){}); 意义为在DOM加载完毕后执行了ready()方 ...

  4. 002.TPerlRegEx简单测试

    我要做什么? 将一个字符串中的所有连续的数字替换成一个* 代码: program Project1; {$APPTYPE CONSOLE} uses System.SysUtils, PerlRegE ...

  5. linux安装mysql出现Could NOT find Curses (missing CURSES_LIBRARY CURSES_INCLUDE_PATH),提示解决方法

    [root@localhost mysql-5.5.11]# cmake . 出现以下错误提示: -- Could NOT find Curses (missing:  CURSES_LIBRARY ...

  6. VS2013 调试卡顿

    今早好奇安装了花生壳远程控制软件.然后下午莫名的感觉到vs2013 调试特别的卡顿.会每隔1s中请求一次的那种卡顿于是卸载了花生壳控制软件,发现问题依旧.然后重启机器 ok了.果然不卡顿了. 我回忆了 ...

  7. Hive(转)

    Hive分区表 在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作.有时候只需要扫描表中关心的一部分数据,因此建表时引入了partition概念.分区表指的是在创建表时指 ...

  8. linux下修改IP信息

    在Linux的系统下如何才能修改IP信息 以前总是用ifconfig修改,重启后总是得重做.如果修改配置文件,就不用那么麻烦了- A.修改ip地址 即时生效: # ifconfig eth0 192. ...

  9. java 中 sleep(1000) 和 wait(1000) 的区别?

    1.首先 sleep 方法是Thread类中的静态方法,他的作用是使当前线程暂时睡眠指定的时间,可以不用放在synchronized方法或者代码块中,但是 wait 方法是Object类的方法,它是使 ...

  10. 将 Photoshop CC 2015.5 英文界面换成中文, 英文与中文界面互换

    注:转载或引用请注明出处 在英文的win server 2012 r2 上安装PS CC 2015.5 时,安装程序自动按成了英文版的PS,那么如何将英文换成中文呢? 网上大多讲的都是将中文换成英文, ...