為 VM 設定 Active Directory,讓 VM 自動加入網域

Last reviewed 2024-10-31 UTC

本文說明如何設定 Active Directory 和 Compute Engine,讓 Windows 虛擬機器 (VM) 執行個體自動加入 Active Directory 網域。

將 Windows VM 加入 Active Directory 的程序自動化,有助於簡化 Windows 伺服器的佈建程序。此外,您也可以運用自動調度資源,同時享有使用 Active Directory 管理存取權和設定的好處。

本文件適用於系統管理員,並假設您熟悉 Active Directory 和 Google Cloud 網路。

按照本文程序建立的設定,可做為您在 Google Cloud中使用 Windows Server 進行其他工作的基礎。舉例來說,完成這項程序後,您就能在 Windows 容器中部署使用 Windows 驗證的 ASP.NET 應用程式。

如果您使用 Managed Microsoft AD,且不需要自動清除過時的電腦帳戶,請考慮使用自動加入網域功能加入 Windows VM。詳情請參閱「自動將 Windows VM 加入網域」。

目標

費用

在本文件中,您會使用 Google Cloud的下列計費元件:

本文的操作說明旨在將您的資源用量維持在 Google Cloud的一律免費方案配額限制內。 如要根據預測用量估算費用,請使用 Pricing Calculator 初次使用 Google Cloud 的使用者可能符合免費試用資格。

完成本文件後,您可以刪除已建立的資源,避免系統繼續計費。詳情請參閱「清除」。

事前準備

本文假設您已在 Google Cloud 上部署 Active Directory,方法是使用 Managed Service for Microsoft Active Directory (Managed Microsoft AD),或在 Google Cloud上部署自行管理的網域控制站。

如要完成程序,請確認您具備下列條件:

  • Active Directory 網域的管理存取權,包括建立使用者、群組和機構單位 (OU) 的權限。
  • Active Directory 網域控制器部署所在的虛擬私有雲中,未使用的 /28 CIDR IP 範圍。您可以使用這個 IP 範圍設定無伺服器虛擬私有雲存取。
  • 您要部署 Windows 執行個體的子網路。子網路必須設定為使用私人 Google 存取權

如果您使用自行管理的網域控制站,還需要下列項目:

實作這個方法

在內部部署環境中,您可能會依賴應答檔案 (unattend.xml) 和JoinDomain自訂,自動將新電腦加入網域。雖然您可以在 Google Cloud中使用相同的程序,但這種做法有幾項限制:

  • 使用自訂 unattend.xml 檔案時,您必須維護自訂 Compute Engine 映像檔。如要使用 Windows Update 讓自訂映像檔保持在最新狀態,需要持續維護,或先設定自動化程序。除非您基於其他原因需要維護自訂映像檔,否則這項額外工作可能不值得。
  • 使用 JoinDomain 自訂功能會將圖片繫結至單一 Active Directory 網域,因為網域名稱必須在 unattend.xml 中指定。如果您維護多個 Active Directory 網域或樹系 (例如用於個別測試和生產環境),則可能需要為每個網域維護多個自訂映像檔。
  • 如要將 Windows 電腦加入網域,必須提供有權在目錄中建立電腦物件的使用者憑證。如果您在 unattend.xml 中使用 JoinDomain 自訂項目,則必須將這些憑證以純文字形式嵌入 unattend.xml。這些內嵌憑證可能會讓圖片成為攻擊者的目標。雖然您可以設定適當的身分與存取權管理 (IAM) 權限,控管映像檔的存取權,但管理自訂映像檔的存取權會增加不必要的複雜度。

本文採用的方法不會使用應答檔案,因此不需要特別準備映像檔。建立 VM 執行個體時,請改用下列 sysprep 專屬指令碼片段

iex((New-Object System.Net.WebClient).DownloadString('https://DOMAIN'))

這個 sysprep 專用指令碼會啟動下列圖表所示的程序。

sysprep specialize 指令碼啟動的程序。

