none
Уведомление об истечении срока действия пароля для MAC клиентов. RRS feed

  • Общие обсуждения

  • Доброго времени суток Уважаемые коллеги.

    Есть доменная инфраструктура, в которой имеется некоторое количество MAC устройств, а точнее около 100 единиц, за которыми работают пользователи. В ближайшей перспективе данные клиенты будут заменены на Windows. Все бы ничего, но есть политика безопасности в которой срок истечения пароля составляет к примеру 42 дня. Пользователи которые на Windows машинах, получают данные уведомления загодя, это и понятно. Но пользователи MAC меняют пароль тогда, когда при попытке прочитать почту,или попытаются получить доступ к smb//:shara.domain.ru, получают ошибку отказ в доступе. Соответственно в AD меняется пароль и его сообщают пользователю. Так же имеется почтовая система Exchange через которую можно сменить пароль, зайдя с того же MAC через браузер на OWA и поменять пароль, но пользователи MAC так же об этом ничего не знают, так как у них стоит Office Outlook for MAC.

    Вопрос: есть ли возможность, например через powershell отправлять оповещение только пользователям, которые на MAC в  их почтовые ящики о том, что пароль будет просрочен через n дней и есть рекомендация сменить его через owa ? Может у кого уже есть некий исходник, или ссылка ?

    Спасибо!


    Люди тратят здоровье, что бы заработать $, а затем тратят $, что бы вернуть здоровье!



    4 сентября 2019 г. 15:50

