• 保持与 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.cndemo1

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

    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.cndemo1

                                   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 COMPUTERNAMEusername)”。如果在此命令窗口中运行“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.cndemo1

                                     Microsoft Windows Network

    The command completed successfully.

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

    net use z:\filedemo.file.core.chinacloudapi.cndemo1

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

    dir \filedemo.file.core.chinacloudapi.cndemo1

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

    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

  • 相关阅读:
    java基础35 双例集合Map及其常用方法
    java基础34 泛型的使用
    java基础33 Set集合下的HashSet集合和TreeSet集合
    java基础32 List集合下的ArrayList集合
    部分日期时间函数
    SQL语句常见视图操作部分试题(一)
    高级子查询常见用法及举例
    DDL/DML/DCL区别概述
    SQL语句常见DDL/DML/DCL操作部分试题(一)
    Create database 创建数据库
  • 原文地址:https://www.cnblogs.com/new0801/p/6176164.html
Copyright © 2020-2023  润新知