none
Script para alertar o usuário que a senha vai expirar em X dias RRS feed

  • Discussão Geral


  • ' Script to alert the user that their password will expire em X days - Active directory
    ' Daniel Tolouei
    
    ' Days before to alert user
    QtDiasAviso = 7
    
    Const ADS_UF_DONT_EXPIRE_PASSWD = &h10000
    
    Set oTranslate = CreateObject("NameTranslate")
    Set oNetwork = CreateObject("WScript.Network")
    oTranslate.Init 3,""
    oTranslate.Set 3, oNetwork.UserDomain & "\" & oNetwork.UserName
    
    Set objUserLDAP = GetObject _
      ("LDAP://"&oTranslate.Get(1))
    intCurrentValue = objUserLDAP.Get("userAccountControl")
    
    ' Check if user account have date to password expires
    If not intCurrentValue and ADS_UF_DONT_EXPIRE_PASSWD Then
      
    	' Determine when password expires and calculate the days
    	' Instead of property PasswordExpirationDate, you can use the accountExpirationDate property, depending on the case
    	SenhaAlt = DateDiff("d",date,objUserLDAP.PasswordExpirationDate)
    
    	' If password will expire
    	if (SenhaAlt <= QtDiasAviso) then
    		Msgbox "Attention! Your password will expire in " & vbCrLf & vbCrLf & vbCrLf & "                       " & SenhaAlt & " day(s)" & vbCrLf & vbCrLf & vbCrLf & "Change it through the Intranet " & vbCrLf & "http://xxxxxx", vbCritical, "ALERT"
    	end if
    
    end if


    Fica aí para quem tiver interesse =)

    Neste caso usei a propriedade accountExpirationDate para fazer o calculo. E também chequei antes se de fato a conta tem data para expirar ou é do tipo "never expires".

    Valeu!



    quinta-feira, 8 de agosto de 2013 17:25

