2012-02-11 72 views
0

我有从HR一个CSV文件与aprox的1000行(雇员),我馈送到AD与Powershell的 - 通过线或另一种方式/功能处理线。 这有效,但如果我以正确的方式做这件事,我有点不确定。清洁AD从进口-CSV - 改进代码

这是我的主要问题:

  • 我设置在一个时间的因素之一。我应该把“变化”放入某种数组/可触及/对象中,并在脚本的最后一次完成所有操作?但是如何? “新对象”?
  • 我应该使用函数吗?但是,我怎么能返回值(并继续根据函数的结果)?

所有的编程提示,更正将不胜感激。我真的很了解这个知识渊博的人群,所以让我拥有它吧。如果你有时间,请告诉我,我怎么能做到这一点越好..

这是我的代码:

Add-PSSnapin Microsoft.Exchange.Management.PowerShell.Admin -ErrorAction silentlycontinue 
Add-PSSnapin quest.activeroles.admanagement -ErrorAction silentlycontinue 

$file = "\Scripts\employees.csv"  # Location of the input file 
$file2 = "\Scripts\employees2.csv"  # Temp file 
$logfile = "\Scripts\logfile.txt" # log file 
remove-item $logfile -Force -ErrorAction SilentlyContinue 

Get-Content $file | Out-File -Encoding UTF8 $file2       # Convert to UTF8 (we don't touch the original inputfile) 
$ListEmployees = Import-Csv $file2 -Delimiter ";"       # Import the file to CSV 

foreach ($ListEmployee in $ListEmployees) { 
$ListDisplayName = $ListEmployee.firstname + " " + $ListEmployee.lastname 

if($ADemployee = Get-QADUser -displayname $ListDisplayName -IncludedProperties employeeid) 
{ 
    ## CHECK NAME 
    if($($ADEmployee.displayname) -eq $($ListDisplayName)) 
    { 
     echo "MATCH: $($ADEmployee.displayname)" 
    } 

    ## CHECK COMPANY 
    if($($ADEmployee.company) -ne $($ListEmployee.company)) 
    { 
     echo "  CHANGE - Company: '$($ADEmployee.company)' to '$($ListEmployee.company)'" 
     Set-QADUser -identity $($ADEmployee.samaccountname) -Company $($ListEmployee.company) -WhatIf 
    } 
    else 
    { 
     echo "  OK  - Company  : no change '$($ListEmployee.company)'" 
    } 

    ## CHECK OFFICE 
    if($($ADEmployee.office) -ne $($ListEmployee.office)) 
    { 
     echo "  CHANGE - Office '$($ADEmployee.office)' to '$($ListEmployee.office)'" 
     Set-QADUser -identity $($ADEmployee.samaccountname) -Office $($ListEmployee.Office) -WhatIf 
    } 
    else 
    { 
     echo "  OK  - Office  : no change '$($ListEmployee.office)'" 
    } 

    ## CHECK MOBILE 
    if($listemployee.mobile -match '\S') 
    { 
     if($($ADEmployee.mobile) -ne $($ListEmployee.mobile)) 
     { 
      echo "  CHANGE - Mobile : '$($ADEmployee.mobile)' to '$($ListEmployee.mobile)'" 
      Set-QADUser -identity $($ADEmployee.samaccountname) -Mobile $($ListEmployee.mobile) -WhatIf 
     } 
     else 
     { 
      echo "  OK  - Mobile  : no change '$($ListEmployee.mobile)'" 
     } 
    } 

    ## CHECK EMPLOYEEID 
    if($($ADEmployee.employeeid) -ne $($ListEmployee.employeeid)) 
    { 
     echo "  CHANGE - EmployeeID: '$($ADEmployee.employeeid)' to '$($ListEmployee.employeeid)'" 
     Set-QADUser -identity $($ADEmployee.samaccountname) -ObjectAttributes @{employeeID = $($ListEmployee.employeeid)} -WhatIf 

    } 
    else 
    { 
     echo "  OK  - EmployeeID : no change '$($ListEmployee.employeeid)'" 
    } 
    $match++ 
} 
else 
{ 
    if($EXContact = Get-Contact $ListDisplayName -ErrorAction SilentlyContinue) 
    { 
     echo "MATCH CONTACT: $ListDisplayName (contact)" 

     ## CHECK MOBILE 
     if($listemployee.mobile -match '\S') 
     { 
      if($($EXContact.Mobilephone) -ne $($ListEmployee.mobile)) 
      { 
       echo "  CHANGE - Mobile : '$($EXContact.Mobilephone)' to '$($ListEmployee.mobile)'" 
      } 
      else 
      { 
       echo "  OK  - Mobile ; No change ($($ListEmployee.mobile))" 
      } 
     } 

     ## CHECK COMPANY 
     if($($EXContact.company) -ne $($ListEmployee.company)) 
     { 
      echo "  CHANGE - Company: '$($EXContact.company)' to '$($ListEmployee.company)'" 
     } 
     else 
     { 
      echo "  OK  - Company : No change($($ListEmployee.company))" 
     } 

     ## CHECK OFFICE 
     if($($EXContact.office) -ne $($ListEmployee.office)) 
     { 
      echo "  CHANGE - Office '$($EXContact.office)' to '$($ListEmployee.office)'" 
     } 
     else 
     { 
      echo "  OK  - Office : No Change($($ListEmployee.office))" 
     }  
     $contactmatch++ 
    } 
    else 
    { 
     echo "$ListDisplayName" | Out-File $logfile -Append 
     echo "NO MATCH: $ListDisplayName" 
     $nomatch++ 
    } 
} 
$i++ 
} 
echo " " 
echo "List contains $i accounts" 
echo "Accounts: $match matches" 
echo "Contacts: $contactmatch" 
echo "No Match: $nomatch" 

