locked
issue to display function result with custom object RRS feed

  • Question

  • Hi,

    I'm newbie to do script and I don't know where is my issue.

    Piece of my script :

    #Roles FSMO
    function FSMO {
        AfficheTitre ("ROLES FSMO")
        $result=@()
        #maitre de domaine
        $domainMaster=$forest.domainnamingmaster
        #maitre de schema
        $schemaMaster=$forest.schemamaster
    
        #Récupération des rôles FSMO de chaque domaines
        $alldomains | foreach { 
            $domaine=$_
            #maitre d'infrastructure
            $infraMaster=(Get-ADDomain -Identity $domaine).infrastructuremaster
            #maitre RID
            $RIDMaster=(Get-ADDomain -Identity $domaine).RIDMaster
            #emulateur PDC
            $PDC=(Get-ADDomain -Identity $domaine).PDCEmulator
            $obj=[PSCustomObject]@{
                Domaine=$domaine
                MaitreDeDomaine=$domainMaster
                MaitreDeSchema=$schemaMaster           
                maitreInfrastructure=$infraMaster
                maitreRID=$RIDMaster
                emulateurPDC=$PDC          
            }    
            $result+=$obj
        }
        return $result
    }
    
    #Permet d'afficher un titre encadré
    function AfficheTitre ($titre)
    {
        $nbchar=$titre.length
        $charhaut="#"
        $charbas="#"
        $nbsymbole=100
        $debutEcriture=[math]::truncate(($nbsymbole-$nbchar)/2)-1
        $return+=write-host ""
        $return+=write-host $($charhaut*$nbsymbole)
        $return+=write-host $($charhaut*$nbsymbole)
        $return+=write-host $(" " * $debutEcriture) $titre $(" " * $debutEcriture)
        $return+=write-host $($charbas*$nbsymbole)
        $return+=write-host $($charbas*$nbsymbole)
        $return+=write-host ""
        return($return)
    
    }
    
    #Récupération des niveaux fonctionnels
    function NiveauFonctionnel
    {
        AfficheTitre("NIVEAU FONCTIONNEL")
        $result=@()
        #niveau fonctionnel forêt
        $ffl=$forest.forestmode
        #niveau fonctionnel domaine
        $alldomains | foreach {
            #nom du domaine
            $domaine=$_
            #niveau fonctionnel du domaine
            $dfl=(Get-ADDomain -Identity $domaine).domainmode
            $obj=[PSCustomObject]@{
                Domaine=$domaine
                NiveauFonctionnelForet=$ffl
                NiveauFonctionnelDomaine=$dfl          
            }    
            $result+=$obj
        }
        return $result
    }
    
    function main 
    {
        $forest=get-adforest
        $domain=get-addomain
        $alldomains=$forest.domains
        $allDCs = $forest.Domains | foreach { Get-ADDomainController -Filter * -Server $_ } 
        NiveauFonctionnel
        FSMO
    
    
    
    }
    
    main

    My issue is FSMO doesn't display what I want.

    If I comment on main function "NiveauFonctionnel" FSMO displays result I want.

    I have this issue with all my powershell function where I created custom object.

    Can you explain me what I do wront pls.


    Merci de marquer comme reponses les interventions qui vous ont ete utile.


    • Edited by matteu31400 Thursday, July 11, 2019 9:22 PM
    Thursday, July 11, 2019 9:07 PM

