0

誰かが助けてくれることを願っています。残念ながら私はPowershellの専門家ではありません

これは私が欲しいものです:

ユーザー名の最初の文字に基づいて、特定の OU 内の AD 内のユーザーを検索します。それらが AD グループのメンバーであるかどうかを検証し、そうでない場合は検証します。ユーザーの特定のプロファイル ファイルをいくつか削除し、その特定のグループにユーザーを追加します。

私が試したコードの一部:

Import-Module ActiveDirectory

# OUs needed to be searched for users
$OU1 = 'name of first OU'
$OU2 = 'name of 2nd OU'
$OU3 = 'name of 3rd OU'

# AD group where users needs to be added
$Group = 'name of group'

# Ask for 1st letter of username
$usernameletter = Read-Host -Prompt 'First letter(s) username'

# Create an array with corresponding users
$userslist= @()

$users1 = Get-ADUser -Filter "SamAccountName -like '$usernameletter*'" -SearchBase $OU1 | select -ExpandProperty samAccountName
$users2 = Get-ADUser -Filter "SamAccountName -like '$usernameletter*'" -SearchBase $OU2 | select -ExpandProperty samAccountName
$users3 = Get-ADUser -Filter "SamAccountName -like '$usernameletter*'" -SearchBase $OU3 | select -ExpandProperty samAccountName


$userslist += $users1,$users2,$users3


# check membership of group
$members = Get-ADGroupMember -Identity $Group -Recursive | Select -ExpandProperty sAMAccountName


# Delete userpref files of user when user is not member of the -name of group-

foreach ($user in $userslist)
{
If ($members -contains $user)
{
Write-host "$user exists in group, so userpref files won't be deleted"
} 
    Else 
    {

#if users doesn't exist in AD Group - delete userpref files of user
Write-host "$user doesn't exist in group, deleting userpref files of user"

Remove-Item -Path E:\users\$user\pwrmenu\UserPref\{F5BE2CE1-BF67-44E2-B5B3-5E081344A70E}* -Force
}
}



# check if user is part of the group. if not, add it to the group

foreach ($user in $userslist)
{
If ($members -contains $user)
{
Write-host "$user exists in group, so user won't be added to group $group"
} 
    Else 
    {

#if users doesn't exist in AD Group - add them to AD Group
Write-host "$user doesn't exist in group, adding user to group $group"
Add-ADGroupMember $Group -Members $userslist
}
}

#end of script

何らかの理由で $userslist 配列が埋められますが、$userslist の foreach ループ $user が機能せず、$user が埋められず、次のようなエラーが発生します

Remove-Item : 存在しないため、パス 'E:\users\pwrmenu\UserPref' が見つかりません。Add-ADGroupMember : パラメータ 'Members' の引数を検証できません。引数が null、空、または引数コレクションの要素に null 値が含まれています。

誰かが私を助けてくれることを願っています! ありがとう!

編集 @Andrew Ryan Davis、

申し訳ありませんが、このウェブサイトにはまだあまり慣れていません

$userslist の内容:

PS C:\Users\serverw> $userslist

WGoossensTest

wgoossenstest2

$members の内容:

PS C:\Users\serverw> $members

ユーザー名1

ユーザー名2

ユーザー名3

4

1 に答える 1

1

ユーザーに何も入力されない理由がわかりません。重複したコードがかなりあり、最適化の機会がいくつかあります。ユーザーを samaccountname プロパティを持つオブジェクトとして保持する場合、スクリプトブロックを呼び出さないことで where 句を高速化できます。

$userslist | where samaccountname -notin $members

また

$userslist | where $members -notcontains samaccountname

また、グループ メンバーのリストに対して各ユーザーを 2 回チェックします。以下の最適化されたバージョンをチェックしてください。

Import-Module ActiveDirectory

# OUs needed to be searched for users
$OUs = 'name of first OU','name of 2nd OU','name of 3rd OU' 

# AD group where users needs to be added
$Group = 'name of group'

# Ask for 1st letter of username
$usernameletter = Read-Host -Prompt 'First letter(s) username'

# Create an array with corresponding users
$userslist = $ous | foreach {
    Get-ADUser -Filter "SamAccountName -like '$usernameletter*'" -SearchBase $_ | select samaccountname
}

# Get member list of group
$members = Get-ADGroupMember -Identity $Group -Recursive | Select -ExpandProperty sAMAccountName

# Delete userpref files of user when user is not member of the -name of group- and then add to the group
foreach($user in $userslist | where samaccountname -notin $members | select -ExpandProperty sAMAccountName)
{
    Write-host "$user doesn't exist in group, deleting userpref files of user"
    Remove-Item -Path E:\users\$user\pwrmenu\UserPref\{F5BE2CE1-BF67-44E2-B5B3-5E081344A70E}* -WhatIf
    Write-host "$user doesn't exist in group, adding user to group $group"
    Add-ADGroupMember $Group -Members $user -whatif
}

#end of script

これは、グループ内のユーザーのフィードバックを提供しません。本当にそれを確認したい場合は、それらを分割して、それぞれを個別に実行できます。

Import-Module ActiveDirectory

# OUs needed to be searched for users
$OUs = 'name of first OU','name of 2nd OU','name of 3rd OU' 

# AD group where users needs to be added
$Group = 'name of group'

# Ask for 1st letter of username
$usernameletter = Read-Host -Prompt 'First letter(s) username'

# Create an array with corresponding users
$userslist = $ous | foreach {
    Get-ADUser -Filter "SamAccountName -like '$usernameletter*'" -SearchBase $_ | select samaccountname
}

# Get member list of group
$members = Get-ADGroupMember -Identity $Group -Recursive | Select -ExpandProperty sAMAccountName

$notmembersof,$membersof = $userslist.where({$_.samaccountname -notin $members},'split')

# Delete userpref files of user when user is not member of the -name of group- and then add to the group
foreach($user in $notmembersof.sAMAccountName)
{
    Write-host "$user doesn't exist in group, deleting userpref files of user"
    Remove-Item -Path E:\users\$user\pwrmenu\UserPref\{F5BE2CE1-BF67-44E2-B5B3-5E081344A70E}* -WhatIf
    Write-host "$user doesn't exist in group, adding user to group $group"
    Add-ADGroupMember $Group -Members $user -whatif
}

foreach($user in $membersof.sAMAccountName)
{
    Write-host "$user exists in group, so userpref files won't be deleted"
    Write-host "$user exists in group, so user won't be added to group $group"
}
#end of script

すでに遭遇しているかもしれないもう 1 つの問題は、ターゲットがそれぞれではなくAdd-ADGroupMember全体であることです。-WhatIf を追加したので、完了する前に何が起こるかをトリプルチェックできます。$userslist$user

編集

が空の可能性がある場合$userlistは、次のようなチェックを行う必要があります。

if($null -eq $userlist){write-host "userlist is empty";break}

コメントのエラーは、それ$userlistが空だったことを示しています。これらのテストを試してください。

$members = 'test'
$userlist = 'test'
$match,$nomatch = $userlist.where({$_ -in $members},'split')

$members = 'test1'
$userlist = 'test'
$match,$nomatch = $userlist.where({$_ -in $members},'split')

どちらもエラーには$matchならず、最初は入力$nomatchされて空になります。2 番目の場合は逆になります。どちらの場合も、見たようなエラーにはなりません。

于 2020-09-23T22:57:02.940 に答える