;及如果你认为这是cr * p,告诉我!我宁愿听你讲,也不愿意保持沉默,只是为了礼貌!我是“相当”的新本,所以我应得的:)

+1

提示 - 你使用的子表达太多。只有在某些情况下需要语法'$(expression)',例如当您试图使用双引号字符串'“$($ variable.property)”'访问变量属性时。如果您只是访问属性,则不需要使用它,例如,您可以执行$ ADEmployee.office -eq $ ListEmployee.office。 – 2012-02-11 00:24:24

+0

非常感谢Andy!我全面使用它的原因是,当我回显输出时,我似乎不能直接使用它。这是否是一个正确的假设? – Sune 2012-02-11 00:39:38

+1

这将输出办公室属性'Write-Host $ ADEmployee.Office'的值。但是,如果您想添加文本,一种方法是使用子表达式“Write-Host”Office:$($ ADEmployee.Office)“'或者可以使用字符串格式化Write-Host(”Office:{0 }“-f $ ADEmployee.Office)'。但是,如果你没有访问属性,你可以这样做:'Write-Host'Office:$ ADEmployee'',PowerShell将在对象上调用'ToString'方法,该方法可能会或可能不会返回所需的数据。 – 2012-02-11 00:47:09

回答

1

这里是我的意见:

1)我真的觉得现在的问题@mjolinor点是重要的,你会遇到的麻烦(我的意思是需要人工检查),如果你不使用身份属性之一由Microsoft修复(samAccountName,userPrincipalName或更好的objectGuid,objectSid ...)作为在Active Directory中查找用户的关键。

如果这是不可能的,也许可以在多个属性的顶部创建过滤器。如果您的CSV来自另一个LDAP目录,您可能可以将其唯一标识集成到您的Schema中(在这种情况下,请参阅Active Services的Microsoft Services for UNIX 3.5(MSFU3.5)架构扩展)。

2)一旦你发现在你的活动目录的CSV条目之一,检查每个属性,然后替换“一一”在您的广告与一个在您的CSV的人。

这里我的建议将是检查所有的CSV和AD条目之间的differencies,并做出了独特的变化到目录中。实际上,就一个区别而言,我会用一个命令来改变它们。我不知道如何编写Set-QADUser,但是在底层,所有的属性替换可以做成一次性的(LDAP_REPLACE,或者在单个ADSI提交中)

3)只是说一句:开始PowerShell V2 ,W2K8)Active-Directory模块由Microsoft提供。

+1

在一个完美的世界中,每个员工都需要合法更改姓名以匹配他们的域名SID作为就业条件,但是您不打算这样做。人力资源和会计部门负责人员姓名和内部分配的员工编号,并且不太可能让他们更改为使用AD标识引用。如果您可以让他们在添加/更改/删除请求上使用名字,姓氏和员工ID,那么这些信息应该足够了。如果可以输入所有这三个错误,那么他们可能会输入错误的SID或GUID。 – mjolinor 2012-02-13 11:36:23

+0

我为什么建议在AD中寻找用户的过滤器。 – JPBlanc 2012-02-13 13:56:02

+0

在其他答案的评论中提出了同样的问题。 – mjolinor 2012-02-13 14:00:53

2

一些关于整个事情是使用显示名称作为您的身份参考这似乎很奇怪。作为身份参考,它在AD中既不稳定又可能含糊,并且似乎是用于驱动维护脚本的糟糕选择。

+1

同意。需要的是为雇员提供有保证的唯一标识符,因此脚本不会更新错误的帐户。 – 2012-02-11 01:25:01

+0

我知道,所以我的想法是,我在严格和人工监督下添加“employeeID”,然后在“employeeID”之​​后添加所有添加项。听起来更好? – Sune 2012-02-11 01:31:11

+1

这样比较好,但AD不保证它是唯一的。在添加新帐户时,您需要先验证employeeid是否尚未分配,然后才能将其分配给新帐户。 – mjolinor 2012-02-11 06:37:11