程序如下:

  1. 建立 VM 執行個體後,Windows 會首次啟動。在特製化設定階段中,Windows 會執行 sysprep 特製化指令碼片段。專屬指令碼片段會叫用 register-computer Cloud Run 應用程式,並下載可控管網域加入程序的 PowerShell 指令碼。
  2. Windows 會叫用下載的 PowerShell 指令碼。
  3. PowerShell 指令碼會呼叫中繼資料伺服器,取得可安全識別 VM 執行個體的 ID 權杖。
  4. 指令碼會再次呼叫 register-computer 應用程式,並傳遞 ID 權杖來驗證自身。
  5. 應用程式會驗證 ID 權杖,並擷取 VM 執行個體的名稱、區域和Google Cloud 專案 ID。
  6. 應用程式會驗證 Active Directory 網域是否已設定為允許指定專案的 VM 執行個體加入網域。如要完成這項驗證,應用程式會找出並連線至 Active Directory 網域控制站,檢查是否有名稱與 ID 權杖中的 Google Cloud 專案 ID 相符的機構單位 (OU)。如果找到相符的 OU,專案的 VM 執行個體就能加入指定 OU 中的 Active Directory 網域。
  7. 應用程式會驗證 Google Cloud 專案是否已設定為允許 VM 執行個體加入 Active Directory。為完成這項驗證,應用程式會檢查是否能使用 Compute Engine API 存取 VM 執行個體。
  8. 如果所有檢查都順利通過,應用程式會在 Active Directory 中預先暫存電腦帳戶。應用程式會將 VM 執行個體的名稱、區域和 ID 儲存為電腦帳戶物件中的屬性,以便與 VM 執行個體建立關聯。
  9. 應用程式會使用 Kerberos 設定密碼通訊協定,為電腦帳戶指派隨機密碼。
  10. 電腦名稱和密碼會透過 TLS 安全通道傳回 Windows 執行個體。
  11. PowerShell 指令碼會使用預先準備的電腦帳戶,將電腦加入網域。
  12. 專屬設定階段完成後,電腦會自行重新啟動。

本程序的其餘部分會逐步說明設定自動加入網域的必要步驟。

準備 Active Directory 網域

首先,請準備 Active Directory 網域。如要完成這個步驟,您需要具備 Active Directory 網域管理員存取權的電腦。

選用:限制可加入網域的電腦

您可能想限制哪些使用者能將電腦加入網域。根據預設,預設網域控制站政策的群組政策物件 (GPO) 設定會將Add workstations to domain使用者權限授予所有已驗證的使用者。只要擁有這項使用者權限,就能將電腦加入網域。由於您會自動將電腦加入 Active Directory 網域,因此普遍授予這類存取權會造成不必要的安全風險。

如要限制可將電腦加入 Active Directory 網域的使用者,請變更「Default Domain Controller Policy」GPO 的預設設定:

  1. 使用 RDP 用戶端登入可管理 Active Directory 網域的電腦。
  2. 開啟群組原則管理主控台 (GPMC)。
  3. 依序前往「樹系」 >「網域」 >「domain-name >「群組政策物件」,其中 domain-name 是 Active Directory 網域的名稱。
  4. 在「Default Domain Controller Policy」上按一下滑鼠右鍵,然後點選「Edit」
  5. 在群組原則管理編輯器控制台中,依序前往「電腦設定」>「原則」>「Windows 設定」>「安全性設定」>「本機原則」>「使用者權限指派」
  6. 按兩下「Add workstations to domain」(將工作站新增至網域)
  7. 在「資源」中,從清單移除「已驗證的使用者」
  8. 如要允許管理員手動加入網域 (選用),請按一下「新增使用者或群組」,然後將管理員群組新增至清單。
  9. 按一下 [確定]

現在可以關閉群組原則管理編輯器主控台和 GPMC。

初始化目錄結構

