You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将文本文件的OU值传入Invoke-VMScript命令在DC中创建AD组织单元?

问题根因
  • 本地读取的OU结构变量直接嵌入待传入虚拟机的脚本字符串时,PowerShell本地解析会自动将数组展开为纯文本,传到虚拟机后无法正常遍历
  • 原始脚本中OU路径使用/分隔,但代码里用Split('\')按反斜杠切割,路径匹配完全错误
  • 手动拼接多行脚本需要处理大量转义字符和换行,非常容易出现语法错误
修正后的完整代码
# 本地读取OU结构文件
$OUStructure = Get-Content "C:\Users\admr_mornevr\Documents\PowerShell\OdekSpace\Active Directory\OUs\OdekOUStructure.txt"
# 把OU数组序列化为JSON字符串,避免嵌入脚本时解析异常
$OUsJson = $OUStructure | ConvertTo-Json

# 用Here-String定义待传入虚拟机的脚本,自动保留换行无需手动处理转义
$CreateOUs = @"
`$MyDomain = Get-ADDomain | Select-Object -ExpandProperty DistinguishedName
`$OUStructure = $OUsJson | ConvertFrom-Json

`$OUStructure | ForEach-Object {
    # 按正斜杠切割OU路径
    `$ouParts = `$_ -split '/'
    `$currentPath = `$MyDomain
    # 层级创建OU,自动处理父OU依赖
    foreach (`$part in `$ouParts) {
        # 先判断OU是否存在,避免重复创建报错
        if (-not (Get-ADOrganizationalUnit -Filter "Name -eq '$`part'" -SearchBase `$currentPath -SearchScope OneLevel -ErrorAction SilentlyContinue)) {
            New-ADOrganizationalUnit -Name `$part -Path `$currentPath
        }
        `$currentPath = "OU=`$part,`$currentPath"
    }
}
"@

# 执行脚本
Invoke-VMScript -ScriptType PowerShell -ScriptText $CreateOUs -VM $DCName -GuestCredentials $DomainCredential
关键修改说明
  • 通过JSON序列化/反序列化传递本地OU列表,彻底解决跨环境变量传递问题
  • 双引号Here-String自动保留换行格式,不需要手动处理转义字符和换行符
  • 层级遍历创建OU,自动解决父OU未提前创建的报错问题
  • 增加OU存在性校验,重复执行脚本不会抛出冲突错误
  • 直接使用AD模块原生命令,比ADSI写法更简洁、容错性更高

如果你要继续使用CSV方案,只需要把上述代码中读取TXT的逻辑替换为Import-Csv,再将读取到的CSV对象按同样的JSON序列化方式传入虚拟机即可,不要直接把本地的$OUs变量嵌入脚本字符串。

内容的提问来源于stack exchange,提问作者Morne van Rensburg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 04:15:08