Powershell for Windows

19.01.2010

Получаем список разрешений, необходимых пользователям и группам пользователей домена для доступа к открытому ресурсу (шаре) сервера.

Filed under: PowerShell — Метки: , , , , , , — Yamshikov Pavel @ 11:46 дп

FindLanDomenServerShares_v1

Описание:
Получает список серверов из АД. Получает список открытых ресурсов(шар) на серверах. Получает список разрешений, необходимых пользователям и группам пользователей для доступа к ресурсу.

Синтаксис:
FindLanDomenServerShares_v1.ps1 [[-Domen] <string[]>] [[-User] <string[]>][[-LogPath] <string[]>]

Параметры:
-Domen
Имя домена из, которого необходимо взять список серверов.

-User
Учетные данные пользователя (админ домена) вида domen\user

-LogPath
Папка для сохранения собранных данных(по умолчанию D:\TMP\LOG)

Пример:
PS C:\FindLanDomenServerShares_v1.ps1 -Domen gavan -user gavan\adm

P.S.

  1. Для работы скрипта потребуется установить оснастку Quest SoftwareManagement Shell for Active Directory и в файле профиля PowerShaell-а Microsoft.PowerShell_profile.ps1 добавить запись:
    # Подключаем оснастку Quest Software
    Add-PSSnapin Quest.ActiveRoles.ADManagement
  2. После загрузки файла, необходимо изменить расширение doc на ps1.

25.09.2009

Импорт контактов из другого домена

Filed under: PowerShell, Windows — Метки: , , , , , , , , — Yamshikov Pavel @ 8:01 дп

Когда у вас работает Active Directory и почтовая система Exchange, то пользователи получают глобальную адресную книгу, в которой есть почтовые адреса всех пользователей AD и всех почтовых контактов заведенных в AD. Это очень удобно: достаточно набрать в Outlook-е фамилию и адрес будет найден автоматически или предложены варианты.

Не редко рядом с нашим доменом или лесом существуют другие: соседних организаций, подразделений, фирм и т.п. При интенсивной переписке с пользователями из этих доменов хочется иметь их адресную книгу, чтобы каждый раз не искать нужного человека и не выяснять какой у него почтовый адрес или номер телефона. Обычно пользователи сами создают контакты у себя в Outlook-е. Но тогда теряется преимущество глобальной адресной книги: каждый пользователь должен сам найти информацию и создать контакт у себя. Лучше если это сделает один раз администратор, и контакты будут доступны всем пользователям. Но заводить контакты в большом количестве достаточно обременительно. К тому же их надо периодически обновлять.

Для синхронизации лесов (доменов) существуют специальные приложения. Например, Microsoft Identity Lifecycle Manager (ILM) или его предыдущая версия Microsoft Identity Integration Server (MIIS). Это мощние универсальные продукты, которые позволяют синхронизировать учетные записи, их свойства, пароли, сертификаты и все остальные атрибуты, позволяют гибко настраивать списки синхронизируемых объектов и их атрибутов, правила разрешения конфликтов и т.д. С помощью этих продуктов можно решить поставленную задачу. Вот только они платные и сложные. И в простых случаях, как наш, нет необходимости их использовать – можно обойтись досточно простым скриптом.

Вот пример простого скрипта на Powershell, который импортирует учетные записи пользователей как контакты из другого домена. Для выполнения скрипта нужно иметь права на создание контактов в родном домене и права на чтение учетных записей во втором домене. Вы можете легко изменить список атрибутов, которые синхронизируются этим скриптом по аналогии.

Вот сам скрипт:

$base = [ADSI]»LDAP://ou=Contacts, ou=DEP,dc=domain,dc=ru»