現在請建立機構單位,做為所有專案專屬機構單位的容器:

  1. 使用 RDP 用戶端登入可管理 Active Directory 網域的電腦。
  2. 開啟已啟用進階權限的 PowerShell 工作階段。
  3. 建立新的機構單位:

    $ParentOrgUnitPath = (Get-ADDomain).ComputersContainer
    $ProjectsOrgUnitPath = New-ADOrganizationalUnit `
      -Name 'Projects' `
      -Path $ParentOrgUnitPath `
      -PassThru
    

建立 Active Directory 使用者帳戶

如要存取 Active Directory 並預先設定電腦帳戶,register-computer應用程式需要 Active Directory 使用者帳戶:

  1. 建立名為 register-computer 的 Active Directory 使用者帳戶,為該帳戶指派隨機密碼,然後將其放在 Projects OU 中:

    # Generate a random password
    $Password = [Guid]::NewGuid().ToString()+"-"+[Guid]::NewGuid().ToString()
    
    # Create user
    $UpnSuffix = (Get-ADDomain).DNSRoot
    $RegisterComputerUser = New-ADUser `
        -Name "register-computer Cloud Run app" `
        -GivenName "Register" `
        -Surname "Computer" `
        -Path $ProjectsOrgUnitPath `
        -SamAccountName "register-computer" `
        -UserPrincipalName "register-computer@$UpnSuffix" `
        -AccountPassword (ConvertTo-SecureString "$Password" -AsPlainText -Force) `
        -PasswordNeverExpires $True `
        -Enabled $True `
        -PassThru
    
  2. 授予 register-computer 帳戶管理 Projects OU 和子 OU 中電腦帳戶和群組所需的最低權限:

    $AcesForContainerAndDescendents = @(
        "CCDC;Computer",               # Create/delete computers
        "CCDC;Group"                   # Create/delete users
    )
    
    $AcesForDescendents = @(
        "LC;;Computer" ,               # List child objects
        "RC;;Computer" ,               # Read security information
        "WD;;Computer" ,               # Change security information
        "WP;;Computer" ,               # Write properties
        "RP;;Computer" ,               # Read properties
        "CA;Reset Password;Computer",  # ...
        "CA;Change Password;Computer", # ...
        "WS;Validated write to service principal name;Computer",
        "WS;Validated write to DNS host name;Computer",
    
        "LC;;Group",                   # List child objects
        "RC;;Group",                   # Read security information
        "WD;;Group",                   # Change security information
        "WP;;Group",                   # Write properties
        "RP;;Group"                    # Read properties
    )
    
    $AcesForContainerAndDescendents | % { dsacls.exe $ProjectsOrgUnitPath /G "${RegisterComputerUser}:${_}" /I:T | Out-Null }
    $AcesForDescendents | % { dsacls.exe $ProjectsOrgUnitPath /G "${RegisterComputerUser}:${_}" /I:S | Out-Null }
    

    這個指令可能需要幾分鐘才能完成。

  3. 授予 register-computer 帳戶刪除 DNS 記錄的權限:

    Managed Microsoft AD

    Add-ADGroupMember -Identity "Cloud Service DNS Administrators" -Members ${RegisterComputerUser}
    

    自行管理的網域

    $DnsPartition=(Get-ADDomain).SubordinateReferences | Where-Object {$_.StartsWith('DC=DomainDnsZones')}
    $DnsContainer="DC=$((Get-ADDomain).DNSRoot),CN=MicrosoftDNS,$DnsPartition"
    
    dsacls $DnsContainer /G "${RegisterComputerUser}:SD" /I:S
    
  4. 顯示 Projects OU 路徑和產生的 Active Directory 使用者帳戶密碼。register-computer請記下這些值,因為後續步驟會用到。

    Write-Host "Password: $Password"
    Write-Host "Projects OU: $ProjectsOrgUnitPath"
    

準備 Google Cloud 專案

現在請設定網域專案:

  • 如果您使用 Managed Microsoft AD,網域專案就是您部署 Managed Microsoft AD 的專案。
  • 如果您使用自行管理的 Active Directory,網域專案就是執行 Active Directory 網域控制器的專案。如果是共用虛擬私有雲,這個專案必須與虛擬私有雲主專案相同。

您可以使用這個網域專案執行下列操作:

  • 建立 Secret Manager 密鑰,內含 register-computer Active Directory 使用者帳戶的密碼。
  • 部署 register-computer 應用程式。
  • 設定 Cloud Scheduler,以便觸發清除過時電腦帳戶的作業。

建議您根據最低權限原則,授予網域專案的存取權。

建立 Secret Manager 密鑰

  1. 在 Google Cloud 控制台中開啟 Cloud Shell。

    開啟 Cloud Shell

  2. 啟動 PowerShell:

    pwsh
    
  3. 初始化下列變數,並將 domain-project-id 替換為網域專案的 ID:

    $DomainProjectId = "domain-project-id"
    
  4. 將網域專案設為預設專案:

    & gcloud config set project $DomainProjectId
    
  5. 啟用 Secret Manager API:

    & gcloud services enable secretmanager.googleapis.com
    
  6. 輸入 register-computer Active Directory 使用者帳戶的密碼 ,並儲存在 Secret Manager 密鑰中:

    $RegisterComputerCredential = (Get-Credential -Credential 'register-computer')
    
    $TempFile = New-TemporaryFile
    Set-Content $TempFile $($RegisterComputerCredential.GetNetworkCredential().Password) -NoNewLine
    
    & gcloud secrets create ad-password --data-file $TempFile
    
    Remove-Item $TempFile
    

授予 Kerberos 和 LDAP 的存取權

如要管理網域加入作業,register-computer 應用程式會使用下列通訊協定存取網域控制器:

  • LDAP (TCP/389) 或 LDAPS (TCP/636)
  • Kerberos (UDP/88、TCP/88)
  • 變更 Kerberos 密碼 (UDP/464、TCP/464)

Managed Microsoft AD

您不需要設定任何防火牆規則。

自行管理的網域

建立防火牆規則,允許存取網域控制站。

您可以根據指派給網域控制器的網路標記套用規則,也可以使用服務帳戶套用規則。

依網路標記

& gcloud compute firewall-rules create allow-adkrb-from-serverless-to-dc `
    --direction INGRESS `
    --action allow `
    --rules udp:88,tcp:88,tcp:389,tcp:636,udp:464,tcp:464 `
    --source-ranges $ServerlessIpRange `
    --target-tags dc-tag `
    --network $VpcName `
    --project vpc-project-id `
    --priority 10000

更改下列內容:

  • dc-tag:指派給網域控制站 VM 的網路標記。
  • vpc-project-id:定義虛擬私有雲的專案 ID。如果您使用共用 VPC,請使用 VPC 主專案;否則請使用網域專案的 ID。

依服務帳戶

& gcloud compute firewall-rules create allow-adkrb-from-serverless-to-dc `
    --direction INGRESS `
    --action allow `
    --rules udp:88,tcp:88,tcp:389,tcp:636,udp:464,tcp:464 `
    --source-ranges $ServerlessIpRange `
    --target-service-accounts dc-sa `
    --network $VpcName `
    --project vpc-project-id `
    --priority 10000

更改下列內容:

  • dc-sa:網域控制站 VM 使用的服務帳戶電子郵件地址。
  • vpc-project-id:定義 VPC 的專案 ID。如果您使用共用 VPC,請使用 VPC 主專案;否則請使用網域專案的 ID。

部署 Cloud Run 應用程式

現在請設定 Cloud Build,將 register-computer 應用程式部署至 Cloud Run:

  1. 在 Cloud Shell 中,複製 GitHub 存放區。

    & git clone https://github.com/GoogleCloudPlatform/gce-automated-ad-join.git
    cd gce-automated-ad-join/ad-joining
    
  2. 初始化下列變數:

    $ServerlessRegion = "serverless-region"
    $VpcName = "vpc-name"
    $VpcSubnet = "subnet-name"
    $AdDomain = "dns-domain-name"
    $AdNetbiosDomain = "netbios-domain-name"
    $ProjectsOrgUnitPath = "projects-ou-distinguished-name"
    

    更改下列內容:

    • serverless-region:要部署 register-computer 應用程式的區域。這個地區不必與您打算部署 VM 執行個體的地區相同。
    • vpc-name:包含 Active Directory 網域控制器的虛擬私有雲網路名稱。
    • subnet-name:用於直接虛擬私有雲存取vpc-name 子網路。 子網路必須與 serverless-region 位於相同區域。
    • dns-domain-name:Active Directory 網域的 DNS 網域名稱。
    • netbios-domain-name:Active Directory 網域的 NetBIOS 名稱。
    • projects-ou-distinguished-nameProjects 機構單位的識別名稱。
  3. 啟用 Cloud Run 和 Cloud Build API:

    & gcloud services enable run.googleapis.com cloudbuild.googleapis.com
    
  4. 為 Cloud Run 應用程式建立服務帳戶 register-computer-app

    & gcloud iam service-accounts create register-computer-app `
      --display-name="register computer Cloud Run app"
    
  5. 建立服務帳戶 build-service,用於執行 Cloud Build 觸發條件:

    & gcloud iam service-accounts create build-service `
      --display-name="Cloud Build build agent"
    
  6. 允許 Cloud Run 服務帳戶讀取含有 Active Directory 密碼的密碼:

    & gcloud secrets add-iam-policy-binding ad-password `
      --member "serviceAccount:register-computer-app@$DomainProjectId.iam.gserviceaccount.com" `
      --role "roles/secretmanager.secretAccessor"
    
  7. 授予 Cloud Build 必要權限,以便部署至 Cloud Run:

    $DomainProjectNumber = (gcloud projects describe $DomainProjectId --format='value(projectNumber)')
    & gcloud iam service-accounts add-iam-policy-binding register-computer-app@$DomainProjectId.iam.gserviceaccount.com `
      --member "serviceAccount:build-service@$DomainProjectId.iam.gserviceaccount.com" `
      --role "roles/iam.serviceAccountUser"
    
    & gcloud projects add-iam-policy-binding $DomainProjectId `
      --member "serviceAccount:build-service@$DomainProjectId.iam.gserviceaccount.com" `
      --role roles/cloudbuild.builds.builder
    
    & gcloud projects add-iam-policy-binding $DomainProjectId `
      --member "serviceAccount:build-service@$DomainProjectId.iam.gserviceaccount.com" `
      --role roles/run.admin
    
  8. 使用 cloudbuild.yaml 檔案做為範本,建立符合您環境的自訂 Cloud Run 建構設定:

    $Build = (Get-Content cloudbuild.yaml)
    $Build = $Build.Replace('__SERVERLESS_REGION__', "$ServerlessRegion")
    $Build = $Build.Replace('__PROJECTS_DN__', "$ProjectsOrgUnitPath")
    $Build = $Build.Replace('__AD_DOMAIN__', "$AdDomain")
    $Build = $Build.Replace('__AD_NETBIOS_DOMAIN__', "$AdNetbiosDomain")
    $Build = $Build.Replace('__SERVICE_ACCOUNT_EMAIL__', "register-computer-app@$DomainProjectId.iam.gserviceaccount.com")
    $Build = $Build.Replace('__SERVERLESS_NETWORK__', "$VpcName")
    $Build = $Build.Replace('__SERVERLESS_SUBNET__', "$VpcSubnet")
    $Build | Set-Content .\cloudbuild.hydrated.yaml
    
  9. 建構應用程式並部署至 Cloud Run:

    & gcloud builds submit . `
      --config cloudbuild.hydrated.yaml `
      --substitutions _IMAGE_TAG=$(git rev-parse --short HEAD) `
      --service-account "projects/$DomainProjectId/serviceAccounts/build-service@$DomainProjectId.iam.gserviceaccount.com" `
      --default-buckets-behavior regional-user-owned-bucket
    

    部署作業可能需要幾分鐘才能完成。

  10. 判斷 Cloud Run 應用程式的網址:

    $RegisterUrl = (gcloud run services describe register-computer `
      --platform managed `
      --region $ServerlessRegion `
      --format=value`(status.url`))
    Write-Host $RegisterUrl
    

    請記下網址。建立要加入 Active Directory 的 VM 執行個體時,您需要這個帳戶。

  11. 叫用 Cloud Run 應用程式,確認部署作業是否正常運作:

    Invoke-RestMethod $RegisterUrl
    

    系統會顯示 PowerShell 指令碼。VM 會在加入網域的專屬階段執行這個指令碼。

