【问题标题】:Drive Mapping with Azure Scale Sets using Desired State Configuration使用所需状态配置与 Azure 规模集进行驱动器映射
【发布时间】:2016-12-08 19:44:30
【问题描述】:

我遇到了一个有趣的问题。也许你们这些好人可以帮助我了解这里发生了什么。如果有更好的方法,我会全力以赴。

我正在 Azure 上运行 DSC 配置,并且想要映射驱动器。我读过这真的不是 DSC 的用途,但我不知道在 DSC 之外使用 Azure Scalesets 执行此操作的任何其他方式。这是我遇到问题的脚本部分:

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 命令来映射驱动器,而不是花哨的 New-Object 或 New-PSDrive cmdlet。同样的行为。

如果我手动运行这些命令(New-Object/Net Use/New-PSDrive),如果我使用单独的驱动器号运行它,机器将映射驱动器。不知何故,驱动器正在尝试映射但没有映射。

我已完成的故障排除:

  • 我的环境中没有域。我只是尝试创建一个规模集并运行 DSC 以使用在创建存储帐户时授予的存储帐户凭据来配置计算机。
  • 我正在使用存储帐户用户 ID 和访问密钥(随机生成的密钥,通常使用存储帐户的名称作为用户)提供给我的用户名和密码。
  • Azure 在运行 DSC 模块时未引发错误(事件日志中没有错误,仅供参考 - 资源执行序列正确列出了 DSC 文件中的所有序列。)
  • 当我登录机器并检查驱动器是否已映射时,我遇到了我想要的驱动器号 (W:) 上的断开连接的网络驱动器。
  • 如果我打开 Powershell,我会收到错误消息:“尝试对 'FileSystem' 提供程序执行 InitializeDefaultDrives 操作失败。”
  • 如果我运行“Get-PSDrive”,W: 驱动器不会出现。
  • 如果我在 Powershell 控制台中手动运行 SetScript 代码,则映射的驱动器在不同的驱动器号下可以正常工作。
  • 如果我尝试断开 W: 驱动器,我会收到“此网络连接不存在”。
  • 我认为 DSC 可能需要一些时间才能进行映射并添加了睡眠定时器,但这不起作用。同样的行为。

【问题讨论】:

    标签: powershell azure azure-powershell dsc


    【解决方案1】:

    我之前遇到过类似的问题,虽然它不涉及 DSC,但安装 Azure 文件共享会很好,直到服务器重新启动,然后它会显示为断开连接的驱动器。如果我使用带有持久选项的 New-Object/Net Use/New-PSDrive,就会发生这种情况。

    这个问题的答案,我在updated docs找到了

    保留虚拟机的存储帐户凭据

    在挂载到文件共享之前,首先保留您的存储帐户 虚拟机上的凭据。此步骤允许 Windows 虚拟机时自动重新连接到文件共享 重新启动。要保留您的帐户凭据,请运行 cmdkey 命令 从虚拟机上的 PowerShell 窗口。代替 使用您的存储帐户的名称,以及 使用您的存储帐户密钥。

    cmdkey /add:<storage-account-name>.file.core.windows.net /user:<storage-account-name> /pass:<storage-account-key>

    Windows 现在将在虚拟机时重新连接到您的文件共享 重新启动。您可以通过运行来验证共享是否已重新连接 PowerShell 窗口中的 net use 命令。

    请注意,凭据仅在 cmdkey 运行。如果您正在开发一个作为 服务,您将需要在该上下文中保留您的凭据 好吧。

    使用持久化凭据装载文件共享

    与虚拟机建立远程连接后,您可以运行 net use 命令挂载文件共享,使用以下命令 句法。替换为您的存储名称 帐户,以及您的文件存储共享的名称。

    net use <drive-letter>: \\<storage-account-name>.file.core.windows.net\<share-name> example : net use z: \\samples.file.core.windows.net\logs

    由于您在上一个中保留了您的存储帐户凭据 步骤,您不需要向他们提供 net use 命令。如果你 尚未保留您的凭据,然后将它们作为 传递给net use命令的参数,如下图 例子。

    编辑: 我没有可以免费测试的 Azure VM,但这在 Server 2016 hyper-v vm 上运行良好

    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] [错误] 发生系统错误 1312。详细:[2016-12-09T14:51:06] [错误] 指定的登录会话不存在。它可能已经被终止了。
    • 你用过PsDscRunAsCredential吗? cmdkey 没有它就无法工作。
    • 'PsDscRunAsCredential' 无效。如果我使用 Credtial 代替,则 cmdkey 永远不会获得我传递结果的用户。恐怕这是不可能的,就像powershell.org/forums/topic/…
    【解决方案2】:

    我想在这里发生的事情:
    DSC 在NT AUTHORITY\SYSTEM 帐户下运行,除非已设置凭据属性,否则在从网络共享中提取文件时将使用Computer account。但是看看 Azure Files 是如何运行的,权限应该不是问题,但是在NT AUTHORITY\SYSTEM 下运行整个过程就可以了。我建议你尝试run DSC as a user 看看你的虚拟机是否有效。

    ps。您还可以尝试对具有网络共享的 VM 执行相同的操作,您确信 share\ntfs 权限是正确的。您可能需要启用 anonymous user to access your share 才能使其工作。

    【讨论】:

    • 请记住,这不是标准共享。此共享是使用 Azure 共享文件存储构建的。使用 Azure 门户和/或 Powershell cmdlet 创建共享。您不会像 Windows 服务器上的普通共享那样修改用户权限。
    • 我在回答中从未说过修改任何权限,请在评论前阅读。 @227被动
    猜你喜欢
    • 1970-01-01
    • 2021-06-07
    • 2014-06-19
    • 2019-11-21
    • 2016-03-10
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    • 2021-06-04
    相关资源
    最近更新 更多