保持与 Microsoft Azure Files 的连接
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共享的 |
|
挂载点 |
/home/azureuser/smb |
您之前创建以挂载共享的 Linux VM上空白目录的路径。 |
|
文件系统 |
Cifs |
要挂载的文件系统的类型。对于 Azure Files,其文件系统类型为“cifs”。 |
|
挂载参数 |
vers=2.1 |
要使用的 SMB版本,在本示例中为 |
|
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
本文翻译自:
保持与 Microsoft Azure Files 的连接的更多相关文章
- Docker on Microsoft Azure
Docker蓬勃发展,如日中天.微软自然也不甘落后,且不说即将发布的.支持Docker技术的Windows Nano Server和Windows Server 2016.我们来看看在Microsof ...
- 使用VNET-to-VNET连接Microsoft Azure国际版和中国版
Microsoft Azure的VNET-to-VNET功能可以实现跨虚拟网络的VPN连接,通过VNET-to-VNET互联的两个虚拟网络可以在同一个订阅下或者隶属不同的订阅,而且可以跨数据中心.这实 ...
- 如何修复在Microsoft Azure中“虚拟机防火墙打开,关闭RDP的连接端口”问题
注:下列步骤并不一定适用所有场景,提供思路,请灵活应用 我们在使用Microsoft Azure 中Windows 虚拟机,有时会发生错误打开防火墙或一些管家软件错误的关闭了"远程桌面 ...
- Microsoft Azure Point to Site VPN替代方案
Microsoft Azure提供了Point to Site VPN,但有时候这并不能满足我们的需求,例如:Point to Site VPN是SSTP VPN,只能支持Window客户端拨入,而且 ...
- Microsoft Azure File 服务简介
我们非常高兴地宣布在微软Azure中国区推出 Microsoft Azure File 服务预览版.Azure File 服务使用标准 SMB 2.1 协议提供文件共享.Azure 中运行的应用程序现 ...
- Microsoft Azure Web Sites应用与实践【4】—— Microsoft Azure网站的“后门”
Microsoft Azure Web Sites应用与实践 系列: [1]—— 打造你的第一个Microsoft Azure Website [2]—— 通过本地IIS 远程管理Microsoft ...
- Microsoft Azure Web Sites应用与实践【2】—— 通过本地IIS 远程管理Microsoft Azure Web Site
Microsoft Azure Web Sites应用与实践 系列: [1]—— 打造你的第一个Microsoft Azure Website [2]—— 通过本地IIS 远程管理Microsoft ...
- Microsoft Azure 的负载平衡器的Session Sticky
Microsoft Azure 的负载平衡器是一种 Layer-4负载平衡器.Microsoft Azure 负载平衡器通过针对给定输入端点上接收到的流量计算哈希函数,在一组可用的服务器(虚拟机)之间 ...
- 新版Microsoft Azure Web管理控制台 - Microsoft Azure New Portal - (1)
国际版Microsoft Azure的Preview Portal已经于12月2日正式GA,现在登录国际版的Microsoft Azure,默认就会进入Microsoft Azure New Port ...
随机推荐
- [leetcode] 403. Frog Jump
https://leetcode.com/contest/5/problems/frog-jump/ 这个题目,还是有套路的,之前做过一道题,好像是贪心性质,就是每次可以跳多远,最后问能不能跳到最右边 ...
- (poj)3159 Candies
题目链接:http://poj.org/problem?id=3159 Description During the kindergarten days, flymouse was the monit ...
- Demo02_对结构体进行文件读写_张仕传_作业_
#include <iostream> using namespace std; #define StructArrarySize 5 // 老师数量 #define StudentNum ...
- HeadFirst设计模式-前言总结
1 鸭子抽象类 class Duck { quack(); swim(); virtual display()=0 }; 现在如果让鸭子能够飞 class Duck { quack(); swim() ...
- 替换a链接的href和title
新项目准备验收,客户检测网页有安全隐患,说是当前网页使用“http://”有风险,指定外部链接不用“http://”怎么整…… 后来想到用JS替换字符串去操作,找了半天总算找到合用的,最终是用JQ去更 ...
- GDI+ 如何将图片绘制成圆形的图片
大概意思就是不生成新的图片,而是将图片转换为圆形图片. 实现代码如下: private Image CutEllipse(Image img, Rectangle rec, Size size) { ...
- 【Hades】ades是一个开源库,基于JPA和Spring构建,通过减少开发工作量显著的改进了数据访问层的实现
几乎每个应用系统都需要通过访问数据来完成工作.要想使用领域设计方法,你就需要为实体类定义和构建资源库来实现领域对象的持久化.目前开发人员经常使用JPA来实现持久化库.JPA让持久化变得非常容易,但是仍 ...
- Source Insight 显示中文乱码
Source Insight 3.X utf8支持插件震撼发布 继上次SI多标签插件之后,因为公司内部编码改为utf8编码,因此特意做了这个Source Insight 3.X utf8插件. 下载地 ...
- 创建第一个UI
创建一个2D UI 制作UI时,首先要创建UI的"根".在Unity顶部NGUI菜单中选择Create,然后选择2D UI. 创建完成后,在Scene窗口中,NGUI自动生成了一个 ...
- ios字符串操作
string的操作应用 NSRange range = [self.general rangeOfString:@"."]; NSString *str = [self.gener ...