為專案啟用自動加入網域功能

除非 VM 的專案已啟用自動加入網域功能,否則 register-computer 應用程式不允許 VM 執行個體加入 Active Directory 網域。這項安全措施可防止連線至未經授權專案的 VM 存取您的網域。

如要為專案啟用網域自動加入功能,請完成下列步驟:

  • 在 Active Directory 中建立 OU,名稱應符合您的Google Cloud 專案 ID。
  • 授予 register-computer 應用程式專案存取權。Google Cloud

首先,建立 OU:

  1. 使用遠端桌面通訊協定 (RDP) 用戶端,登入具有 Active Directory 網域管理權限的電腦。
  2. 在 Active Directory 使用者和電腦 MMC 嵌入式管理單元中,前往 OU。Projects
  3. 在機構單位上按一下滑鼠右鍵,然後依序選取「New」 >「Organizational Unit」
  4. 在「New Object」對話方塊中,輸入要部署 VM 的專案 ID。Google Cloud
  5. 按一下 [確定]

接著,將 register-computer 應用程式存取權授予Google Cloud 專案:

  1. 在 Cloud Shell 中啟動 PowerShell:

    pwsh
    
  2. 初始化下列變數:

    $ProjectId = "project-id"
    $DomainProjectId = "domain-project-id"
    

    取代

    • project-id 替換為Google Cloud 要部署 VM 的專案 ID
    • domain-project-id 替換為網域專案的 ID
  3. 將專案的 Compute Viewer 角色指派給 register-computer-app 服務帳戶:

    & gcloud projects add-iam-policy-binding $ProjectId `
        --member "serviceAccount:register-computer-app@$DomainProjectId.iam.gserviceaccount.com" `
        --role "roles/compute.viewer"
    

