PowerShell遍历目录读取SSH公钥生成CSV导入AD问题咨询
解决方案
以下是同时满足两个需求的完整可运行PowerShell脚本,以及对应逻辑说明:
完整实现脚本
# 定义SSH公钥根存储目录 $sshRootPath = "C:\SSH" # 定义最终输出的CSV文件路径 $outputCsvPath = "C:\Script\SSH Keys\users.csv" # 遍历处理所有公钥文件 $userSshMapping = Get-ChildItem -Path $sshRootPath -Filter "*.pub" -Recurse -File | ForEach-Object { # 提取公钥所在上层目录名作为SamAccountName $account = $_.Directory.Name # 读取公钥完整内容,去除首尾多余换行、空格 $publicKey = (Get-Content -Path $_.FullName -Raw).Trim() # 构造符合CSV字段要求的对象 [PSCustomObject]@{ SamAccountName = $account altSecurityIdentities = $publicKey } } # 导出为标准格式CSV $userSshMapping | Export-Csv -Path $outputCsvPath -NoTypeInformation -Encoding UTF8
对应问题逻辑说明
1. 批量遍历读取所有子目录.pub文件实现
- 核心调用
Get-ChildItem命令完成递归检索:-Filter "*.pub"限定只匹配公钥后缀的文件-Recurse开启根目录下所有层级子目录的自动遍历-File过滤掉目录对象,只返回文件结果
- 读取公钥时添加
-Raw参数一次性读取完整文件内容,避免逐行读取导致的公钥格式断裂,搭配.Trim()方法去除首尾冗余的换行、空白字符。
2. 自动生成符合要求的CSV文件实现
- 每个公钥文件的上层目录名通过
$_.Directory.Name直接获取,直接作为SamAccountName字段值 - 构造
PSCustomObject对象时的属性名和要求的CSV列名完全对应,无需额外转换 - 调用
Export-Csv导出时:-NoTypeInformation参数去掉PowerShell默认生成的类型说明头行,保证CSV格式和你现有AD写入脚本的要求完全匹配-Encoding UTF8避免账号名或公钥含特殊字符时出现乱码
注意:如果单个用户目录下存在多个.pub文件,脚本会生成多条同账号的记录,可根据实际需求添加去重或多公钥合并逻辑。
生成的CSV文件可直接对接你现有写入AD属性的脚本,无需额外调整格式。
内容的提问来源于stack exchange,提问作者joni
相关产品推荐
相关产品推荐

