Powershell 使用所需状态配置的Azure Scale集的驱动器映射
我遇到了一个有趣的问题。也许你们这些好人能帮我了解这里发生了什么。如果有更好的方法,我洗耳恭听 我正在Azure上运行DSC配置,希望映射驱动器。我已经读过这篇文章,这并不是DSC的目的,但我不知道除了使用Azure Scalesets的DSC之外还有什么其他方法可以做到这一点。以下是脚本中我遇到的问题部分:Powershell 使用所需状态配置的Azure Scale集的驱动器映射,powershell,azure,azure-powershell,dsc,Powershell,Azure,Azure Powershell,Dsc,我遇到了一个有趣的问题。也许你们这些好人能帮我了解这里发生了什么。如果有更好的方法,我洗耳恭听 我正在Azure上运行DSC配置,希望映射驱动器。我已经读过这篇文章,这并不是DSC的目的,但我不知道除了使用Azure Scalesets的DSC之外还有什么其他方法可以做到这一点。以下是脚本中我遇到的问题部分: Script MappedDrive { SetScript = { $pass = "passwordhere" | Conve
Script MappedDrive
{
SetScript =
{
$pass = "passwordhere" | ConvertTo-SecureString -AsPlainText -force
$user = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList "username",$pass
New-PSDrive -Name W -PSProvider FileSystem -root \\azurestorage.file.core.windows.net\storage -Credential $user -Persist
}
TestScript =
{
Test-Path -path "W:"
}
GetScript =
{
$hashresults = @{}
$hashresults['Exists'] = test-path W:
}
}
我还在SetScript部分尝试了以下代码:
(New-Object -ComObject WScript.Network).MapNetworkDrive('W:','\\azurestorage.file.core.windows.net\storage',$true,'username','passwordhere')
我还尝试了一个简单的net use命令来映射驱动器,而不是使用新奇的、新对象或新的PSDrive cmdlet。同样的行为
如果我手动运行这些命令(New Object/Net Use/New PSDrive),如果我使用单独的驱动器号运行,机器将映射驱动器。不知何故,驱动器正在尝试映射,但没有映射
我所做的故障排除:
- 我的环境中没有域。我只是尝试创建一个缩放集并运行DSC,以便使用在创建存储帐户时授予的存储帐户凭据来配置机器
- 我正在使用存储帐户用户id和访问密钥(随机生成的密钥,通常以存储帐户的名称作为用户)提供给我的用户名和密码李>
- Azure在运行DSC模块时不会抛出任何错误(事件日志中没有错误,仅提供信息-资源执行序列在DSC文件中正确列出了我的所有序列。)
- 当我登录到机器并检查驱动器是否映射时,我遇到了一个断开连接的网络驱动器,驱动器号是我想要的(W:)
- 如果打开Powershell,我会收到一个错误:“尝试在“文件系统”提供程序上执行InitializeDefaultDrive操作失败。”
- 如果我运行“Get-PSDrive”,则不会显示W:drive
- 如果我在Powershell控制台内手动运行SetScript代码,则映射的驱动器在不同的驱动器号下工作正常
- 如果我尝试断开W:驱动器的连接,我会收到“此网络连接不存在”
- 我想也许DSC在映射之前需要一些时间,并添加了一个睡眠计时器,但这不起作用。同样的行为
- 我想象这里正在发生什么:
DSC在
NT AUTHORITY\SYSTEM
帐户下运行,除非设置了凭据属性,否则从网络共享中提取文件时将使用计算机帐户。但是看看Azure文件是如何运行的,权限不应该是个问题,但是在NT AUTHORITY\SYSTEM
下运行整个过程可能会有问题。我建议你试着检查一下你的虚拟机,看看是否有效
另外,如果您确信share\ntfs权限正确,还可以尝试对具有网络共享的VM执行相同的操作。您可能需要启用它才能工作。我以前也遇到过类似的问题,虽然它不涉及DSC,但在服务器重新启动之前,装载Azure文件共享是可以的,然后它会显示为断开连接的驱动器。如果我将New Object/Net Use/New PSDrive与persist选项一起使用,就会发生这种情况
这个问题的答案,我在
保留虚拟机的存储帐户凭据
在装载到文件共享之前,首先保存您的存储帐户
虚拟机上的凭据。此步骤允许Windows
虚拟机启动时自动重新连接到文件共享
重新启动。要保留您的帐户凭据,请运行cmdkey命令
从虚拟机上的PowerShell窗口。代替
使用存储帐户的名称,以及
使用您的存储帐户密钥
cmdkey/add:.file.core.windows.net/user:/pass:
当虚拟机启动时,Windows现在将重新连接到您的文件共享
重新启动。您可以通过运行来验证共享是否已重新连接
来自PowerShell窗口的net use命令
请注意,凭据仅在
cmdkey运行。如果您正在开发一个作为
服务,您将需要在该上下文中作为
嗯
使用持久化凭据装载文件共享
一旦与虚拟机建立了远程连接,就可以运行
net use命令使用以下命令装载文件共享
语法。替换为存储的名称
帐户,并使用您的文件存储共享的名称
net用法:\\.file.core.windows.net\
例子:
net use z:\\samples.file.core.windows.net\logs
因为您在上一个版本中保留了存储帐户凭据
步骤中,您不需要向他们提供netuse命令。如果你
尚未保留您的凭据,请将其作为
参数传递给netuse命令,如下所示
例如
编辑:
我没有免费的Azure虚拟机来测试它,但这在服务器2016 hyper-v虚拟机上运行良好
Script MapAzureShare
{
GetScript =
{
}
TestScript =
{
Test-Path W:
}
SetScript =
{
Invoke-Expression -Command "cmdkey /add:somestorage.file.core.windows.net /user:somestorage /pass:somekey"
Invoke-Expression -Command "net use W: \\somestorage.file.core.windows.net\someshare"
}
PsDscRunAsCredential = $credential
}
在我的简短测试中,驱动器只有在服务器重新启动后才会出现。这实际上会给我带来一个错误。[[Script]MappedDrive]在目标“使用用户提供的凭据执行SetScript”上执行操作“Set-TargetResource”。详细:[2016-12-09T14:51:06][ERROR]发生系统错误1312。详细:[2016-12-09T14:51:06][错误]指定的登录会话不存在。它可能已被终止。您是否使用了PsDscRunAsCredential
cmdkey
没有它将无法工作。“PsDscRunAsCredential”无效。如果我改用Credtial,cmdkey将永远不会获得我传递结果的用户。恐怕这是不可能的,因为请记住,这不是一个标准的份额。此共享是使用Azure共享文件存储构建的。共享是使用Azure门户和/或Powershell cmdlet创建的。你没有