您的專案現在已支援自動加入網域。

測試加入網域

現在,您可以透過下列方式確認設定是否正常運作:

  • 建立可自動加入 Active Directory 網域的單一 VM 執行個體
  • 建立 VM 執行個體代管執行個體群組,自動加入 Active Directory 網域

建立及加入單一 VM 執行個體

建立會自動加入 Active Directory 網域的 VM 執行個體:

  1. 返回 Cloud Shell 中的 PowerShell 工作階段,然後初始化下列變數:

    $Region = "vpc-region-to-deploy-vm"
    $Zone = "zone-to-deploy-vm"
    $Subnet = "vpc-subnet-to-deploy-vm"
    $ServerlessRegion = "serverless-region"
    

    更改下列內容:

    • vpc-region-to-deploy-vm:要部署 VM 執行個體的區域。
    • vpc-subnet-to-deploy-vm:用於部署 VM 執行個體的子網路。
    • zone-to-deploy-vm:部署 VM 執行個體的可用區。
    • serverless-region:部署 Cloud Run 應用程式的區域。
  2. 設定預設專案和可用區:

    & gcloud config set project $ProjectId
    & gcloud config set compute/zone $Zone
    
  3. 再次查詢 Cloud Run 應用程式的網址:

    $RegisterUrl = (gcloud run services describe register-computer `
      --platform managed `
      --region $ServerlessRegion `
      --format value`(status.url`) `
      --project $DomainProjectId)
    
  4. 傳遞會導致 VM 加入網域的 specialize 指令碼片段,藉此建立執行個體:

    共用虛擬私有雲

    $VpchostProjectId = (gcloud compute shared-vpc get-host-project $ProjectId --format=value`(name`))
    & gcloud compute instances create join-01 `
        --image-family windows-2019-core `
        --image-project windows-cloud `
        --machine-type n1-standard-2 `
        --no-address `
        --subnet projects/$VpchostProjectId/regions/$Region/subnetworks/$Subnet `
        --metadata "sysprep-specialize-script-ps1=iex((New-Object System.Net.WebClient).DownloadString('$RegisterUrl'))"
    

    獨立 VPC

    & gcloud compute instances create join-01 `
        --image-family=windows-2019-core `
        --image-project=windows-cloud `
        --machine-type=n1-standard-2 `
        --no-address `
        --subnet $Subnet `
        --metadata "sysprep-specialize-script-ps1=iex((New-Object System.Net.WebClient).DownloadString('$RegisterUrl'))"
    

    如要使用自訂主機名稱,請在指令中加入 --hostname 參數。

    如果您使用的 Windows Server 版本早於 Windows Server 2019,系統可能預設會停用 TLS 1.2,導致專屬指令碼小程式失敗。如要啟用 TLS 1.2,請改用下列 scriptlet:

    [Net.ServicePointManager]::SecurityProtocol=[Net.SecurityProtocolType]::Tls12;iex((New-Object System.Net.WebClient).DownloadString('$RegisterUrl'))
    
  5. 監控啟動程序:

    & gcloud compute instances tail-serial-port-output join-01
    

    大約一分鐘後,電腦就會加入 Active Directory 網域。輸出結果會與下列內容相似:

    Domain           : corp.example.com
    DomainController : dc-01.corp.example.com.
    OrgUnitPath      : OU=test-project-123,OU=Projects,DC=corp,DC=example,DC=com
    
    WARNING: The changes will take effect after you restart the computer
    
    Computer successfully joined to domain
    

    如要停止觀察啟動程序,請按下 CTRL+C

