用于查询Active Directory的Powershell脚本

时间:2019-03-13 21:07:04

标签: powershell active-directory

我正在尝试查询多个具有相同名称的OU中的所有用户。获取SamAccountName属性,然后在该位置的特定位置检查文件。

这是我到目前为止所拥有的:

$ous = Get-ADOrganizationalUnit -Filter "Name -eq 'Admin-User-Accounts'" 
$ous | ForEach-Object {
    $AccountName = Get-ADUser -Filter * -SearchBase $_.DistinguishedName |
                   Select SamAccountName
    Test-Path "\\domain.net\SYSVOL\domain.net\IA\$AccountName.pdf"
}

如果找不到文件。我想将用户添加到组中,但是这里是踢人。该帐户必须添加到该帐户所属组织的违规组中。

即在以下位置找到一个管理员帐户:

OU=Admin-User-Accounts,OU=Administration,OU=ORG1,OU=ORGS,DC=domain,DC=net

将被添加到位于以下位置的名为“ ORG1 IA-不合规用户”的组中:

OU=Groups,OU=ORG1,OU=Information Assurance,OU=ORGS,DC=domain,DC=net

3 个答案:

答案 0 :(得分:0)

好吧,您的帖子有点令人困惑,也无法真正验证,因为我没有这样的设置。

但是,在所有OU或企业中查询用户是日常的日常工作。

但是,OU名称必须与其他AD对象名称一样唯一。因此,在单个AD林/域中查询相同的OU名称不是一件容易的事。如果要在每个OU中查询相同的用户名,则可以。

通过逐步解释您已经布置的用例。

(尽管也许您想编辑您的帖子以使其更清晰,无论如何对我来说...)

使用伪代码,然后尝试将其映射出来……而没有真正的方法来确定帖子/样本中几件事的意思。因此,下面是我将如何实现此目标的一个粗略的第一个示例...再次,这是未经测试的,因此,我将这份作业留给了您。

acc:xxx

答案 1 :(得分:0)

似乎其中一个变量不正确,因为PowerShell为我提供了以下内容:

Get-ADPrincipalGroupMembership:无法验证参数'Identity'上的参数。参数为null或为空。提供一个不为null或为空的参数,然后尝试命令 再次。

好的,这是到目前为止,根据您在Postanote上方的帖子,我所拥有的:

# query all users in multiple OUs
(Get-ADOrganizationalUnit -Filter "Name -eq 'Admin-User-Accounts'") |
ForEach{
    # Collect all members of the current OU
    $AccountNames = Get-ADUser -SearchBase $PSItem -Filter *

    # Process each member in the current OU collection
    ForEach($AccountName in $AccountNames)
    {
        "Processing $($AccountName.SamAccoutnName)`n"

        # Initialize properties needed for processing
        $UserOrg = $AccountName.DistinguishedName.split(",")[1]
        $MemberCheckOU = "OU=Admin-User-Accounts,OU=Administration,OU=$UserOrg,OU=ORGS,DC=domain,DC=net"
        $NonCompliantOU = "OU=Groups,OU=$UserOrg,OU=Information Assurance,OU=ORGS,DC=domain,DC=net"

        # Validate user file existence for the current user
        If(-Not (Test-Path -LiteralPath "\\domain.net\SYSVOL\domain.net\IA\$($AccountName.SamAccoutnName).pdf)"))
        {
            # if no file Process the user groupmebership modification
            "Processing $($AccountName.SamAccoutnName)"

            # Notify that the file was not found and processing is required
            Write-Warning -Message "$($($AccountName.SamAccoutnName).pdf) not found. Process group modify actions"       

            # If the current user is in the MemberCheckOU, add to the NonCompliantOU
            If(Get-ADPrincipalGroupMembership -Identity $($AccountName.SamAccoutnName) | Where-Object -Property DistinguishedName -Match $MemberCheckOU )
            { Add-ADGroupMember -Identity "$UserOrg IA - Non-Compliant Users" -Members $($AccountName.SamAccoutnName) }
            Else
            {
                # Do something else
            }
        }
        Else
        { 
          # Notify that the file was found and no processing required
          Write-Host "$($AccountName.pdf) found. No further actions taken" -ForegroundColor Green }
    }
}

答案 2 :(得分:0)

查看原始脚本片段:

$ous = Get-ADOrganizationalUnit -Filter "Name -eq 'Admin-User-Accounts'" 
$ous | ForEach-Object {
    $AccountName = Get-ADUser -Filter * -SearchBase $_.DistinguishedName |
                   Select SamAccountName   # note 1
    Test-Path "\\domain.net\SYSVOL\domain.net\IA\$AccountName.pdf"   # note 2
}

注1:您最终将以$ accountname.accountname保留您的值。我认为您将想扩大它。 注意2:Powershell可能会感到困惑,并认为您正在寻找变量$ accountname.pdf

相反,请尝试...

$ous = Get-ADOrganizationalUnit -Filter "Name -eq 'Admin-User-Accounts'" 
$ous | ForEach-Object {
    $AccountName = $(Get-ADUser -Filter * -SearchBase $_.DistinguishedName).SamAccountName 
    Test-Path "\\domain.net\SYSVOL\domain.net\IA\$($AccountName).pdf"   
}

在这里,我们只将查询的 .SamAccountName 的值保存到$ AccountName中,然后通过添加$($ accountname)来清除所需的变量,而.pdf不是变量名的一部分。

现在,还要注意,这不会将结果保存在任何地方,只会将其刷新到屏幕上。