> ## Documentation Index
> Fetch the complete documentation index at: https://help.gorelo.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Install software via custom client fields

> Install software like Cove, SentinelOne, BitDefender, and Webroot with Gorelo scripts that use client-specific custom fields for keys, tokens, and tenant IDs.

Follow this guide to install SentinelOne, Cove, DNSFilter, etc.

Custom client fields can be used in scripts to install software with client-specific info (keys, tokens, etc.).

This example installs:

* Cove
* SentinelOne
* BitDefender
* Webroot

<Tabs>
  <Tab title="Cove">
    <Steps>
      <Step title="Create the client custom field.">
        1. Navigate to **Settings** > **CRM** > **[<u>Custom Fields</u>](https://app.gorelo.io/Admin/admin-settings#crm#clientcustomfields)<u>.</u>**
        2. Add custom field with the following details:
           * **Name**: Cove Customer UID
           * **Variable**: CoveCustomerUID
      </Step>

      <Step title="Populate the Cove Customer UID for each client.">
        1. Navigate to a specific client.
        2. Click **Custom Fields.**
        3. Edit **Cove Customer UID.**
        4. Enter the Customer UID retrieved from Cove.
      </Step>

      <Step title="Write the script.">
        1. Navigate to **[<u>Scripts</u>](https://app.gorelo.io/Asset/script-list)<u>.</u>**
        2. Create a script with the following details:
           * **Name**: Install-Cove
           * **Content**:

        ```powershell theme={null}
        # ===== Configuration Variables =====
        $CUSTOMERUID = $gorelo:client.CoveCustomerUID
        $PROFILEID = "All-in" # Default retention policy
        $PRODUCT = "0" # Profile ID (use "0" for no profile or a specific profile ID)
        $DOWNLOADPATH = "C:\Windows\Temp"
        # ===================================

        $startTime = Get-Date
        $INSTALL = "$DOWNLOADPATH\bm#$CUSTOMERUID#$PROFILEID#.exe"

        # Download installer
        try {
            [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
            (New-Object System.Net.WebClient).DownloadFile("https://cdn.cloudbackup.management/maxdownloads/mxb-windows-x86_x64.exe", "$INSTALL")
        } catch {
            Write-Output "ERROR: Failed to download installer - $_"
            exit 1
        }

        # Run installer
        try {
            Start-Process -FilePath $INSTALL -ArgumentList "-product-name `"$PRODUCT`"" -Wait -NoNewWindow
            Start-Sleep -Seconds 5
        } catch {
            Write-Output "ERROR: Installation failed - $_"
            exit 1
        }

        # Verify installation
        $service = Get-Service -Name "Backup Service Controller" -ErrorAction SilentlyContinue
        $process = Get-Process -Name "BackupFP" -ErrorAction SilentlyContinue

        if ($service.Status -eq 'Running' -and $process) {
            Write-Output "SUCCESS: Backup Service Controller is running and BackupFP process is active."
            Write-Output "Installed for Customer UID: $CUSTOMERUID"
            $exitCode = 0
        } else {
            Write-Output "WARNING: Backup Service Controller or BackupFP process is not running as expected."
            Write-Output "Customer UID: $CUSTOMERUID"
            
            # Check log for errors
            $logDirectory = "C:\ProgramData\mxb\Backup Manager\logs\ClientTool"
            if (Test-Path $logDirectory) {
                $latestLog = Get-ChildItem -Path $logDirectory -Filter "*.log" | Sort-Object LastWriteTime -Descending | Select-Object -First 1
                if ($latestLog) {
                    $errorLines = Get-Content -Path $latestLog.FullName | Where-Object { $_ -match '\[E\]' } | Select-Object -Last 3
                    if ($errorLines) {
                        Write-Output "Recent errors from log:"
                        $errorLines | ForEach-Object { Write-Output $_ }
                    }
                }
            }
            $exitCode = 1
        }

        $endTime = Get-Date
        Write-Output "Installation completed in $([math]::Round(($endTime - $startTime).TotalSeconds, 2)) seconds."
        exit $exitCode
        ```
      </Step>
    </Steps>
  </Tab>

  <Tab title="SentinelOne">
    <Steps>
      <Step title="Create the client custom field.">
        1. Navigate to **Settings** > **CRM** > **[<u>Custom Fields</u>](https://app.gorelo.io/Admin/admin-settings#crm#clientcustomfields)<u>:</u>**
        2. Add a custom field with the following details:
           * **Name**: SentinelOne Site Token
           * **Variable**: s1token

        <Frame>
          <img src="https://mintcdn.com/gorelo/-gDoUuq9lm8_69OG/images/image-87.png?fit=max&auto=format&n=-gDoUuq9lm8_69OG&q=85&s=031f83e7ab18bcf33261433dacae33df" alt="Image" width="782" height="624" data-path="images/image-87.png" />
        </Frame>
      </Step>

      <Step title="Populate the software token for each client.">
        1. Navigate to a specific client
        2. Click **Custom Fields.**
                   <Frame>
                     <img src="https://mintcdn.com/gorelo/-gDoUuq9lm8_69OG/images/image-88.png?fit=max&auto=format&n=-gDoUuq9lm8_69OG&q=85&s=b7c8ddd252eb239aaf67ef9f00553e47" alt="Image" width="699" height="914" data-path="images/image-88.png" />
                   </Frame>
        3. Edit **SentinelOne Site Token**.
        4. Enter the Site Token retrieved from SentinelOne.
                   <Frame>
                     <img src="https://mintcdn.com/gorelo/-gDoUuq9lm8_69OG/images/image-89.png?fit=max&auto=format&n=-gDoUuq9lm8_69OG&q=85&s=937c28444f16ea4989b6fc99af96f7ee" alt="Image" width="678" height="386" data-path="images/image-89.png" />
                   </Frame>
           You can retrieve your SentinelOne Site Token from https\://\<DomainName>.[**sentinelone.net/dashboard**](http://sentinelone.net/dashboard). Navigate to a Site, then to the **Site Info** tab.
                   <Frame>
                     <img src="https://mintcdn.com/gorelo/-gDoUuq9lm8_69OG/images/image-90.png?fit=max&auto=format&n=-gDoUuq9lm8_69OG&q=85&s=baef851dc57746d91b1bc79658c23bb4" alt="Image" width="1641" height="617" data-path="images/image-90.png" />
                   </Frame>
      </Step>

      <Step title="Create the installer file.">
        1. Navigate to **Settings** > Asset > **[<u>Files</u>](https://app.gorelo.io/Admin/admin-settings#asset#filerepository)<u>.</u>**
        2. Add a file with the following details:
           * **File**: Upload the latest MSI installer
           * **Variable**: S1Installer
      </Step>

      <Step title="Write the script.">
        1. Navigate to **[<u>Scripts</u>](https://app.gorelo.io/Asset/script-list)<u>.</u>**
        2. Create a script with the following details:
           * **Name**: Install-SentinelOne.
           * **Content**:

        ```powershell theme={null}
        #Silently install SentinelOne

        if($gorelo:client.s1token){

          $S1Service = get-service -Name 'Sentinel Agent' -ErrorAction SilentlyContinue

          if($S1Service -eq $null){

                msiexec /i $gorelo:file.S1Installer SITE_TOKEN=$gorelo:client.s1token /quiet /norestart
               
          }
        }
        ```
      </Step>

      <Step title="Deploy the script via a policy.">
        1. Navigate to **[<u>Policies</u>](https://app.gorelo.io/Asset/policy-management)<u>.</u>**
        2. Edit an existing policy that covers the assets you want SentinelOne installed on.
        3. Add the **Install-SentinelOne** script and set to repeat daily at your preferred time.
        4. **Distribute** the policy.
      </Step>
    </Steps>
  </Tab>

  <Tab title="BitDefender">
    <Steps>
      <Step title="Create the client custom field.">
        1. Navigate to **Settings** > **CRM** > **[<u>Custom Fields</u>](https://app.gorelo.io/Admin/admin-settings#crm#clientcustomfields)<u>.</u>**
        2. Add custom field with the following details:
           * **Name**: Bitdefender URL
           * **Variable**: bitdefenderURL

        <Frame>
          <img src="https://mintcdn.com/gorelo/T3NJMN-hVMIJ4iQN/images/image-105.png?fit=max&auto=format&n=T3NJMN-hVMIJ4iQN&q=85&s=c3008e52a40d2950813499b65dc391f2" alt="Image" width="803" height="644" data-path="images/image-105.png" />
        </Frame>
      </Step>

      <Step title="Populate the BitDefender URL for each client.">
        1. Navigate to a specific client.
        2. Click **Custom Fields.**
                   <Frame>
                     <img src="https://mintcdn.com/gorelo/T3NJMN-hVMIJ4iQN/images/image-106.png?fit=max&auto=format&n=T3NJMN-hVMIJ4iQN&q=85&s=c1073ee7cec0fb54745993497c098996" alt="Image" width="699" height="914" data-path="images/image-106.png" />
                   </Frame>
        3. Edit **Bitdefender URL**.
        4. Enter the install exe URL retrieved from Bitdefender for each client.
                   <Frame>
                     <img src="https://mintcdn.com/gorelo/T3NJMN-hVMIJ4iQN/images/image-107.png?fit=max&auto=format&n=T3NJMN-hVMIJ4iQN&q=85&s=d8e2868ac6c7ec0192e2e2d1f1ce2064" alt="Image" width="704" height="414" data-path="images/image-107.png" />
                   </Frame>
                   <Tip>
                     Bitdefender URL for the install exe should look like this (fake example): `htttps://cloudgz.gravityzone.bitdefender.com/Packages/BSTWIN/0/setupdownloader_[aHR0cHM6Ly9jbG91ZGdLWDawWVjcy5ncR5em9uZS5iaXRkZWZl3ddwawGfawdmRlci5jb20vUGFja2FnZXMvQlNUV0lOLzAvdkluc3RhbGxlci54bw-bGFuZz1lbi1VUw==].exe`
                   </Tip>
      </Step>

      <Step title="Write the script.">
        1. Navigate to **[<u>Scripts</u>](https://app.gorelo.io/Asset/script-list)<u>.</u>**
        2. Create a script with the following details:
           * **Name**: Install-Bitdefender
           * **Content**:

        ```powershell theme={null}
        #$gorelo:client.bitdefenderURL

        # Check if Bitdefender is already installed
        if (Get-Service -Name "EPProtectedService" -ErrorAction SilentlyContinue) {
            Write-Host "Bitdefender is already installed. Skipping installation."
            exit 0
        }

        # Proceed with installation
        $url = $gorelo:client.bitdefenderURL
        $filename = Split-Path $url -Leaf
        $installer = Join-Path $env:TEMP $filename

        Write-Host "Downloading Bitdefender installer..."
        (New-Object System.Net.WebClient).DownloadFile($url, $installer)

        Write-Host "Installing Bitdefender..."
        Start-Process -FilePath $installer -ArgumentList "/silent" -Wait
        Remove-Item -LiteralPath $installer

        # Verify installation
        Start-Sleep -Seconds 10  # Give the service time to start
        $service = Get-Service -Name "EPProtectedService" -ErrorAction SilentlyContinue

        if ($service -and $service.Status -eq "Running") {
            Write-Host "Installation successful! EPProtectedService is running."
            exit 0
        } else {
            Write-Host "Installation may have failed. EPProtectedService not found or not running."
            exit 1
        }
        ```
      </Step>

      <Step title="Deploy the script via a policy.">
        1. Navigate to **[<u>Policies</u>](https://app.gorelo.io/Asset/policy-management)<u>.</u>**
        2. Edit an existing policy that covers the assets you want Bitdefender installed on.
        3. Add the **Install-Bitdefender** script and set to repeat daily at your preferred time.
        4. **Distribute** the policy.
      </Step>
    </Steps>
  </Tab>

  <Tab title="Webroot">
    <Steps>
      <Step title="Create the client custom field.">
        1. Navigate to **Settings** > **CRM** > **[<u>Custom Fields</u>](https://app.gorelo.io/Admin/admin-settings#crm#clientcustomfields)<u>.</u>**
        2. Add custom field with the following details:
           * **Name**: Webroot Key
           * **Variable**: webrootKey

        <Frame>
          <img src="https://mintcdn.com/gorelo/vclHs_96o-5AzbEe/images/image-102.png?fit=max&auto=format&n=vclHs_96o-5AzbEe&q=85&s=94afcc15964d77a73b1f06a85397187f" alt="Image" width="749" height="585" data-path="images/image-102.png" />
        </Frame>
      </Step>

      <Step title="Populate the Webroot key for each client.">
        1. Navigate to a specific client.
        2. Click **Custom Fields.**
                   <Frame>
                     <img src="https://mintcdn.com/gorelo/vclHs_96o-5AzbEe/images/image-103.png?fit=max&auto=format&n=vclHs_96o-5AzbEe&q=85&s=29d3f4f00950d7dabc7b019d6c81f7f0" alt="Image" width="699" height="914" data-path="images/image-103.png" />
                   </Frame>
        3. Edit **Webroot Key**.
        4. Enter the Webroot Key **[retrieved from Webroot](https://answers.webroot.com/Webroot/ukp.aspx?pid=17\&app=vw\&vw=1\&solutionid=984).**
                   <Frame>
                     <img src="https://mintcdn.com/gorelo/vclHs_96o-5AzbEe/images/image-104.png?fit=max&auto=format&n=vclHs_96o-5AzbEe&q=85&s=c340167502bfba8e2933ac0d7b68a23e" alt="Image" width="673" height="399" data-path="images/image-104.png" />
                   </Frame>
      </Step>

      <Step title="Create the installer file.">
        1. Navigate to **Settings** > Asset > **[<u>Files</u>](https://app.gorelo.io/Admin/admin-settings#asset#filerepository)<u>.</u>**
        2. Add a file with the following details:
           * **File**: Upload the latest MSI installer
           * **Variable**: webrootInstaller
      </Step>

      <Step title="Create the script.">
        1. Navigate to **[<u>Scripts</u>](https://app.gorelo.io/Asset/script-list)<u>.</u>**
        2. Create a script with the following details:
           * **Name**: Install-Webroot
           * **Content**:

        ```powershell theme={null}
        # Silently install Webroot
        if($gorelo:client.webrootKey){
            $WebrootService = Get-Service -Name 'WRSVC' -ErrorAction SilentlyContinue
            if($WebrootService -eq $null){
                msiexec /i $gorelo:file.webrootInstaller GUILIC=$gorelo:client.webrootKey CMDLINE=SME,quiet /qn /l*v install.log
            }
        }
        ```
      </Step>

      <Step title="Deploy the script via a policy">
        1. Navigate to **[<u>Policies</u>](https://app.gorelo.io/Asset/policy-management)<u>.</u>**
        2. Edit an existing policy that covers the assets you want Webroot installed on.
        3. Add the **Install-Webroot** script and set to repeat daily at your preferred time.
        4. **Distribute** the policy.

        Alternatively, you can add the script as a remediation step for a Service Check, for example:

        <Frame>
          <img src="https://mintcdn.com/gorelo/T3NJMN-hVMIJ4iQN/images/image-105.png?fit=max&auto=format&n=T3NJMN-hVMIJ4iQN&q=85&s=c3008e52a40d2950813499b65dc391f2" alt="Image" width="803" height="644" data-path="images/image-105.png" />
        </Frame>
      </Step>
    </Steps>
  </Tab>
</Tabs>
