2016-09-08 3 views
0

Что мне нужно сделать, это сравнить атрибут лицензии, связанный с каждым именем пользователя, из $ O365Users с атрибутом Enabled, используя соответствующий идентификатор сотрудника в $ userID (если он существует). Со стандартным вложенным ForEach (выше) Мы используем этот скрипт для управления локальными объектами Active Directory и MSOL (Microsoft Online - Office 365). Мой вопрос: У меня есть вопрос, связанный с контуром Еогеасп так же объект возвращает несколько (навсегда) Я хочу сделать это строка за строкой для каждого пользователяПроблема с вложенными циклами в powershell

Import-Module ActiveDirectory 
Import-Module MSOnline 

$password = ConvertTo-SecureString 'PASSWORD' -AsPlainText -Force 
$LiveCred = New-Object System.Management.Automation.PSCredential ("[email protected]", $password) 
New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://ps.outlook.com/powershell/ -Credential $LiveCred -Authentication Basic -AllowRedirection 

Connect-MsolService -Credential $Livecred 

$O365Users = Get-MsolUser -All 
ForEach ($O365User in $O365Users) 
{ 
    $userID = Import-CSV "c:\Export\list.csv" 
    $ADuser = Get-ADUser -Filter "EmployeeID -eq $($userID.EmployeeID)" -Properties whenCreated, Enabled, SAMAccountName 
    If (($ADUser.Enabled -eq $True) -and ($O365User.isLicensed = $true)) 
    { 

    Get-MsolUSer -UserPrincipalName $ADuser.UserPrincipalName 
     Set-MsolUserLicense -UserPrincipalName $ADuser.UserPrincipalName -RemoveLicenses "company:ENTERPRISEPACK" 
    } 
} 

CSV файл:

EmployeeID 
52576 
1234 
8599 
+0

импортировать тот же CSV каждый раз, и вы ВСЕГДА читать такое же значение , который вы используете для получения пользователя ... либо у вас должен быть идентификатор в вашем csv, чтобы он соответствовал внутри цикла, либо вы просто прокручивали csv вместо своих пользователей. – Paul

+0

@Paul благодарит так много, я попробовал разные сочетания нет удачи, пожалуйста, уточните – Arbelac

+0

@Arbelac - как вы получаете list.csv – Kiran

ответ

0

Держи это должно работать

$userID = Import-Csv "c:\export\list.csv" 

foreach ($user in $userID){ 

    $ADuser = Get-ADUser -Filter "EmployeeId -eq $($user.EmployeeID)" -Properties whenCreated, Enabled, SAMAccountName 
    $O365User = Get-MsolUser -UserPrincipalName $ADuser.UserPrincipalName 

    if(($ADuser.Enabled -eq $true) -and ($O365User.isLicensed -eq $true)){ 
     Get-MsolUSer -UserPrincipalName $ADuser.UserPrincipalName 
     Set-MsolUserLicense -UserPrincipalName $ADuser.UserPrincipalName -RemoveLicenses "company:ENTERPRISEPACK" 
    } 

} 

Что касается последующего вопроса об исполнении (только то, что я думаю, что может увеличить производительность, никаких гарантий и не подвергнутое испытанию):

$userID = Import-Csv "c:\export\list.csv" 
$adusers = Get-ADUser -Filter * -properties EmployeeID,whenCreated,Enabled,SAMAccountname 
$msolusers = Get-MsolUser -All 

foreach ($user in $userID){ 

$ADuser = $adusers | where {$_.EmployeeID -eq $user.EmployeeID} 
$O365User = $msolusers | where {$_.UserPrincipalName -eq $ADuser.UserPrincipalName} 

if(($ADuser.Enabled -eq $true) -and ($O365User.isLicensed -eq $true)){ 
    Set-MsolUserLicense -UserPrincipalName $ADuser.UserPrincipalName -RemoveLicenses "company:ENTERPRISEPACK" 
} 

} 

В зависимости от того, сколько из пользователей AD/MSOL существует, и вы должны соответствовать этому, это может сократить или увеличить время выполнения, вам придется протестировать с тех пор, как я не могу. Я также удалил get-msoluser в вашем операторе if, так как только функция генерирует (ненужный?) Вывод. Если есть какие-либо проблемы с моим «улучшений», дайте мне знать, и мы можем увидеть, что мы можем сделать;)

+0

большое спасибо за вашу помощь в его работе очень хорошо. Последний вопрос: требуется время, чтобы обработать, как я могу настроить этот скрипт? – Arbelac

+0

@Arbelac обновлен – Paul

+0

Еще раз спасибо man Я использовал меру-команду. его произошло увеличение производительности – Arbelac

-1

Пожалуйста, попробуйте:

Import-Module ActiveDirectory 
Import-Module MSOnline 

$password = ConvertTo-SecureString 'PASSWORD' -AsPlainText -Force 
$LiveCred = New-Object System.Management.Automation.PSCredential ("[email protected]", $password) 
New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://ps.outlook.com/powershell/ -Credential $LiveCred -Authentication Basic -AllowRedirection 

Connect-MsolService -Credential $Livecred 


$userIDs = Import-CSV "c:\Export\list.csv" 
$O365Users = Get-MsolUser -All 

ForEach ($O365User in $O365Users) 
{ 
    foreach ($userID in $userIDs) 
    { 
    $ADuser = Get-ADUser -Filter "EmployeeID -eq $($userID.EmployeeID)" -Properties whenCreated, Enabled, SAMAccountName,ObjectGUID 
    $valuetoconvert=$ADuser.ObjectGUID 
    $guid = [GUID]$valuetoconvert 
    $bytearray = $guid.tobytearray() 
    $ImmutableID = [system.convert]::ToBase64String($bytearray) 


    If (($ADUser.Enabled -eq $True) -and ($O365User.isLicensed = $true) -and ($ImmutableID -eq $O365User.ImmutableID)) 
    { 
     Get-MsolUSer -UserPrincipalName $ADuser.UserPrincipalName 
     Set-MsolUserLicense -UserPrincipalName $ADuser.UserPrincipalName -RemoveLicenses "company:ENTERPRISEPACK" 
    } 

    } 
} 
+0

Я предполагаю, что если оператор имеет значение «(« отсутствует », но даже если я попытался, он все еще не работает. – Arbelac

+0

Спасибо. Я отредактировал его только сейчас. –

+0

К сожалению, скрипт по-прежнему не возвращает никаких данных и работает на 30 минут – Arbelac

Смежные вопросы