0

所以我有一个基本脚本可以在值被硬编码时工作。当文件中的值是动态的时,我需要一些帮助才能使其工作:

这是基本脚本:

 set-ADUser -Identity test.hsi -replace @{extensionAttribute4="LoadedFromInterface";extensionAttribute5="2";extensionAttribute6="2"} -Manager jim.james

我想要做的是使用 Import-CSV 从文件中读取,将重要的列加载到变量中,检查空/空条件,然后重新设置变量是否为空。最终执行与上述相同的操作,但使用从文件中加载的变量。extensionAttribute5 和 extensionAttribute6 都将是来自文件的值(有时为 null),并且 manager 也将是从文件分配的变量。

Import-CSV C:\Users\user1\Documents\WTKtoAD\WTKtoAD.csv | %{$SAM = $_.SamAccountName;If ($_.PhoneTypeMobile -eq $Null) {$PhoneMobile = "NotProvided"} Else {$PhoneMobile = $_.PhoneTypeMobile};If ($_.PhoneTypeHome -eq $Null) {$PhoneHome = "NotProvided"} Else {$PhoneHome = $_.PhoneTypeHome}} | set-ADUser -Identity $SAM -Add @{extensionAttribute4="LoadedFromKronos";extensionAttribute5=$PhoneHome;extensionAttribute6=$PhoneMobile} -Manager $_.Manager

当我运行脚本时,我在 Powershell ISE (x86) 'Run As Admnistrator' 中收到以下错误。

PS C:\Users\user1>     Import-CSV C:\Users\user1\Documents\WTKtoAD\WTKtoAD.csv | %{$SAM = $_.SamAccountName;If ($_.PhoneTypeMobile -eq $Null) {$PhoneMobile = "NotProvided"} Else {$PhoneMobile = $_.PhoneTypeMobile};If ($_.PhoneTypeHome -eq $Null) {$PhoneHome = "NotProvided"} Else {$PhoneHome = $_.PhoneTypeHome}} | set-ADUser -Identity $SAM -Add @{extensionAttribute4="LoadedFromKronos";extensionAttribute5=$PhoneHome;extensionAttribute6=$PhoneMobile} -Manager $_.Manager
Set-ADUser : Cannot validate argument on parameter 'Identity'. The argument is null. Provide a valid value for the argument, and then try running the command again.
At line:1 char:318
+ ... User -Identity $SAM -Add @{extensionAttribute4="LoadedFromKronos";extensionAttri ...
+                    ~~~~
    + CategoryInfo          : InvalidData: (:) [Set-ADUser], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.ActiveDirectory.Management.Commands.SetADUser

该文件如下所示:

> SamAccountName,PhoneTypeMobile,PhoneTypeHome,Manager
> test.hsi,333-234-3433,'',bob.henst
4

1 回答 1

0

错误的原因是因为你把它Set-ADUser放在了错误的地方(在 ForEach-Object 之后)。

您很难从代码中分辨出来,因为您将所有内容都放在同一行,这使得阅读变得非常困难。我的建议是给它一些空气。这样一来,错误就更容易被发现。

至于代码。我没有测试,因为我现在没有可用的 AD,但我认为这会更好:

# this is the content of the WTKtoAD.csv file

# SamAccountName,PhoneTypeMobile,PhoneTypeHome,Manager
# test.hsi,333-234-3433,'',bob.henst

Import-CSV C:\Users\user1\Documents\WTKtoAD\WTKtoAD.csv | 
    ForEach-Object { 
        $SAM = $_.SamAccountName
        if ([string]::IsNullOrEmpty($_.PhoneTypeMobile)) { $PhoneMobile = "NotProvided" } else { $PhoneMobile = $_.PhoneTypeMobile }
        if ([string]::IsNullOrEmpty($_.PhoneTypeHome))   { $PhoneHome = "NotProvided" } else { $PhoneHome = $_.PhoneTypeHome }
        if ([string]::IsNullOrEmpty($_.Manager))         { $Manager = $null } else { $Manager = $_.Manager }

        $props = @{
            extensionAttribute4 = "LoadedFromKronos"
            extensionAttribute5 = $PhoneHome
            extensionAttribute6 = $PhoneMobile
        }
        Set-ADUser -Identity $SAM -Replace $props -Manager $Manager
    } 

如您所见,我还对Manager. 如果在 CSV 中这是一个空字符串,它现在将为用户清除manager 属性。

于 2018-08-16T08:24:38.377 回答