Todas as Respostas

  • Show de bola Daniel, mas, o proprio windows informa isso a Usuário, cerca de 15 dias antes da expiração da senha.
    quinta-feira, 8 de agosto de 2013 17:34
  • Numa rede AD com estações windows, nao achei isso nativamente, por isso fiz esse script para alertar os users
    quinta-feira, 8 de agosto de 2013 19:09
  • Só pra informação.

    How to change the password expiry notice default

    http://technet.microsoft.com/en-us/library/ee829687(v=ws.10).aspx


    Fábio de Paula Junior

    sexta-feira, 9 de agosto de 2013 03:57
    Moderador
  • Só pra informação.

    How to change the password expiry notice default

    http://technet.microsoft.com/en-us/library/ee829687(v=ws.10).aspx


    Fábio de Paula Junior

    Para usuários de dominio, esse aviso só ocorre por meio de uma notificaçao de balao, caso o usuário tenha tirado do oculto, que vem por default.

    Esse script é pra alertar de forma mais chamativa o usuário em um dominio AD, com um alerta mais chamativo. 

    Mesmo tirando o oculto o avisao de balao, este nao tem se mostrado eficaz, os usuários ignoram e as vezes acabam até marcando para ocultar o aviso.


    sexta-feira, 9 de agosto de 2013 13:47
  • Esse script alerta e envia email para o usuario.

    On Error Resume Next

    'DECLARA VARIAVEIS
    Dim objConnection, objCommand, objRootDSE, strDNSDomain
    Dim strFilter, strQuery, objRecordSet, strDN, Diasfaltam

    'CONFIGURAR OBJETOS
    Const ADS_UF_DONT_EXPIRE_PASSWD = &h10000
    Const E_ADS_PROPERTY_NOT_FOUND  = &h8000500D
    Const ONE_HUNDRED_NANOSECOND    = .000000100
    Const SECONDS_IN_DAY            = 86400
    Set objSh = CreateObject("Wscript.Shell")
    Set objDomain = GetObject("LDAP://" & objADSystemInfo.DomainDNSName)
    Set objMaxPwdAge = objDomain.Get("maxPwdAge")
    Set objConnection = CreateObject("ADODB.Connection")
    Set objCommand = CreateObject("ADODB.Command")
    objConnection.Provider = "ADsDSOOBject"
    objConnection.Open "Active Directory Provider"
    Set objCommand.ActiveConnection = objConnection
    Set objRootDSE = GetObject("LDAP://RootDSE")
    strDNSDomain = objRootDSE.Get("defaultNamingContext")
    strFilter = "(&(objectCategory=person)(objectClass=user))"
    strQuery = "<LDAP://" & strDNSDomain & ">;" & strFilter & ";distinguishedName;subtree"
    objCommand.CommandText = strQuery
    objCommand.Properties("Page Size") = 99999
    objCommand.Properties("Timeout") = 300
    objCommand.Properties("Cache Results") = False

    'CAPTURA NA GPO O MAXIMO DE DIAS PARA EXPIRAR A SENHA
    Set objADSystemInfo = CreateObject("ADSystemInfo")              
    Set objUser = GetObject("LDAP://" & objADSystemInfo.UserName)
    intUserAccountControl = objUser.Get("userAccountControl")
    Set objMaxPwdAge = objDomain.Get("maxPwdAge")
    Set objRecordSet = objCommand.Execute

    'LOOP
    Do Until objRecordSet.EOF
        strDN = objRecordSet.Fields("distinguishedName")
        Set objUser = GetObject("LDAP://" & strDN)
        intUserAccountControl = objUser.Get("userAccountControl")
        If intUserAccountControl And ADS_UF_DONT_EXPIRE_PASSWD Then
        'PASSWORD NAO EXPIRA
        Else
            dtmValue = objUser.PasswordLastChanged
            Set objDomain = GetObject("LDAP://" & objADSystemInfo.DomainDNSName)
            Set objMaxPwdAge = objDomain.Get("maxPwdAge")
            dblMaxPwdNano = Abs(objMaxPwdAge.HighPart * 2^32 + objMaxPwdAge.LowPart)
            dblMaxPwdSecs = dblMaxPwdNano * ONE_HUNDRED_NANOSECOND
            dblMaxPwdDays = Int(dblMaxPwdSecs / SECONDS_IN_DAY)
            'EM QUANTOS DIAS A SENHA EXPIRA = dblMaxPwdDays
            If intTimeInterval >= dblMaxPwdDays Then
                'SENHA EXPIRADA
            Else
                ' ---  ABAIXO CALCULA QUANTOS DIAS FALTAM PARA EXPIRAR A SENHA
                Diasfaltam = Int((dtmValue + dblMaxPwdDays) - Now)
            End If
            ' ---  SE FALTA MENOS DE 15 DIAS PARA EXPIRAR...
            If int(Diasfaltam) <= 10 and int(Diasfaltam) >= 0 Then
                ' --- COLETA INFORMACAO DE EMAIL
                strDN.GetInfo
            strEndemail = ObjUser.Get("mail")
    '            WScript.Echo "A sua senha expira daqui a " & Diasfaltam & " dias..: " & strDN
        WScript.Echo dtmValue
            WScript.sleep 1000
              Dim objMail     
            Set objEmail = CreateObject("CDO.Message")
                WScript.sleep 1000
                objEmail.From = strEndemail
            objEmail.To = "xx@dominio.com.br"
            objEmail.Subject = "Sua senha está expirando, faltam " & Diasfaltam & " dias"
            objEmail.Textbody = "Sua senha está expirando, dentro de " & Diasfaltam & " dia(s).Caso não houver a troca ela será automaticamente bloqueada" & chr(13) & chr(13) &"Procedimento para a troca de senha:" & chr(13) & "Acesse o site: http://172.16.1.7/ti/Documentos%20Compartilhados/trocasenha.aspx , e proceda com as instruções." & chr(13) & chr(13) & "Qualquer dúvida, favor entrar em contato com o Suporte."
            objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
            objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "192.168.1.200"
            objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
            objEmail.Configuration.Fields.Update
            objEmail.Send
            Wscript.sleep 10000
            Set objMail=Nothing
            End If
        End If
        objRecordSet.MoveNext
    Loop

    objConnection.Close
    Set objConnection = Nothing
    Set objCommand = Nothing
    Set objRootDSE = Nothing
    Set objRecordSet = Nothing


    Thomas Edson Mattos Roeder

    sexta-feira, 9 de agosto de 2013 20:08
  • Esse script alerta e envia email para o usuario.

    On Error Resume Next

    'DECLARA VARIAVEIS
    Dim objConnection, objCommand, objRootDSE, strDNSDomain
    Dim strFilter, strQuery, objRecordSet, strDN, Diasfaltam

    'CONFIGURAR OBJETOS
    Const ADS_UF_DONT_EXPIRE_PASSWD = &h10000
    Const E_ADS_PROPERTY_NOT_FOUND  = &h8000500D
    Const ONE_HUNDRED_NANOSECOND    = .000000100
    Const SECONDS_IN_DAY            = 86400
    Set objSh = CreateObject("Wscript.Shell")
    Set objDomain = GetObject("LDAP://" & objADSystemInfo.DomainDNSName)
    Set objMaxPwdAge = objDomain.Get("maxPwdAge")
    Set objConnection = CreateObject("ADODB.Connection")
    Set objCommand = CreateObject("ADODB.Command")
    objConnection.Provider = "ADsDSOOBject"
    objConnection.Open "Active Directory Provider"
    Set objCommand.ActiveConnection = objConnection
    Set objRootDSE = GetObject("LDAP://RootDSE")
    strDNSDomain = objRootDSE.Get("defaultNamingContext")
    strFilter = "(&(objectCategory=person)(objectClass=user))"
    strQuery = "<LDAP://" & strDNSDomain & ">;" & strFilter & ";distinguishedName;subtree"
    objCommand.CommandText = strQuery
    objCommand.Properties("Page Size") = 99999
    objCommand.Properties("Timeout") = 300
    objCommand.Properties("Cache Results") = False

    'CAPTURA NA GPO O MAXIMO DE DIAS PARA EXPIRAR A SENHA
    Set objADSystemInfo = CreateObject("ADSystemInfo")              
    Set objUser = GetObject("LDAP://" & objADSystemInfo.UserName)
    intUserAccountControl = objUser.Get("userAccountControl")
    Set objMaxPwdAge = objDomain.Get("maxPwdAge")
    Set objRecordSet = objCommand.Execute

    'LOOP
    Do Until objRecordSet.EOF
        strDN = objRecordSet.Fields("distinguishedName")
        Set objUser = GetObject("LDAP://" & strDN)
        intUserAccountControl = objUser.Get("userAccountControl")
        If intUserAccountControl And ADS_UF_DONT_EXPIRE_PASSWD Then
        'PASSWORD NAO EXPIRA
        Else
            dtmValue = objUser.PasswordLastChanged
            Set objDomain = GetObject("LDAP://" & objADSystemInfo.DomainDNSName)
            Set objMaxPwdAge = objDomain.Get("maxPwdAge")
            dblMaxPwdNano = Abs(objMaxPwdAge.HighPart * 2^32 + objMaxPwdAge.LowPart)
            dblMaxPwdSecs = dblMaxPwdNano * ONE_HUNDRED_NANOSECOND
            dblMaxPwdDays = Int(dblMaxPwdSecs / SECONDS_IN_DAY)
            'EM QUANTOS DIAS A SENHA EXPIRA = dblMaxPwdDays
            If intTimeInterval >= dblMaxPwdDays Then
                'SENHA EXPIRADA
            Else
                ' ---  ABAIXO CALCULA QUANTOS DIAS FALTAM PARA EXPIRAR A SENHA
                Diasfaltam = Int((dtmValue + dblMaxPwdDays) - Now)
            End If
            ' ---  SE FALTA MENOS DE 15 DIAS PARA EXPIRAR...
            If int(Diasfaltam) <= 10 and int(Diasfaltam) >= 0 Then
                ' --- COLETA INFORMACAO DE EMAIL
                strDN.GetInfo
            strEndemail = ObjUser.Get("mail")
    '            WScript.Echo "A sua senha expira daqui a " & Diasfaltam & " dias..: " & strDN
        WScript.Echo dtmValue
            WScript.sleep 1000
              Dim objMail     
            Set objEmail = CreateObject("CDO.Message")
                WScript.sleep 1000
                objEmail.From = strEndemail
            objEmail.To = "xx@dominio.com.br"
            objEmail.Subject = "Sua senha está expirando, faltam " & Diasfaltam & " dias"
            objEmail.Textbody = "Sua senha está expirando, dentro de " & Diasfaltam & " dia(s).Caso não houver a troca ela será automaticamente bloqueada" & chr(13) & chr(13) &"Procedimento para a troca de senha:" & chr(13) & "Acesse o site: http://172.16.1.7/ti/Documentos%20Compartilhados/trocasenha.aspx , e proceda com as instruções." & chr(13) & chr(13) & "Qualquer dúvida, favor entrar em contato com o Suporte."
            objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
            objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "192.168.1.200"
            objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
            objEmail.Configuration.Fields.Update
            objEmail.Send
            Wscript.sleep 10000
            Set objMail=Nothing
            End If
        End If
        objRecordSet.MoveNext
    Loop

    objConnection.Close
    Set objConnection = Nothing
    Set objCommand = Nothing
    Set objRootDSE = Nothing
    Set objRecordSet = Nothing


    Thomas Edson Mattos Roeder

    @Thomas,

    Teria como adaptar este script para conectar com  o Office 365?

    quarta-feira, 18 de janeiro de 2017 13:13
  • Bacana o script, mas quando executo ele, ele traz um alert com uma data, creio que seja a ultima de troca de senha do usuario listado, fica aguardando o ok pra continuar e enviar o email.

    Tem como tirar isto?


    by Dimiro MCP | MCDST | ITILF Foi útil? Classifique! Se resolveu, avalie! ;) °dimiro.com | ºtwitter.com/bydimiro

    quinta-feira, 11 de janeiro de 2018 14:52
  • Consegue me passar seu contato para conversarmos sobre seu Script, claro se tiver tempo? 
    quarta-feira, 19 de setembro de 2018 23:47