保持与 Microsoft Azure Files 的连接
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
有关详细信息,请参阅以下链接:
Storage .NET Client Library 4.3.0
本文翻译自: