Example of deployment scripts
The deployment can be divided into several steps:
- the installation of the application;
- the installation of the Outlook plugin (optional);
- the creation of accounts.
WARNING
Environment variables vary between 32-bit and 64-bit versions of Windows.
Installation of the application:
# Required when running with administrator rights.
cd %~dp0
# Seald's installation on the station in a silent way
Seald-Setup-1.0.0.exe /allusers /S
# Creation of the Seald configuration directory.
mkdir %APPDATA%\Seald\
# Adding the essential configuration after a program installation.
echo {"autoUpdate": "disable", "windowsRegistry": "READ_ONLY"} > %APPDATA%\Seald\config.json
Installing the Outlook plugin:
TIP
The environment variable %CommonProgramFiles%
must be replaced by %CommonProgramFiles(X86)%
if the version of Outlook is in 64 bits.
# Required when running with administrator rights.
cd %~dp0
# Adding the Seald signature certificate
certutil -addstore TRUSTEDPUBLISHER "plugin-cert.cer"
# Installation of plugin prerequisites
.\vstor_redist.exe Setup /q /norestart #Installing VSTO redistributable
.\NDP472-KB4054530-x86-x64-x86-x64-AllOS-ENU.exe Setup /q /norestart # Installing.NET 4.7
# Plugin installation
# %CommonProgramFiles% if Outlook 32 bits. %CommonProgramFiles(X86)% if Outlook 64 bits
"%CommonProgramFiles%\Microsoft Shared\VSTO\10.0\VSTOInstaller.exe" /s /I https://api.seald.io/outlook-v2/SealdOutlookPlugin.vsto # silent installation command for the outlook plugin
Smart Assistant rules deployment
It is possible to deploy a custom rule file for the Smart Assistant using the following command:
copy new-rules.js %APPDATA%\Seald\rules.js
TIP
For more information on writing and deploying the rule file, refer to this page
TIP
To activate the rules programmatically, refer to the plugin configuration help.
Create an account and launch:
TIP
The environment variable %ProgramFiles%
must be replaced by %ProgramFilesX86%
if the version of Windows is in 64 bits.
# Create an account.
cd %ProgramFiles%\Seald
seald-cli create-account -d "Tim" -e tim@seald.io --email-validation 5f32fdb5-cb1d-4b1b-b981-d35f75e9376c:1b4e5537890f92cce85d86df22eergerg4 --accept-licence --force --accept-backup-keys
# Launch the application. The first argument (empty string) allows the process not to be stopped at the end of this script
start "" "%ProgramFiles%\Seald\Seald.exe"
Example of account creation script generation
This snippet script was written for Node.js 14 LTS, and is based on the csv@5.3.2
package in addition to the standard library. Adjustments are certainly necessary depending on the target environment:
const csv = require('csv')
const fs = require('fs')
const { promisify } = require('util')
const crypto = require('crypto')
const path = require('path')
const csvPath = './mails.csv' // CSV with the "Display name" in the first colum, and the "Email address" in the second column, separated with ";"
const domainValidationKeyId = process.env.DOMAIN_ID
const domainValidationKey = process.env.DOMAIN_KEY
const outputDir = './out'
try {
fs.rmdirSync(outputDir, { recursive: true })
} catch (err) {
console.warn(err)
console.warn('directory outputDir does not exist')
} finally {
fs.mkdirSync(outputDir, { recursive: true })
}
const random = (size = 1000) => crypto.randomBytes(size)
const scrypt = (buff, salt) => new Promise((resolve, reject) => {
crypto.scrypt(
buff,
salt,
64, // 64 bytes for a 256 bits key (there is also a signing key for HMAC)
{ N: 16384, r: 8, p: 1 },
(err, key) => {
if (err) reject(err)
else resolve(key)
}
)
})
const generate = async (email, domainValidationKeyId, domainValidationKey) => {
const nonce = random(32).toString('hex')
const token = (await scrypt(
Buffer.from(`${email}-${domainValidationKey}`, 'utf8'),
Buffer.from(nonce, 'utf8')
)).toString('hex')
}
const makeScript = (displayName, emailAddress) =>
`"%LOCALAPPDATA%\\Programs\\Seald\\Seald.exe" --headless create-account -d "${displayName.replace('"', '\\"')}" -e "${emailAddress.replace('"', '\\"')}" --email-validation ${generate(emailAddress, domainValidationKeyId, domainValidationKey)} --accept-backup-keys --accept-licence --force
start "" "%LOCALAPPDATA%\\Programs\\Seald\\Seald.exe"`
const main = async () => {
const result = await promisify(csv.parse)(fs.readFileSync(csvPath), { delimiter: ';' })
result.shift() // remove header
for (const [displayName, emailAddress] of result) {
// Writes indiviual script for each user to be executed on each machine
fs.writeFileSync(path.join(outputDir, emailAddress + '.bat'), makeScript(displayName, emailAddress).replace('\n', '\r\n'))
}
}
main()