保持与 Microsoft Azure Files 的连接

我们在最近的博客文章中介绍了 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

本文翻译自:

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