如何生成AD帐户配置文件中所有更改的报告

时间:2013-10-15 16:06:14

标签: c# .net active-directory

如何生成AD中自特定日期以来已更新的所有用户帐户的列表(可能是电子表格)?

我想在C#中这样做,但任何.net方法都可以接受。

以下是上下文:我在sharepoint门户中使用一个组件,允许用户自己更新其AD配置文件。但是,我还需要更新我的邮件列表,因此我需要知道他们何时更新他们的电子邮件地址。因此,我需要获取更改。

1 个答案:

答案 0 :(得分:1)

AD在高级查询方面很慢。我想从AD中提取完整的用户列表然后在邮件列表中搜索更改可能会更便宜,假设您在数据库中有这些更改。完整的用户名列表及其电子邮件应该相当快速生成(当然,取决于用户数量)。

编辑:一个简单的助手Powershell脚本,可以快速从AD中获取用户

# Get the RootDSE
$rootDSE=[ADSI]"LDAP://RootDSE"

# Get the defaultNamingContext
$Ldap="LDAP://"+$rootDSE.defaultNamingContext

# Create the output file
$outFile=".\users\userList_{0:yyyyMMdd-HHmm}.csv" -f (Get-Date)

# Get all users 
$filter="(&(ObjectClass=user))"

# create the Header for the Output File
$header="name;userPrincipalName;mail"
$timeStamp=

# Check if the file exists and if it does with the same timestamp remove it
if(Test-Path $outFile)
{
  Remove-Item $outFile
}

# create the output file and write the header
Out-File -InputObject $header -FilePath $outFile

# main routine
function GetUserListToFile()
{
  # create a adsisearcher with the filter
  $searcher=[adsisearcher]$Filter

  # setup the searcher properties
  $Ldap = $Ldap.replace("LDAP://","")
  $searcher.SearchRoot="LDAP://$Ldap"
  $searcher.propertiesToLoad.Add("name")
  $searcher.propertiesToLoad.Add("userPrincipalName")
  $searcher.propertiesToLoad.Add("mail")

  $searcher.pageSize=1000

  # find all objects matching the filter
  $results=$searcher.FindAll()

  # create an empty array
  $ADObjects = @()
  foreach($result in $results)
  {
    # work through the array and build a custom PS Object
    [Array]$propertiesList = $result.Properties.PropertyNames
    $obj = New-Object PSObject
    foreach(property in $propertiesList)
    { 
       $obj | add-member -membertype noteproperty -name $property -value ([string]$result.Properties.Item($property))
    }
    # add the object to the array
    $ADObjects += $obj

    # build the output line
    $lineOut=$obj.Name+";"+ $obj.UserPrincipalName+";"+ $obj.mail

    # Write the line to the output file
    Out-File -Append -InputObject $lineOut -FilePath $outFile
  }

  Return $ADObjects
}

# main routine
GetUserListToFile