Все ответы

  • Первое, что приходит в голову (я так понял, МАСи не в домене):

    - Get-aduser из OU где только МАС пользователи

    - Если атрибут срока пароля больше текущей даты на три дня, то Send-mailmessage на атрибут пользователя mail

    Или второе: отключить срок действия пароля ползоватлю до тех пор, пока он нн станет Windows пользователем 

    4 сентября 2019 г. 17:25
  • Первое, что приходит в голову (я так понял, МАСи не в домене):

    - Get-aduser из OU где только МАС пользователи

    - Если атрибут срока пароля больше текущей даты на три дня, то Send-mailmessage на атрибут пользователя mail

    Или второе: отключить срок действия пароля ползоватлю до тех пор, пока он нн станет Windows пользователем 

    Второе навряд ли, не позволит ИБ.  Это и было сделано изначально через AD Pso

    Да, надо попробовать posh что ни будь собрать...


    Люди тратят здоровье, что бы заработать $, а затем тратят $, что бы вернуть здоровье!

    4 сентября 2019 г. 17:36
  • Есть один интересный скрипт, но так как я не силен в Visual Basic, хотелось бы понять, как правильно задать параметр запроса LDAP для поиска пользователей не по всему домену, а по группам безопасности (например там где находятся MAC пользователи), ну или хотя бы по подразделениям ?

    ' Поиск по всему домену Active Directory.
    strBase = "<LDAP://" & strDNSDomain & ">"

    Весь скрипт:

    Option Explicit
    
    Dim adoCommand, adoConnection, strBase, strFilter, strAttributes
    Dim objRootDSE, strDNSDomain, strQuery, adoRecordset
    Dim dtmDate1, dtmDate2, intDays, strName, strEmail, dtmDaysLeft
    Dim lngSeconds1, str64Bit1, lngSeconds2, str64Bit2
    Dim objShell, lngBiasKey, lngBias, k
    Dim objDomain, objMaxPwdAge, lngHighAge, lngLowAge, sngMaxPwdAge
    Dim objDate, dtmPwdLastSet, dtmExpires
    Dim arrEmails, strItem, strPrefix
    
    ' Количество дней до истечения пароля 
    intDays = 7
    
    ' Определяем политику максимального срока действия пароля домена в днях.
    Set objRootDSE = GetObject("LDAP://RootDSE")
    strDNSDomain = objRootDSE.Get("DefaultNamingContext")
    Set objDomain = GetObject("LDAP://" & strDNSDomain)
    Set objMaxPwdAge = objDomain.MaxPwdAge
    
    ' Учетная запись для ошибки в методах свойства IADslargeIntege.
    lngHighAge = objMaxPwdAge.HighPart
    lngLowAge = objMaxPwdAge.LowPart
    If (lngLowAge < 0) Then
        lngHighAge = lngHighAge + 1
    End If
    ' Преобразование из 100-наносекундных интервалов в дни.
    sngMaxPwdAge = -((lngHighAge * 2^32) _
        + lngLowAge)/(600000000 * 1440)
    
    ' Определяем дату последнего изменения пароля,
    ' исключая пользователей, чей пароль уже истек.
    dtmDate1 = DateAdd("d", - sngMaxPwdAge, Now())
    
    ' Определяем дату последнего изменения пароля,
    ' срок действия пароля истекал в будущем.
    dtmDate2 = DateAdd("d", intDays - sngMaxPwdAge, Now())
    
    ' Получение смещения локального часового пояса от реестра компьютера..
    Set objShell = CreateObject("Wscript.Shell")
    lngBiasKey = objShell.RegRead("HKLM\System\CurrentControlSet\Control\" _
        & "TimeZoneInformation\ActiveTimeBias")
    If (UCase(TypeName(lngBiasKey)) = "LONG") Then
        lngBias = lngBiasKey
    ElseIf (UCase(TypeName(lngBiasKey)) = "VARIANT()") Then
        lngBias = 0
        For k = 0 To UBound(lngBiasKey)
            lngBias = lngBias + (lngBiasKey(k) * 256^k)
        Next
    End If
    
    ' Преобразования типа datetime в формате UTC.
    dtmDate1 = DateAdd("n", lngBias, dtmDate1)
    dtmDate2 = DateAdd("n", lngBias, dtmDate2)
    
    ' Поиск количества секунд, прошедших с 1/1/1601 на эти даты.
    lngSeconds1 = DateDiff("s", #1/1/1601#, dtmDate1)
    lngSeconds2 = DateDiff("s", #1/1/1601#, dtmDate2)
    
    'Преобразовать количество секунд в строку
    'и преобразовать в 100-наносекундных интервалы.
    str64Bit1 = CStr(lngSeconds1) & "0000000"
    str64Bit2 = CStr(lngSeconds2) & "0000000"
    
    ' Настройка объектов ADO.
    Set adoCommand = CreateObject("ADODB.Command")
    Set adoConnection = CreateObject("ADODB.Connection")
    adoConnection.Provider = "ADsDSOObject"
    adoConnection.Open "Active Directory Provider"
    Set adoCommand.ActiveConnection = adoConnection
    
    ' Поиск по всему домену Active Directory.
    strBase = "<LDAP://" & strDNSDomain & ">"
    
    ' Фильтр по объектам пользователей, 
    ' срок действия которых истекает между, 
    ' дата указана, 
    ' учетная запись не отключена, 
    ' пароль не имеет срок действия, 
    ' пароль не требуется не установлено,
    ' и пароль не может быть изменен не установлен.
    strFilter = "(&(objectCategory=person)(objectClass=user)" _
        & "(pwdLastSet>=" & str64Bit1 & ")" _
        & "(pwdLastSet<=" & str64Bit2 & ")" _
        & "(!userAccountControl:1.2.840.113556.1.4.803:=2)" _
        & "(!userAccountControl:1.2.840.113556.1.4.803:=65536)" _
        & "(!userAccountControl:1.2.840.113556.1.4.803:=32)" _
        & "(!userAccountControl:1.2.840.113556.1.4.803:=48))"
    
    ' Список значений атрибутов с разделителями-запятыми для отбора.
    strAttributes = "sAMAccountName,mail,proxyAddresses,pwdLastSet"
    
    ' Построение синтаксиса запроса протокола LDAP.
    strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";subtree"
    adoCommand.CommandText = strQuery
    adoCommand.Properties("Page Size") = 100
    adoCommand.Properties("Timeout") = 30
    adoCommand.Properties("Cache Results") = False
    
    ' Запрос синтаксиса.
    Set adoRecordset = adoCommand.Execute
    
    ' Перебор результирующих записей.
    Do Until adoRecordset.EOF
        ' Извлечение значений.
        strName = adoRecordset.Fields("sAMAccountName").Value
        strEmail = adoRecordset.Fields("mail").Value & ""
        arrEmails = adoRecordset.Fields("proxyAddresses").Value
        If (strEmail = "") And (IsNull(arrEmails) = False) Then
            ' Select primary email address.
            For Each strItem In arrEmails
                strPrefix = Left(strItem, 5)
                If (strPrefix = "SMTP:") Or (strPrefix = "X400:") Then
                    strEmail = Mid(strItem, 6)
                    Exit For
                End If
            Next
        End If
        ' Определение истечения срока действия пароля.
        ' Атрибут pwdLastSet всегда должен иметь присвоенное значение,
        ' но другие атрибуты Integer8 представления дат может быть "нулевым".
        If (TypeName(adoRecordset.Fields("pwdLastSet").Value) = "Object") Then
            Set objDate = adoRecordset.Fields("pwdLastSet").Value
            dtmPwdLastSet = Integer8Date(objDate, lngBias)
        Else
            dtmPwdLastSet = #1/1/1601#
        End If
        dtmExpires = DateAdd("d", sngMaxPwdAge, dtmPwdLastSet)
    	dtmDaysLeft = DateDiff("d",FormatDateTime(Date,2),FormatDateTime(dtmExpires,2))
    'wscript.echo strName,dtmExpires,dtmDaysLeft
    	IF ((dtmDaysLeft = 7) OR (dtmDaysLeft = 5) OR (dtmDaysLeft = 3) OR (dtmDaysLeft = 1)) Then
        If (strEmail <> "") Then
    'wscript.echo strName,dtmExpires,dtmDaysLeft	
            ' Send an email message to the user.
            Call SendEmailMessage(strEmail, objDomain.Get("name") & "\" & strName, dtmExpires, dtmDaysLeft)
    '        Wscript.Echo "Message for " & strName & " sent to " & strEmail
        Else
    '        Wscript.Echo "No email address for " & strName
        End If
    	End If
        ' Move to the next record in the recordset.
        adoRecordset.MoveNext
    Loop
    
    ' Clean up.
    adoRecordset.Close
    adoConnection.Close
    
    Function Integer8Date(ByVal objDate, ByVal lngBias)
        ' Функция преобразования значения Integer8 (64-разрядное) в дату, скорректированная для смещение локального часового пояса.
        Dim lngAdjust, lngDate, lngHigh, lngLow
        lngAdjust = lngBias
        lngHigh = objDate.HighPart
        lngLow = objDate.LowPart
        ' Учетная запись для ошибки в методах свойства IADsLargeInteger.
        If (lngLow < 0) Then
            lngHigh = lngHigh + 1
        End If
        If (lngHigh = 0) And (lngLow = 0) Then
            lngAdjust = 0
        End If
        lngDate = #1/1/1601# + (((lngHigh * (2 ^ 32)) _
            + lngLow) / 600000000 - lngAdjust) / 1440
        ' Ошибка , если lngDate очень большой.
        On Error Resume Next
        Integer8Date = CDate(lngDate)
        If (Err.Number <> 0) Then
            On Error GoTo 0
            Integer8Date = #1/1/1601#
        End If
        On Error GoTo 0
    
    End Function
    
    Sub SendEmailMessage(ByVal strDestEmail, ByVal strNTName, ByVal dtmDate, ByVal dtmDaysLeft)
    	' Отправить зерез порт 25 SMTP-сервера.
    	Const cdoSendUsingPort = 2
     
    dim iMsg, iConf,Flds,shtml 
    
    	set iMsg = CreateObject("CDO.Message")
    	set iConf = CreateObject("CDO.Configuration")
    	
    	Set Flds = iConf.Fields
     
    	' Поля конфигурации для порта 25 на вашем SMTP-сервере
    	With Flds
    	    .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = cdoSendUsingPort
    	    .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "192.168.30.50" 
    	    .Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 10
    	    .Update
    	End With
    	
    	' HTML-код для текста сообщений.
    if dtmDaysLeft = 1 then
    	shtml ="<HTML>"
    	shtml = shtml & "<H1><B><FONT face='Arial Rounded MT Bold' color=#FF0000 size=4>Последнее предупреждение об истечении срока действия пароля</FONT></B></H1>"
    	shtml = shtml & "<P><FONT face=Arial size=2>Вы получили это письмо, потому что срок действия Вашего пароля для учётной записи <H1><B><FONT face='Arial Rounded MT Bold' color=#FF0000 size=4>" & strName & "</FONT></B></H1> истекает <H1><B><FONT face='Arial Rounded MT Bold' color=#FF0000 size=2>" & dtmDate & " (т.е. завтра!).</FONT></B></H1><br>"
    	shtml = shtml & "Если пароль не будет сменён до указанного срока, доступ ко всем системам будет автоматически закрыт!<br><br>В случае блокировки Вашей учётной записи необходимо:<br>Обратиться в техподдержку по телефону 555<br>* Приятного рабочего дня</FONT></P>"
    	shtml = shtml & "</BODY></HTML>"
    else
    	shtml ="<HTML>"
    	shtml = shtml & "<H1><B><FONT face='Arial Rounded MT Bold' color=#e20074 size=4>Уведомление об истечении срока действия пароля</FONT></B></H1>"
    	shtml = shtml & "<P><FONT face=Arial size=2>Вы получили это письмо, потому что срок действия Вашего пароля для учётной записи <H1><B><FONT face='Arial Rounded MT Bold' color=#e20074 size=2>" & strName & "</FONT></B></H1> истекает <H1><B><FONT face='Arial Rounded MT Bold' color=#e20074 size=2>" & dtmDate & ".</FONT></B></H1><br>"
    	shtml = shtml & "Для предотвращения отказа в доступе, необходимо поменять пароль до окончания этого срока.</FONT></P>"
    	shtml = shtml & "</BODY></HTML>"
    end if	
     
    	' Apply the settings to the message.
    	With iMsg
    	    Set .Configuration = iConf
    	    .To = strDestEmail
                .Bcc = "KOPIYA@contora.ru"
    	    .From = "OTKOGO@contora.ru"
    		Select Case dtmDaysLeft
    			Case 7
    				.Subject = "Пароль для учётной записи " & strName & " истечёт " & dtmDate & " (через " & dtmDaysLeft & " дней)."
    			Case 5
    				.Subject = "Пароль для учётной записи " & strName & " истечёт " & dtmDate & " (через " & dtmDaysLeft & " дней)."
    			Case 3
    				.Subject = "Пароль для учётной записи " & strName & " истечёт " & dtmDate & " (через " & dtmDaysLeft & " дня)."
    			Case 1
    				.Subject = "Пароль для учётной записи " & strName & " истечёт " & dtmDate & " (через " & dtmDaysLeft & " день)."
    
    				.Fields("urn:schemas:httpmail:Importance").Value = 2
    				.Fields("urn:schemas:mailheader:importance").Value = "High"
    
    				.Fields("urn:schemas:httpmail:priority").Value = 1
    				.Fields("urn:schemas:mailheader:priority").Value = 1
    
    				.Fields("urn:schemas:mailheader:X-MSMail-Priority").Value = "High"
    				.Fields("urn:schemas:mailheader:X-Priority").Value = 1
    
    				.Fields("urn:schemas:httpmail:X-MSMail-Priority").Value = "High"
    				.Fields("urn:schemas:httpmail:X-Priority").Value = 1
    				.Fields.update
    		End Select
    	    .HTMLBody = shtml		
    '		.AddAttachment(sFolderPath & ZipFile)
    	    .Send
    	End With
     
     
    	' Очистка переменных.
    	Set iMsg = Nothing
    	Set iConf = Nothing
    	Set Flds = Nothing
    
    End Sub

    То, что на выходе должно быть:



    Люди тратят здоровье, что бы заработать $, а затем тратят $, что бы вернуть здоровье!



    • Изменено rеstless 8 сентября 2019 г. 19:29
    8 сентября 2019 г. 19:28