All replies

  • Sorry but this is not a French language forum. There is no way we would be able to decode all of you code.

    I also recommend that you use the AD CmdLets to do this as they are all tested and can manage roles and most other deployment and configuration issues.


    \_(ツ)_/

    Thursday, July 11, 2019 9:35 PM
  • Note that you cannot return to different types in the same function. The first returned typee will override the second.

    Try removing main function and just run the code like this:

        $forest=get-adforest
        $domain=get-addomain
        $alldomains=$forest.domains
        $allDCs = $forest.Domains | foreach { Get-ADDomainController -Filter * -Server $_ } 
        NiveauFonctionnel
        FSMO
    
    

    Also the variables declared inside a function are not global and cannot be changed in functions subsequently called.

    It is always a best practice to pass variables into a function and not have the function dependent on external variables.  In your script I see no reason for using functions anywhere.


    \_(ツ)_/

    Thursday, July 11, 2019 9:40 PM
  • Hi,

    Thanks for your answer.

    Yes, I know this is english forum but I don't think french language is the issue here. I can traduce my script if it's mandatory.

    I used AD cmdlets in my script.

    I use fonction to train with it more because you're totally right, they are not really needed. Except for function "afficherTitre" (=display title) I don't use several time it.Then I find easier to read a script with function then one without it with lot of text and where it's not easy if you want to change order of piece of code.

    I try to remove main function and do this

    $forest=get-adforest
    $domain=get-addomain
    $alldomains=$forest.domains
    $allDCs = $forest.Domains | foreach { Get-ADDomainController -Filter * -Server $_ } 
    NiveauFonctionnel
    FSMO
    
    

    Result is the same.

    I need to comment "niveauFonctionnel" for FSMO to work.

    When you say "

    Also the variables declared inside a function are not global and cannot be changed in functions subsequently called." From where are you talking about in my script ? I don't find it.

    From my knowledge, variable created in one function exist only in this function but variable create out of this function are available for all the script (they are called global variable"). Maybe I'm wrong ?

    for best practice, you mean it's better to do :

    function FSMO ($forest)
    {
        AfficheTitre ("ROLES FSMO")
        $result=@()
        #maitre de domaine
        $domainMaster=$forest.domainnamingmaster
    }

    than

    function FSMO
    {
        AfficheTitre ("ROLES FSMO")
        $result=@()
        #maitre de domaine
        $domainMaster=$forest.domainnamingmaster
    }
    ?


    Merci de marquer comme reponses les interventions qui vous ont ete utile.


    Friday, July 12, 2019 6:34 AM
  • Either write your code in English or post in a French language forum.

    You also fail to say how it doesn't work.  Just saying it doesn't is no help.


    \_(ツ)_/

    Friday, July 12, 2019 6:37 AM
  • #FSMO Role
    function FSMO {
        DisplayTitle ("ROLES FSMO")
        $result=@()
        #domain master
        $domainMaster=$forest.domainnamingmaster
        #schema master
        $schemaMaster=$forest.schemamaster
    
        #pick all FSMO role in each domain
        $alldomains | foreach { 
            $domain2=$_
            #infrastructure master
            $infraMaster=(Get-ADDomain -Identity $domain2).infrastructuremaster
            #RID master
            $RIDMaster=(Get-ADDomain -Identity $domain2).RIDMaster
            #PDC emulator
            $PDC=(Get-ADDomain -Identity $domain2).PDCEmulator
            $obj=[PSCustomObject]@{
                Domaine=$domain2
                MaitreDeDomaine=$domainMaster
                MaitreDeSchema=$schemaMaster           
                maitreInfrastructure=$infraMaster
                maitreRID=$RIDMaster
                emulateurPDC=$PDC          
            }    
            $result+=$obj
        }
        return $result
    }
    
    #Display title
    function DisplayTitle ($titre)
    {
        $nbchar=$titre.length
        $highchar="#"
        $lowchar="#"
        $nbsymbol=100
        $writtingStart=[math]::truncate(($nbsymbol-$nbchar)/2)-1
        $return+=write-host ""
        $return+=write-host $($highchar*$nbsymbol)
        $return+=write-host $($highchar*$nbsymbol)
        $return+=write-host $(" " * $writtingStart) $titre $(" " * $debutEcriture)
        $return+=write-host $($lowchar*$nbsymbol)
        $return+=write-host $($lowchar*$nbsymbol)
        $return+=write-host ""
        return($return)
    
    }
    
    #Pick functionnal level
    function functionalLevel
    {
        AfficheTitre("NIVEAU FONCTIONNEL")
        $result=@()
        #forest functional level
        $ffl=$forest.forestmode
        $alldomains | foreach {
            #domain name
            $domain2=$_
            #domain functional level
            $dfl=(Get-ADDomain -Identity $domain2).domainmode
            $obj=[PSCustomObject]@{
                Domain=$domain2
                forestFunctionalLevel=$ffl
                DomainFonctionalLevel=$dfl          
            }    
            $result+=$obj
        }
        return $result
    }
    
    
        $forest=get-adforest
        $domain=get-addomain
        $alldomains=$forest.domains
        $allDCs = $forest.Domains | foreach { Get-ADDomainController -Filter * -Server $_ } 
        functionalLevel
        FSMO
    
    

    This one is in english.

    I said it doesn't work cause result was the same than previous updated.

    I find something new :

    If I do

        functionalLevel
        FSMO

    FSMO doesn't work totally

    but if I do

    FSMO
    functionalLevel

    or

    #functionalLevel
    FSMO

    result is ok for both (i put only fsmo but both are ok)


    Merci de marquer comme reponses les interventions qui vous ont ete utile.

    Friday, July 12, 2019 8:05 AM
  • I still cannot understand what is failing.  How do you know it is failing?  What is the error?  What is the expected outcome?


    \_(ツ)_/

    Friday, July 12, 2019 8:47 AM
  • Sorry, I probably don't speak enough well english for you to understand.

    Result with issue :


    Expected result


    I just changed functions called order to have expected result.That means something is wrong somewhere, but I don't find what.


    Merci de marquer comme reponses les interventions qui vous ont ete utile.

    Friday, July 12, 2019 9:23 AM
  • I suggest you remove the functions and debug the code one line at a time. We cannot debug it for you and we cannot understand the French code.


    \_(ツ)_/

    Friday, July 12, 2019 9:34 AM
  • ....

    I post english forum because I know there is more people to help me.

    It's sad you don't really try it... Just say we don't understand french. There is no need to understand french to help me for this debugging.

    I already try without function and same issue. I'll try to learn how to use ISE debugger cause I don't know and I will put result after. This can help other people maybe.


    Merci de marquer comme reponses les interventions qui vous ont ete utile.

    Friday, July 12, 2019 10:03 AM
  • Here is how to correctly write the FSMO function.

    function Get-DomainRoles{
        
        $forest = get-adforest
        $domainMaster = $forest.domainnamingmaster
        $schemaMaster = $forest.schemamaster
        
        $forest.domains | 
            ForEach-Object {
                $domain = Get-ADDomain $_
                [PSCustomObject]@{
                Domaine              = $_
                MaitreDeDomaine      = $forest.domainnamingmaster
                MaitreDeSchema       = $forest.schemaMaster
                maitreInfrastructure = $domain.Infrastructuremaster
                maitreRID            = $domain.RIDMaster
                emulateurPDC         = $domain.PDCEmulator
            }
        }
    }
    


    \_(ツ)_/

    Friday, July 12, 2019 10:20 AM
  • This is how to write the second function:

    function Get-DomainFunctionLevel {
        $forest = get-adforest
        $forest.Domains | 
            ForEach-Object {
            $domain = Get-ADDomain -Identity $_
            [PSCustomObject]@{
                Domaine                  = $_
                NiveauFonctionnelForet   = $forest.ForestMode
                NiveauFonctionnelDomaine = $domain.DomainMode
            }
        }
    }
    


    \_(ツ)_/

    Friday, July 12, 2019 10:27 AM
  • Here are both run together with no issue.

    function Get-DomainRoles{
        
        $forest = get-adforest
        $domainMaster = $forest.domainnamingmaster
        $schemaMaster = $forest.schemamaster
        
        $forest.domains | 
            ForEach-Object {
                $domain = Get-ADDomain $_
                [PSCustomObject]@{
                Domaine              = $_
                MaitreDeDomaine      = $forest.domainnamingmaster
                MaitreDeSchema       = $forest.schemaMaster
                maitreInfrastructure = $domain.Infrastructuremaster
                maitreRID            = $domain.RIDMaster
                emulateurPDC         = $domain.PDCEmulator
            }
        }
    }
    
    function Get-DomainFunctionLevel {
        $forest = get-adforest
        $forest.Domains | 
            ForEach-Object {
            $domain = Get-ADDomain -Identity $_
            [PSCustomObject]@{
                Domaine                  = $_
                NiveauFonctionnelForet   = $forest.ForestMode
                NiveauFonctionnelDomaine = $domain.DomainMode
            }
        }
    }
    
    Get-DomainRoles | FL
    Get-DomainFunctionLevel | FL
    
    

    You can use different formatters to change the way it displays but the data is correct and is what the code asks for.


    \_(ツ)_/

    Friday, July 12, 2019 10:29 AM
  • Note - You can also do this:

    Get-DomainRoles |FT
    Get-DomainFunctionLevel |FT

    I will leave it tom you to learn what I have done.

    Also note that you should not accumulate in a function and you should not use "return".  Do  not create unnecessary variables.   They make the code impossible to understand and manage.


    \_(ツ)_/


    • Edited by jrv Friday, July 12, 2019 10:43 AM
    Friday, July 12, 2019 10:42 AM
  • The following would make more sense:

    function Get-ForestInformation{
        
        $forest = get-adforest
        $domainMaster = $forest.domainnamingmaster
        $schemaMaster = $forest.schemamaster
        
        $forest.domains | 
            ForEach-Object {
                $domain = Get-ADDomain $_
                [PSCustomObject]@{
                    Domaine              = $_
                    MaitreDeDomaine      = $forest.domainnamingmaster
                    MaitreDeSchema       = $forest.schemaMaster
                    maitreInfrastructure = $domain.Infrastructuremaster
                    maitreRID            = $domain.RIDMaster
                    emulateurPDC         = $domain.PDCEmulator
                    NiveauFonctionnelForet = $forest.ForestMode
                    NiveauFonctionnelDomaine = $domain.DomainMode
                }
        }
    }
    
    Get-ForestInformation


    \_(ツ)_/

    Friday, July 12, 2019 10:46 AM
  • If you take the time to actually learn PowerShell you can very quickly do things like this:

    $style = @'
    <style>
    table {
      font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
      border-collapse: collapse;
      width: 100%;
    }
    
    td,th {
      border: 1px solid #ddd;
      padding: 8px;
    }
    
    tr:nth-child(even){background-color: #f2f2f2;}
    tr:hover {background-color: #ddd;}
    th {
      padding-top: 12px;
      padding-bottom: 12px;
      text-align: left;
      background-color: #4CAF50;
      color: white;
    }
    </style>
    '@
    
    function Get-ForestInformation {
        
        $forest = get-adforest
        
        $PreContent = "
            <h1>Forest Domain Information</h1>
            <h2>
            DomainMaster = $($forest.domainnamingmaster)<br />
            SchemaMaster = $($forest.schemamaster)<br />
            ForestMode = $($forest.ForestMode)<br />
            </h2>
        "
        
        $forest.domains |
            ForEach-Object {
                $domain = Get-ADDomain $_
                [PSCustomObject]@{
                    Domaine         = $_
                    maitreInfrastructure = $domain.Infrastructuremaster
                    maitreRID       = $domain.RIDMaster
                    emulateurPDC    = $domain.PDCEmulator
                    NiveauFonctionnelDomaine = $domain.DomainMode
                }
            } |
            ConvertTo-Html -PreContent $PreContent -Head $style |
            Out-File Report.htm
            Start-Process report.htm
    }
    
    Get-ForestInformation
    
    


    \_(ツ)_/

    Friday, July 12, 2019 10:59 AM
  • Here is an even prettier version.

    $style = @'
    <style>
    table {
      font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
      border-collapse: collapse;
      width: 100%;
    }
    
    td,th {
      border: 1px solid #ddd;
      padding: 8px;
    }
    
    tr:nth-child(even){background-color: #f2f2f2;}
    tr:hover {background-color: #ddd;}
    th {
      padding-top: 12px;
      padding-bottom: 12px;
      text-align: left;
      background-color: #4CAF50;
      color: white;
    }
    h1 {
        font-style: italic;
        font-weight: bolder;
        width: 100%;
        text-align: center;
        text-decoration: underline;
    }
    body {
        background-color: antiquewhite;
    }
    </style>
    '@
    
    function Get-ForestInformation {
        
        $forest = Get-AdForest
        
        $PreContent = "
            <h1>Forest Domain Information</h1>
            <h2>
            DomainMaster = $($forest.domainnamingmaster)<br />
            SchemaMaster = $($forest.schemamaster)<br />
            ForestMode   = $($forest.ForestMode)<br />
            </h2>
        "
        
        $forest.domains |
            ForEach-Object {
                $domain = Get-ADDomain $_
                [PSCustomObject]@{
                    Domaine         = $_
                    'Maitre Infrastructure'      = $domain.Infrastructuremaster
                    'Maitre RID'                 = $domain.RIDMaster
                    'Emulateur PDC'              = $domain.PDCEmulator
                    'Niveau Fonctionnel Domaine' = $domain.DomainMode
                }
            } |
            ConvertTo-Html -PreContent $PreContent -Head $style |
            Out-File Report.htm
        Start-Process report.htm
    }
    
    Get-ForestInformation

    This can also be easily sent in an email message or printed to a printer.

    When you learn PowerShell you will learn about how PowerShell outputs objects and how they are converted to usable text. This is usually the first thing you will learn when you take a course or read a good tutorial on PowerShell.


    \_(ツ)_/



    Friday, July 12, 2019 1:56 PM
  • thanks for your answer :)

    It works well. I need to rebuild my code :)

    Make HTML report is the last step I want to do ^^

    Can you say me what is the best between both possibilities pls ?

    $var="get-command"
    function f1
    {
        $a=$var.test1
    }
    
    function f2
    {
       $a=$var.test2
    }

    or

    function f1
    {
        $var="get-command"
        $a=$var.test1
    }
    
    function f2
    {
       $var="get-command"
       $a=$var.test2
    }

    Because on my script, I do the first one but in your answer, you show for the second.

    The first will take less time but it's not good for evolutivity and maintenance right ?

    On the second, each function is totally independ and it's probably better....

    I'll try to use less function on my script cause I have a lot of now and I can probably merge lot of them...

    When you write :

    -> you should not accumulate in a function

    What do you mean ? don't have to do 1 000 000 functions ? Sorry but google traduce doesn't help me to understand this  :(

    -> you should not use "return"

    I saw yesterday return in a function in powershell is useless cause he returns all automatically.

    https://devblogs.microsoft.com/scripting/the-top-ten-powershell-best-practices-for-it-pros/

    -> Do  not create unnecessary variables  OK

    Thanks for all your advices :)


    Merci de marquer comme reponses les interventions qui vous ont ete utile.



    Friday, July 12, 2019 3:32 PM
  • Before you continue guessing badly about any of this please take the time to actually learn PowerShell. You cannot learn by asking questions or or copying code. It is not possible to learn any advanced technology without actually formally studying it.  You are full of bad or incomplete and conflicting ideas about what programming and PowerShell are all about.

    PowerShell is a "formal" scripting system.  You must learn the system to understand how to use the language and write scripts.  You will only understand what this means AFTER you learn PowerShell and the PowerShell scripting system.

    start here:

          Microsoft Virtual     Academy - Getting Started with Microsoft PowerShell

          PowerShell Documentation

          PowerShell Style   Guidelines

    The books by the creators of PowerShell are the best way to learn PS.


    \_(ツ)_/

    Friday, July 12, 2019 3:48 PM
  • What is bad ?

    I already follow powershell workshop microsoft location level 1 but it's not really developper course. It's for admin and very often 2/3/4 lines...

    course learn operator / condition / loop / commandlet / ....

    It didn't explain really how powershell work but just give lot of sample.

    I'm reading your last link, it's good best practice :)


    Merci de marquer comme reponses les interventions qui vous ont ete utile.

    Friday, July 12, 2019 4:22 PM
  • Honestly, I already know lot of things writen in the second link.

    What I need to improve is my knowledge about "object" and how to "format" text to use it after...

    I only made some "oneshot" script with result display in console.

    Now, I would like to learn how to do real script.

    At work, one colleague does scripting and say me I have to avoid writing something in console cause it's useless. I need to use other output write-output / verbos / warning

    He said me to troubleshoot script I need to log all action in log file and to show result make html report.


    Merci de marquer comme reponses les interventions qui vous ont ete utile.

    Friday, July 12, 2019 4:41 PM
  • The old MVA video has been removed. This is its replacement. It is good and free but requires some decent computer engineering and software engineering skills. It is not for Admins and desktop support but assumes that the reader will have good formal computer background. It does not teach programming skill but does discuss the design and capabilities of PS. The book linked above is more comprehensive and does illustrate basic programming with PowerShell.

    https://docs.microsoft.com/en-us/powershell/scripting/overview?view=powershell-5.1

    There is a whole section linked in the left pane with all chapters.  Read it slowly and carefully.  Look up and study all terms that you are not absolutely sure of.

    In French: https://docs.microsoft.com/fr-fr/powershell/scripting/overview?view=powershell-5.1


    \_(ツ)_/

    Friday, July 12, 2019 4:42 PM
  • Honestly, I already know lot of things writen in the second link.

    What I need to improve is my knowledge about "object" and how to "format" text to use it after...

    I only made some "oneshot" script with result display in console.

    Now, I would like to learn how to do real script.

    At work, one colleague does scripting and say me I have to avoid writing something in console cause it's useless. I need to use other output write-output / verbos / warning

    He said me to troubleshoot script I need to log all action in log file and to show result make html report.


    Merci de marquer comme reponses les interventions qui vous ont ete utile.

    Please do not listen to helpful friends who have learned by accident and copying from the web.  YOU must learn the real basics from a known good source before you will be able to judge your helpful co-workers.  Once you take a full tutorial or book you will begin to see how PS is intended to be used.

    Also each product has its own PowerShell documentation and forum so you will need to review the specific product usage of PS.

    Learning how to use and navigate the technical documentation is critical.  All of us old users still return to the documentation to clarify usage and behavior.

    It would also be helpful to get some books on software development methods.  Not a specific language book but a general book on programming and program design and development.

    Start with the Payette book linked above.


    \_(ツ)_/

    Friday, July 12, 2019 4:48 PM
  • I have french book for powershell but it's V3...

    I will try to see your link and how to improve object knowledge and how to work with data.

    I can't buy english book, cause I'm not enough strong to read one entire book in english. I'm not developer but I want to be better on it. I don't have time to "become" powershell developper cause my job is to do support on microsoft technologies + vmware + veeam.

    I try to do my best !


    Merci de marquer comme reponses les interventions qui vous ont ete utile.

    Friday, July 12, 2019 4:54 PM
  • If you get the book in English and read a chapter every weekend and read at least the first section you will be way ahead.


    \_(ツ)_/

    Friday, July 12, 2019 4:59 PM
  • Thanks for your advice.

    I find the book and start to read it. You're right, it's a good book cause it's not only lot of "random" cmdlet but also how powershell works. And this is what I need to learn, understand, and work with :)

    I read only 60 pages until now.

    My issue is I have to perform an entire Active directory audit soon and I will not have time to read the entire book. I find some "workaround" to do what I want to export result with some help.

    Sample here :

    #Test if AD RecycleBin is activated
    function Test-ADRecyclebin
    {
        $recyclebin=(Get-ADOptionalFeature -Filter 'name -like "Recycle Bin Feature"').EnabledScopes
        if ($recyclebin)
        {
            $ADRecycleBin = "Enabled"
    
        }
        else
        {
            $ADRecycleBin = "Disabled"
        }
        $ADRecycleBin
    }
    
    #FSMO roles + functional level
    function Get-ForestInformation {
        $forest = Get-ADForest
        $domainMaster = $forest.domainnamingmaster
        $schemaMaster = $forest.schemamaster
    
        #Find FSMO role in each domain
        $forest.domains | ForEach-Object { 
            $domain = Get-ADDomain $_
    
            [PSCustomObject]@{
                Domain = $_
                DomainMaster = $domainMaster
                SchemaMaster = $schemaMaster           
                InfrastructureMaster = $domain.infrastructuremaster
                RIDMaster = $domain.RIDMaster
                PDCEmulator = $domain.PDCEmulator  
                ForestFunctionalLevel=$forest.ForestMode
                DomainFunctionalLevel=$domain.domainmode         
            }    
        }
    }
    
    $Result = @{}
    
    $recyclebin=Test-ADRecyclebin
    $forestinfo=Get-ForestInformation
    
    $result+=@{ADRecycleBin=$recyclebin}
    $result+=@{forestInfo=$forestinfo}

    I use function and put the result in variable and then in hashtable.

    I don't know if it's the best solution, but I don't find any other so "easy" to manage.

    HTML is not possible for me to understand how it work so fast. I will just launch script and put what I want in text file. Then, I will format it on word.

    I don't know how to manage word COM object to make it with the script too ^^


    Merci de marquer comme reponses les interventions qui vous ont ete utile.

    Tuesday, July 16, 2019 6:51 PM
  • Hi,

    Was your issue resolved?

    If you resolved it using our solution, please "mark it as answer" to help other community members find the helpful reply quickly.

    If you resolve it using your own solution, please share your experience and solution here. It will be very beneficial for other community members who have similar questions.

    If no, please reply and tell us the current situation in order to provide further help.

    Best Regards,

    Lee


    Just do it.

    Wednesday, July 31, 2019 8:10 AM