PowerShell的批量更新的Active Directory管理领域

问题描述:

我想更新我们的活动目录我们的管理领域,有一个脚本 输入文件看起来像这样PowerShell的批量更新的Active Directory管理领域

Firstname.LastnameEmployee;firstname.lastnameManager 

这里是我使用的脚本。 .. 这是我得到的错误

您无法在空值表达式上调用方法。 At line:26 char:5 + $ ObjSearchemployee.Filter =“(&(objectCategory = person)(objectClass = user)(sAM ... + ~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~ + CategoryInfo:InvalidOperation:(:) [],的RuntimeException + FullyQualifiedErrorId:InvokeMethodOnNull

不能调用上一个空值表达的方法 在线:31 char:9 + $ ObjSearchmanager.Filter =“(&(objectCategory = person)(objectClass = user)(... + ~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~ + CategoryInfo:InvalidOperation:(:) [],RuntimeException的 + FullyQualifiedErrorId:InvokeMethodOnNull

############################################################### 
# Update_Manager_v1.0.ps1 
# input : n/a 
# output : none (logs) 
# Version 1. 
# Changelog : n/a 
# MALEK Ahmed - 02/06/2013 
################### 

################## 
#--------Config 
################## 
$adPath="LDAP://DC=local,DC=com" 


################## 
#--------Main 
################## 
#LDAP connection 
$objDomain=New-Object System.DirectoryServices.DirectoryEntry($adPath) 
#Doing an LDAP search 
$ObjSearchemployee=New-Object System.DirectoryServices.DirectorySearcher($ObjDomain) 
$ObjSearchmanager=New-Object System.DirectoryServices.DirectorySearcher($ObjDomain) 
#Operations on user accounts 
Import-Csv .\input.csv -Delimiter ';' | Foreach-Object { 
    $ObjSearchemployee.Filter = "(&(objectCategory=person)(objectClass=user)(sAMAccountName="+ $_.employee.trim() +"))" 
    $allSearchResultemployee = $ObjSearchemployee.FindAll() 
    foreach ($objSearchResultemployee in $allSearchResultemployee) 
    { 
     $objUseremployee=New-Object System.DirectoryServices.DirectoryEntry($objSearchResultemployee.Path) 

     $ObjSearchmanager.Filter = "(&(objectCategory=person)(objectClass=user)(sAMAccountName="+ $_.manager.trim() +"))" 
     $allSearchResultmanager = $ObjSearchmanager.FindAll() 
     foreach ($objSearchResultmanager in $allSearchResultmanager) 
     { 
      $objUsermanager=New-Object System.DirectoryServices.DirectoryEntry($objSearchResultmanager.Path) 
      $objUseremployee.manager = $objUsermanager.distinguishedname 
     } 
     $objUseremployee.CommitChanges() 
     "" + $objUsermanager.displayName + " is now the manager of " + $objUseremployee.displayName + "" 
    } 
} 
+0

你没有一个叫员工在你的源文件头。这就是你遇到错误的原因。 – Matt

$.Employee.trim()是问题,因为你没有 “雇员” 的列标题,按您的源例子。见You cannot call a method on a null-valued expression

假设您的第一列是samaccountname,那么您应该将其更改为$_.Firstname.LastnameEmployee.trim(),否则您需要重新定义搜索的完成方式或更新源文件以包含相关信息并使您的代码匹配。

由于错误意味着你将有同样的问题与$_.Manager.trim()