確認 VM 已加入 Active Directory

  1. 使用遠端桌面通訊協定 (RDP) 用戶端,登入具有 Active Directory 網域管理權限的電腦。
  2. 開啟 Active Directory 使用者和電腦 MMC 嵌入式管理單元。
  3. 在選單中,確認已啟用「檢視」>「進階功能」
  4. 前往以您建立 VM 執行個體的 Google Cloud 專案 ID 命名的 OU。
  5. 按兩下 join-01 帳戶。
  6. 在「屬性」對話方塊中,按一下「屬性編輯器」分頁標籤。

    電腦帳戶會標註額外的 LDAP 屬性。您可以透過這些屬性追蹤電腦物件與 Compute Engine 執行個體之間的關聯。

    確認清單包含下列 LDAP 屬性和值。

    LDAP 屬性
    msDS-cloudExtensionAttribute1 Google Cloud 專案 ID
    msDS-cloudExtensionAttribute2 Compute Engine 可用區
    msDS-cloudExtensionAttribute3 Compute Engine 執行個體名稱

    msDS-cloudExtensionAttribute 屬性是一般用途屬性,Active Directory 本身不會使用。

診斷錯誤

如果 VM 執行個體無法加入網域,請檢查 register-computer 應用程式的記錄:

  1. 前往 Google Cloud 控制台的 Cloud Run。

    前往 Cloud Run

  2. 按一下 register-computer 應用程式。

  3. 按一下選單中的「記錄」