$users = (new-object System.DirectoryServices.DirectorySearcher([ADSI]»LDAP://ou=DEP1,dc=domain1,dc=ru»,»(&(&(objectCategory=person)(objectClass=user)(!userAccountControl:1.2.840.113556.1.4.803:=2)(title=*)))»)).findAll()

$users | ForEach-Object {

$_ = $_.GetDirectoryEntry()
$NewContact = $base.Create(«contact»,»cn=» + $_.cn)

$NewContact.SetInfo()

$NewContact.extensionAttribute15 = $base.distinguishedName

$NewContact.displayname = $_.displayname
$NewContact.givenname = $_.givenname
$NewContact.sn = $_.sn
$NewContact.initials = $_.initials
$NewContact.description = $_.description

$NewContact.department = $_.department
$NewContact.title = $_.title
$NewContact.company = $_.company

$NewContact.telephoneNumber = $_.telephoneNumber
$NewContact.othertelephone = $_.othertelephone

$NewContact.ipPhone = $_.ipPhone
$NewContact.otherIpPhone = $_.otherIpPhone

$NewContact.mobile = $_.mobile
$NewContact.otherMobile = $_.otherMobile

$NewContact.facsimileTelephoneNumber = $_.facsimileTelephoneNumber
$NewContact.otherfacsimileTelephoneNumber = $_.otherfacsimileTelephoneNumber

if ($_.proxyaddresses) {

$NewContact.proxyaddresses = $_.proxyaddresses
$NewContact.targetAddress = $_.proxyaddresses -clike «SMTP:*»
$NewContact.mailNickname = $_.cn

}

$NewContact.SetInfo()

}

Источник

06.05.2009

Поиск в локальной сети открытых ресурсов и экспорт в файл *.csv

Работа скрипта:

  1. Проверяем путь к папке и если нужно создаем.
  2. Создаем список компьютеров доменной сети
  3. Циклом перебираем список компьютеров доменной сети
  4. Проверяем  «жив» ли  компьютер
  5. Проверяем есть ли доступ к компьютеру
  6. Получаем список «шар» (без системных «шар»)
  7. Проверяем есть ли доступ к «шаре»
  8. Получаем данные о «шаре» (имя, путь, разрешения доступа)
  9. Экспорт данных в файл *.csv

Скрипт FindLanShares.ps1

$Data = get-date -uformat "%d.%m.%Y_%H.%M.%S"
$LogPath = "C:\Monitoring\LOG\$Data"
$AllComputerInfo = @();$AllNOPermissions = @();$AllServerRPCUnavailable = @();$AllNoAccess = @()

#region Check Path Export LOGS
If((Test-Path ($LogPath)) -eq $False)
{New-Item ($LogPath) -Type Directory}
#endregion Check Path Export LOGS

#region We Write The Received Results in Log.
$LogADComputerInfo = "$LogPath\Computer_Information.csv"
$LogNOPermissions = "$LogPath\NO_Permissions_Share.csv"
$LogRPCUnavailable = "$LogPath\Server_RPC_Unavailable.csv"
$LogNoAccess = "$LogPath\No_Access_Computer.csv"
#endregion We Write The Received Results in Log.

#region Function
function Ping ($Name){
$ping = new-object System.Net.NetworkInformation.Ping
if ($ping.send($Name).Status -eq "Success" ) { $True }
else { $False }
trap {Write-Verbose "Ошибка пинга"; $False; continue}
}
#endregion Function

#region Collection of the Information on the Computer

#region The List Active Directory Computers
$LC = Get-QADComputer -ErrorAction SilentlyContinue -SizeLimit 0 | Sort-object Name | foreach {$_.name -replace " *",""}
foreach ($strComputer in $LC){

#region Life check Computer
$Alive="";$Comp = "";$NoAccess = "";$ServerRPCUnavailable = "";$shares =""
$Alive = Ping $strComputer
if ($Alive -eq "True"){Write-Output "Scanning $strComputer"

#region Computer Information

#region Access check to the computer
Trap {"WMI Error Access check $strComputer"; Continue}
$Comp = Get-WmiObject -Class "Win32_computersystem" -ComputerName $strComputer -ErrorAction SilentlyContinue

if ($Comp -eq ""){"NoAccess $strComputer";$AllNoAccess += $NoAccess | % {$_ | select @{e={$strComputer};n='Computer'}}}
if ($Comp -eq $Null){"ServerRPCUnavailable $strComputer";$AllServerRPCUnavailable += $ServerRPCUnavailable | % {$_ | select @{e={$strComputer};n='Computer'}}}
if ($Comp.Caption.Length -gt 1) {

#region Share Information
Trap {"WMI Error Share Name $strComputer"; Continue}
$shares = Get-WmiObject Win32_Share -ComputerName $strComputer -filter 'type=0' -ErrorAction SilentlyContinue

foreach($share in $shares) {
$shareSec ="";$sd = "";$NOPermissions = @();$ShareInfo = @()

Trap {"WMI Error Share Security Setting $strComputer";Continue}
$shareSec = Get-WmiObject Win32_LogicalShareSecuritySetting -ComputerName $strComputer -filter "name='$($share.name)'" -ErrorAction SilentlyContinue

if ($shareSec) {$sd = $sharesec.GetSecurityDescriptor();$DACL = $SD.Descriptor

#region There are No Permissions
if ($DACL.DACL -eq $Null){
$NOPermissions += $DACL |% {
$_ | select @{e={$strComputer};n='Computer'},
@{e={$share.name};n='ShareName'},
@{e={$DACL.DACL};n='DACL'}
}
foreach($NOPermission in $NOPermissions){if ($NOPermission.DACL -eq $Null){$NOPermission.DACL = "NO Permissions"}}
$AllNOPermissions += $NOPermissions
}
#endregion There are No Permissions

$ShareInfo += $DACL.DACL |% {
$_ | select @{e={$comp.Name};n='Computer'},
@{e={$comp.UserName};n='Login'},
@{e={$share.name};n='ShareName'},
@{e={$share.Path};n='PathShare'},
AccessMask,
@{e={$_.trustee.Name};n='User'},
@{e={$_.trustee.Domain};n='Domain'},
@{e={$_.trustee.SIDString};n='SID'}
}
foreach($Info in $ShareInfo){
if ($Info.Login -eq $null){$Info.Login = "Emply"}
if ($Info.AccessMask -eq "1179817"){$Info.AccessMask = "ReadAndExecute"}
if ($Info.AccessMask -eq "1245631"){$Info.AccessMask = "Modify"}
if ($Info.AccessMask -eq "2032127"){$Info.AccessMask = "FullControl"}
if ($Info.User -eq $Null){$Info.User = "DEAD"}
if ($Info.Domain -eq $Null){$Info.Domain = "Emply"}
}
$AllComputerInfo += $ShareInfo
}
}
#endregion Share Information
}
#endregion Access check to the computer
#endregion Computer Information
}
#endregion Life check Computer
}
#endregion The List Active Directory Computers

#endregion  Collection of the Information on the Computer

#region Save to File
$AllComputerInfo | export-csv -Encoding OEM -Path $LogADComputerInfo -NoTypeInformation
$AllNOPermissions | export-csv -Encoding OEM -Path $LogNOPermissions -NoTypeInformation
$AllServerRPCUnavailable | export-csv -Encoding OEM -Path $LogRPCUnavailable -NoTypeInformation
$AllNoAccess | export-csv -Encoding OEM -Path $LogNoAccess -NoTypeInformation
#endregion Save to File

Скачать FindLanShares.ps1

Блог на WordPress.com.