需要帮助将 azure recoveryservices powershell 转换为 .net azure 资源管理 sDK 调用

问题描述 投票:0回答:1

我制作了以下 powershell 脚本来从 azure 恢复服务恢复数据库。 我现在需要使用 Azure.ResourceManager SDK 在 C# 中重复此操作。

我很难将各种命令行开关与 SDK 中的等效调用相匹配,它的文档似乎相当少,并且使用了不同的命名约定。微软似乎也改变了每个小版本的命名。

如果有人能告诉 met 等价物是什么 Get-AzRecoveryServicesBackupContainer -ContainerType AzureVMAppContainer -VaultId $vault.ID -FriendlyName“abcd” 在.net azure资源管理SDK中......

我尝试将其翻译为 c# 的脚本的核心:

function Restore-OTADatabaseFromAzure {
    param (
        [string] $SourceSqlInstanceName,
        [string] $SourceSqlAGName,
        [string] $SourceDatabaseName,
        [string] $NewDatabaseName,
        [string] $HaNode,
        [string] $DataPath,
        [string] $LogPath
    )

    try 

        Select-azSubscription -Subscription $subscription
        
        #https://learn.microsoft.com/en-us/rest/api/recoveryservices/vaults/get?view=rest-recoveryservices-2023-04-01&tabs=HTTP
        $vault = Get-AzRecoveryServicesVault  -ResourceGroupName $resourceGroupName -Name $vaultName  -Verbose 
        #Write-Host "Vault: $($vault.ID)"

        #$Container = Get-AzRecoveryServicesBackupContainer -ContainerType AzureVMAppContainer -VaultId $vault.ID -FriendlyName "abcd"
        #Write-Host "Container: $($container.Name)"

        $backupItem = Get-AzRecoveryServicesBackupItem -BackupManagementType AzureWorkload -WorkloadType MSSQL -Name "SQLDataBase;$($SourceSqlAGName);$($SourceDatabaseName)" -VaultId $vault.ID  -ProtectionStatus Healthy

        $startDate = (Get-Date).AddDays(-10).ToUniversalTime()
        $endDate = (Get-Date).ToUniversalTime()
        $recoveryPoints = Get-AzRecoveryServicesBackupRecoveryPoint -Item $backupItem -VaultId $vault.ID -StartDate $startdate -EndDate $endDate
        $latestRecoveryPoint = Get-AzRecoveryServicesBackupRecoveryPoint -Item $backupItem -VaultId $vault.ID -RecoveryPointId $recoveryPoints[0].RecoveryPointId

        # Restoring Friendly name is case-sensitive
        $TargetContainer =  Get-AzRecoveryServicesBackupContainer -ContainerType AzureVMAppContainer -VaultId $vault.ID -FriendlyName $HaNode.ToLower()

        #Write-Host "TagetContainer: $($TargetContainer.Name)" warning! case sensitive names
        $TargetInstance = Get-AzRecoveryServicesBackupProtectableItem -WorkloadType MSSQL -ItemType SQLInstance -Name "sqlinstance;ota" -ServerName "servername..." -VaultId $vault.ID


        $recoveryconfig = Get-AzRecoveryServicesBackupWorkloadRecoveryConfig -RecoveryPoint $latestRecoveryPoint -TargetItem $TargetInstance -AlternateWorkloadRestore -VaultId $vault.ID -TargetContainer $TargetContainer 


        $recoveryconfig.targetPhysicalPath
        $recoveryconfig.RestoredDBName = $NewDatabaseName

        $recoveryconfig.targetPhysicalPath[0].TargetPath = "$($DataPath)$($NewDatabaseName).mdf"
        $recoveryconfig.targetPhysicalPath[1].TargetPath = "$($LogPath)\$($NewDatabaseName).ldf"


        $recoveryconfig | Format-List

        $recoveryconfig.targetPhysicalPath

        # run the actual restore.
        $RestoreJob = Restore-AzRecoveryServicesBackupItem -WLRecoveryConfig $recoveryconfig -VaultId $vault.ID 

        do
        {
            $RestoreJob = Get-AzRecoveryServicesBackupJob -JobId $RestoreJob.JobID -VaultId $vault.ID
            Write-Host "Restoring: $($RestoreJob.Status), $($RestoreJob.StartTime), $($RestoreJob.EndTime), $($RestoreJob.Duration), $($RestoreJob.Operation)"
            Start-Sleep -Seconds 5
        }
        while (($RestoreJob.Status -ne "Completed") -And ($RestoreJob.Status -ne "Failed"))

        if ($RestoreJob.Status -eq "Completed") {
            return $true
        }
        else {
            return $false
        }
    }
    catch {
        return $false
    }
}

我开始了:

 // using Azure.Identity;
            var options = new ClientCertificateCredentialOptions
            {
                AuthorityHost = AzureAuthorityHosts.AzurePublicCloud,
            };

            // https://learn.microsoft.com/dotnet/api/azure.identity.clientcertificatecredential
            var clientCertCredential = new ClientCertificateCredential(
                tenantId, clientId, clientCertificate, options);


            ArmClient client = new ArmClient(clientCertCredential);

            SubscriptionResource subscription = client.GetSubscriptionResource(new ResourceIdentifier($"/subscriptions/{subscriptionId}"));
            ResourceGroupCollection resourceGroups = subscription.GetResourceGroups();
            ResourceGroupResource resourceGroup = await resourceGroups.GetAsync(resourceGroupName);


            //$vault = Get-AzRecoveryServicesVault  -ResourceGroupName $resourceGroupName -Name $vaultName  -Verbose 
            RecoveryServicesVaultResource vault = await resourceGroup.GetRecoveryServicesVaultAsync(vaultName);

只要指出一个适当的例子就可以了。我想做这项工作,但找不到我需要的信息。

c# azure-resource-manager azure-powershell azure-resource-graph azure-site-recovery
1个回答
0
投票

我的大学系统工程老师说要求来自两个地方1)书面要求2)愿景。将愿景转化为书面需求是系统工程师的工作。

您是系统工程师。您必须与客户合作,将他的愿景转化为书面要求。

在我看来“用c#编写是一个愿景”,而不是一个书面要求。它没有指定您可以使用或不使用哪些库。你可以使用 Github 上的库吗?可以使用第三方库吗? c# 是托管的并且运行缓慢。那么必要时可以用c++编写代码来满足速度要求吗?你可以使用编译好的Matlab dll吗?

用c#编写也没有说明是否可以使用Process Class来调用可执行文件和脚本。可以使用BAT文件吗?你会使用Python吗?它没有说明您可以使用的项目类型。您可以使用 Windows 窗体吗?您可以拥有多个项目吗?可以使用 WPF 或 ASP.Net 吗?您需要以 CORE 为目标还是可以使用 Net?代码需要由管理员运行还是普通用户可以运行代码?

c# 和 Powershell 都使用 Net/Core 库。用 C# 编写的和用 Powershell 编写的实际上没有区别。许多 C# 库没有很好的文档记录,尤其是与 Windows 系统方法交互的库。等效的 Powershell 只是包装器,具有与 c# 相同方法的详细记录的接口。

那么,当您可以在 Powershell 中做同样的事情时,为什么还要费劲与 C# 库交互呢?

© www.soinside.com 2019 - 2024. All rights reserved.