刪除執行個體

確認 VM 執行個體已加入 Active Directory 網域後,即可刪除該執行個體。

  • 刪除執行個體:

    & gcloud compute instances delete join-01 --quiet
    

建立及加入代管執行個體群組

您也可以確認 MIG 中的執行個體是否能自動加入網域。

  1. 傳遞會導致 VM 加入網域的 specialize 指令碼,藉此建立執行個體範本:

    共用虛擬私有雲

    $VpchostProjectId = (gcloud compute shared-vpc get-host-project $ProjectId --format=value`(name`))
    & gcloud compute instance-templates create ad-2019core-n1-std-2 `
        --image-family windows-2019-core `
        --image-project windows-cloud `
        --no-address `
        --machine-type n1-standard-2 `
        --subnet projects/$VpchostProjectId/regions/$Region/subnetworks/$Subnet `
        --metadata "sysprep-specialize-script-ps1=iex((New-Object System.Net.WebClient).DownloadString('$RegisterUrl'))"
    

    獨立 VPC

    & gcloud compute instance-templates create ad-2019core-n1-std-2 `
        --image-family windows-2019-core `
        --image-project windows-cloud `
        --no-address `
        --machine-type n1-standard-2 `
        --subnet projects/$ProjectId/regions/$Region/subnetworks/$Subnet `
        --metadata "sysprep-specialize-script-ps1=iex((New-Object System.Net.WebClient).DownloadString('$RegisterUrl'))"
    
  2. 建立使用執行個體範本的代管執行個體群組:

    & gcloud compute instance-groups managed create group-01 `
        --template ad-2019core-n1-std-2 `
        --size=3
    

等待幾分鐘,然後使用 Active Directory Users and Computers MMC 嵌入式管理單元,確認 Active Directory 中已建立四個新物件:

  • 3 個電腦帳戶,分別對應代管執行個體群組的 3 個 VM 執行個體。
  • 1 個名為 group-01 的群組,內含 3 個電腦帳戶。如果您打算使用群組代管服務帳戶 (gMSA),可以透過這個群組授予 gMSA 存取權。

確認 MIG 中的 VM 執行個體可以加入 Active Directory 網域後,請按照下列步驟刪除代管群組和執行個體範本:

  1. 在 Cloud Shell 中刪除執行個體群組:

    & gcloud compute instance-groups managed delete group-01 --quiet
    
  2. 刪除執行個體範本:

    & gcloud compute instance-templates delete ad-2019core-n1-std-2 --quiet
    

排定清除過時電腦帳戶的時間

自動將電腦加入網域的程序可減少設定新伺服器的工作量,並讓您在代管執行個體群組中使用已加入網域的伺服器。不過,網域中可能會累積過時的電腦帳戶。

為避免發生這種情況,建議您設定應用程式,定期掃描 Active Directory 網域,找出並自動移除過時的帳戶和相關聯的 DNS 記錄。register-computer

