我制作了以下 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);
只要指出一个适当的例子就可以了。我想做这项工作,但找不到我需要的信息。
我的大学系统工程老师说要求来自两个地方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# 库交互呢?