.net Active Directory Powershell脚本仅在Excel中打开源csv后才能工作

.net Active Directory Powershell脚本仅在Excel中打开源csv后才能工作,.net,excel,powershell,csv,active-directory,.net,Excel,Powershell,Csv,Active Directory,我正在尝试使用PowerShell脚本更新Active Directory。我有一个从.NET控制台应用程序生成的CSV文件,在.txt中查看它时看起来非常好,并且在Excel中打开时没有问题 问题 当我运行下面的PowerShell脚本时,广告会得到更新,看起来与我预期的一样,但是用户无法匹配他们的帐户。我尝试了不同的分隔符,并将编码更改为显式UTF-8和ANSI,但没有成功,而且由于我不熟悉PowerShell和ActiveDirectory,我不确定还可以尝试什么 奇怪的线索 如果我首先从

我正在尝试使用PowerShell脚本更新Active Directory。我有一个从.NET控制台应用程序生成的CSV文件,在.txt中查看它时看起来非常好,并且在Excel中打开时没有问题

问题

当我运行下面的PowerShell脚本时,广告会得到更新,看起来与我预期的一样,但是用户无法匹配他们的帐户。我尝试了不同的分隔符,并将编码更改为显式UTF-8和ANSI,但没有成功,而且由于我不熟悉PowerShell和ActiveDirectory,我不确定还可以尝试什么

奇怪的线索

如果我首先从Excel中的console应用程序打开.csv文件并立即保存它,则更新脚本可以工作,用户可以匹配他们的帐户。我以为这是编码,但似乎不是。我已经区分了excel之前和之后的文件,它们是相同的

CSV数据示例:

last_name,first_name,altSecurityIdentities,userPrincipalName
DOE,JOHN,"x,y,z=y,<S>,0000000",jdoe@gmail.com
PowerShell脚本是:

[CmdletBinding()]
Param(
 [Parameter(Mandatory=$True,Position=1)]
 [string]$FilePath
)
$LogDate = get-date -f yyyyMMddhhmm
import-module ActiveDirectory
$names = import-csv $FilePath

foreach($name in $names){

try{
    $regularuser = get-aduser ($name.userPrincipalName -split "@")[0]
    $regularuser | Set-ADUser -UserPrincipalName $name.userPrincipalName -Replace @{'altSecurityIdentities'=$name.altSecurityIdentities}
    $name.userPrincipalName + $name.altSecurityIdentities + " account updated" >> "regular_accounts-$logDate.txt"
    try{
        $adminname = "_"+(($name.userPrincipalName -split "@")[0])
        $adminuser = get-aduser $adminname
        $adminuser | Set-ADUser -Replace @{'altSecurityIdentities'=$name.altSecurityIdentities}
        "_"+(($name.userPrincipalName -split "@")[0]) + $name.altSecurityIdentities + " admin account updated" >> "admin_accounts-$logDate.txt"
    }
    catch{
        "_"+(($name.userPrincipalName -split "@")[0])+" admin account not found" >> "admin_accounts-$logDate.txt"
        "__"+(($name.userPrincipalName -split "@")[0])+" admin account not found" >> "admin__accounts-$logDate.txt"
         }
    }
catch{
    $name.userPrincipalName + " account not found" >> "regular_accounts-$logDate.txt"
     }
}
编辑-“解决方案”


我不确定这一点的原因,但编辑PowerShell行:

$names = import-csv $FilePath
$names = import-csv $FilePath
…并将其更改为:

$names = import-csv $FilePath | ConvertFrom-Csv
$names = import-csv $FilePath | ConvertFrom-Csv

…修复了ActiveDirectory与输入之间的任何问题。一切看起来都一样,但是与用户匹配的登录工具现在可以正常工作。

以下代码片段可以帮助您识别运行每个进程的用户:

 $owners = @{}
 gwmi win32_process |% {$owners[$_.handle] = $_.getowner().user}

 get-process | select processname,Id,@{l="Owner";e={$owners[$_.id.tostring()]}}
我怀疑CSV创建过程(用户)与第二个不同,不幸的是目前无法测试


祝你好运

我现在不确定为什么,但编辑PowerShell行:

$names = import-csv $FilePath
$names = import-csv $FilePath
…并将其更改为:

$names = import-csv $FilePath | ConvertFrom-Csv
$names = import-csv $FilePath | ConvertFrom-Csv

…修复了ActiveDirectory与输入之间的任何问题。一切看起来都一样,但与用户匹配的登录工具现在运行良好。

乍一看,我发现您没有创建有效的CSV。字段
altSecurityIdentities
包含一个字符串,该字符串的值中包含分隔符。它应该被引用。注意:在代码中,如果
分隔符
甚至有一个值,您没有向我们显示。同样,您没有创建有效的CSV。。这一次,当您打算在以后的代码中使用它们时,您没有在其中写入正确的标题(
$name.userPrincipalName
$name.userPrincipalName
等)。您的CSV中的标题是
col1
col2
等。对不起,我在.NET部分使用了伪代码,但我现在对其进行了编辑,以准确反映正在发生的情况。NET程序输出上面显示的CSV示例,该示例看起来有效,在Excel中打开时看起来很好,并且使用正确的字段更新ActiveDirectory。