register-computer 應用程式可以使用電腦帳戶的 msDS-cloudExtensionAttribute 屬性,判斷哪些電腦帳戶過時。這些屬性包含 Compute Engine 中對應 VM 執行個體的專案、區域和執行個體名稱。應用程式可以檢查每個電腦帳戶對應的 VM 執行個體是否仍可使用。如果不是,電腦帳戶就會視為過時並移除。

如要觸發電腦帳戶清除作業,請叫用 Cloud Run 應用程式的 /cleanup 端點。為防止未經授權的使用者觸發清除作業,這項要求必須使用 register-computer-app 服務帳戶進行驗證。

設定 Cloud Scheduler

下列步驟說明如何搭配使用 Cloud SchedulerPub/Sub,每 24 小時自動觸發一次清除作業:

  1. 在 Cloud Shell 中,於網域專案啟用 Cloud Scheduler API:

    & gcloud services enable cloudscheduler.googleapis.com
    
  2. AppEngineLocation 設為有效的 App Engine 位置,以便部署 Cloud Scheduler:

    $AppEngineLocation = "location"
    

    location 替換為您為虛擬私有雲資源選取的 App Engine 區域,例如 us-central。如果該地區無法做為 App Engine 位置,請選擇您附近的地區。詳情請參閱地區和區域

  3. 初始化 App Engine:

    & gcloud app create --region $AppEngineLocation --project $DomainProjectId
    
  4. 建立 Cloud Scheduler 工作:

    & gcloud scheduler jobs create http cleanup-computer-accounts `
        --schedule "every 24 hours" `
        --uri "$RegisterUrl/cleanup" `
        --oidc-service-account-email register-computer-app@$DomainProjectId.iam.gserviceaccount.com `
        --oidc-token-audience "$RegisterUrl/" `
        --project $DomainProjectId
    

    這項工作每 24 小時會呼叫一次 register-computer 應用程式,並使用 register-computer-app 服務帳戶進行驗證。

觸發清理作業

如要驗證清除過時電腦帳戶的設定,可以手動觸發 Cloud Scheduler 工作。

  1. 前往 Google Cloud 控制台的 Cloud Scheduler。

    前往 Cloud Scheduler

  2. 針對您建立的 cleanup-computer-accounts 工作,按一下「立即執行」

    幾秒後,「結果」欄會顯示「成功」,表示清除作業已順利完成。如果結果欄位未在幾秒內自動更新,請按一下「重新整理」按鈕。

如要進一步瞭解已清除的帳戶,請查看應用程式的記錄。register-computer

  1. 前往 Google Cloud 控制台的 Cloud Run。

    前往 Cloud Run

  2. 按一下 register-computer 應用程式。

  3. 按一下選單中的「記錄」

    記錄檔項目指出,您用來測試加入網域的 VM 執行個體電腦帳戶已識別為過時並移除。

清除所用資源

如果您將本文做為其他參考架構和部署作業的基準,請參閱其他文件,瞭解何時應執行清除步驟。

如果您不想保留本文使用的 Google Cloud 設定,可以按照下列步驟還原設定:

  1. 在 Cloud Shell 中刪除 Cloud Scheduler 工作:

    & gcloud scheduler jobs delete cleanup-computer-accounts `
      --project $DomainProjectId
    
  2. 刪除 Cloud Run 應用程式:

    & gcloud run services delete register-computer `
      --platform managed `
      --project $DomainProjectId `
      --region $ServerlessRegion
    
  3. 刪除 Secret Manager 密鑰:

    gcloud secrets delete ad-password --project $DomainProjectId
    
  4. 刪除 LDAP 和 Kerberos 存取的防火牆規則:

    gcloud compute firewall-rules delete allow-adkrb-from-serverless-to-dc --project=vpc-project-id
    

    vpc-project-id 替換為定義 VPC 的專案 ID。如果您使用共用 VPC,請使用 VPC 主專案;否則請使用網域專案的 ID。

還原 Active Directory 變更

  1. 使用 RDP 用戶端登入可管理 Active Directory 網域的電腦。
  2. 在 Active Directory 使用者和電腦 MMC 嵌入式管理單元中,前往 OU。Projects
  3. 刪除 register-computer Active Directory 使用者帳戶。
  4. 刪除您為測試自動網域加入功能而建立的 OU。

後續步驟