├── .devcontainer ├── Dockerfile └── devcontainer.json ├── .github └── workflows │ └── vitepress-deploy.yml ├── .gitignore ├── .unotes └── unotes_meta.json ├── .vitepress ├── config.mts ├── images │ ├── 2020-12-07-15-46-18.png │ ├── 2020-12-07-15-47-07.png │ ├── 2020-12-07-15-47-18.png │ ├── 2020-12-07-15-47-33.png │ ├── 2020-12-07-15-47-40.png │ ├── 2020-12-07-15-47-49.png │ ├── 2020-12-07-15-47-52.png │ ├── 2020-12-07-15-48-05.png │ ├── 2020-12-07-15-48-10.png │ ├── 2020-12-07-15-48-22.png │ ├── 2020-12-07-15-48-26.png │ ├── 2020-12-07-15-48-31.png │ ├── 2020-12-07-15-48-35.png │ ├── 2020-12-07-15-48-38.png │ ├── 2021-02-23-05-49-03.png │ ├── 2021-02-23-06-14-05.png │ ├── 2021-02-23-06-18-23.png │ ├── 2021-02-23-06-34-22.png │ ├── 2021-02-23-06-44-25.png │ ├── 2021-02-23-06-45-47.png │ ├── 2021-02-23-06-51-47.png │ ├── 2021-02-23-07-14-24.png │ ├── 2021-02-23-07-20-20.png │ ├── 2021-02-23-07-22-31.png │ ├── 2021-02-23-07-24-17.png │ ├── 2021-02-23-07-28-08.png │ ├── 2021-02-23-08-05-57.png │ ├── 2021-02-23-08-06-49.png │ ├── 2021-02-23-08-08-16.png │ ├── 2021-02-23-08-08-39.png │ ├── 2021-02-23-08-13-18.png │ ├── 2021-02-23-08-22-00.png │ ├── 2021-02-23-08-46-09.png │ ├── 2021-02-23-08-47-36.png │ ├── 2021-02-23-09-15-27.png │ ├── 2021-02-23-09-18-04.png │ ├── 2021-02-23-09-44-51.png │ ├── 2021-02-23-09-46-59.png │ ├── 2021-02-24-05-54-53.png │ ├── 2021-02-24-05-55-20.png │ ├── 2021-03-01-08-25-24.png │ ├── 2021-03-01-08-35-49.png │ ├── 2021-03-01-08-42-41.png │ ├── 2021-03-01-08-44-19.png │ ├── 2021-03-01-08-51-38.png │ ├── 2021-03-01-14-17-29.png │ ├── 2021-03-15-08-26-56.png │ ├── 2021-03-15-08-27-10.png │ ├── 2021-03-15-08-27-20.png │ ├── 2021-03-15-08-27-29.png │ ├── 2021-03-15-08-29-07.png │ ├── 2021-03-15-08-29-35.png │ ├── 2021-03-15-08-29-41.png │ ├── 2021-03-15-08-29-52.png │ ├── 2021-03-15-08-29-57.png │ ├── 2021-03-15-08-30-04.png │ ├── 2021-03-15-08-30-29.png │ ├── 2021-03-15-08-37-29.png │ ├── 2021-03-15-08-37-36.png │ ├── 2021-03-15-08-37-50.png │ ├── 2021-03-15-08-47-28.png │ ├── 2021-03-23-14-26-14.png │ ├── 2021-03-23-14-28-30.png │ ├── 2021-03-23-14-30-41.png │ ├── 2021-03-23-14-32-00.png │ ├── 2021-03-23-14-43-35.png │ ├── 2021-03-23-14-44-05.png │ ├── 2021-03-23-15-05-59.png │ ├── 2021-03-23-15-14-46.png │ ├── 2021-03-23-15-16-29.png │ ├── 2021-03-23-15-17-04.png │ ├── 2021-03-23-15-17-43.png │ ├── 2021-03-23-15-18-39.png │ ├── 2021-03-23-15-19-31.png │ ├── 2021-03-23-16-14-24.png │ ├── 2021-03-23-16-17-28.png │ ├── 2021-03-23-16-18-19.png │ ├── 2021-03-23-16-19-01.png │ ├── 2021-03-23-16-30-41.png │ ├── 2021-03-23-18-35-28.png │ ├── 2021-03-23-18-35-49.png │ ├── 2021-03-23-18-39-00.png │ ├── 2021-03-23-18-57-19.png │ ├── 2021-03-23-18-59-10.png │ ├── 2021-03-23-18-59-44.png │ ├── 2021-03-23-19-00-04.png │ ├── 2021-03-23-19-01-36.png │ ├── 2021-03-23-19-03-33.png │ ├── 2021-03-23-19-06-55.png │ ├── 2021-03-23-19-08-30.png │ ├── 2021-03-23-19-12-34.png │ ├── 2021-03-23-19-13-56.png │ ├── 2021-03-23-19-17-38.png │ ├── 2021-03-23-19-21-03.png │ ├── 2021-03-23-19-24-06.png │ ├── 2021-03-24-11-18-30.png │ ├── 2021-08-16-13-19-15.png │ ├── 2021-08-16-13-20-45.png │ ├── 2021-08-16-13-23-26.png │ ├── 2022-01-26-00-09-33.png │ ├── 2022-01-26-00-11-38.png │ ├── 2022-02-23_15-00-31.png │ ├── 2022-12-12_10-42-55.png │ ├── 2022-12-12_11-26-00.png │ ├── 2022-12-12_11-41-18.png │ ├── 2022-12-12_11-44-58.png │ ├── 2022-12-12_12-10-21.png │ ├── LoginImg1.png │ ├── LoginImg2.png │ ├── LoginImg3.png │ ├── LoginImg6-1024x100.png │ ├── LoginImg7.png │ ├── Loginimg4.png │ ├── connectsecuredocs │ │ ├── ApiUser_Step01.png │ │ ├── ApiUser_Step02.png │ │ ├── ApiUser_Step03.png │ │ ├── Integration_Step01.png │ │ ├── Integration_Step02.png │ │ ├── PodURL_Step01.png │ │ └── PodURL_Step02.png │ ├── image-1.png │ ├── manage-sc.png │ └── ncentraldocs │ │ ├── add_automation_policy_1.png │ │ ├── add_automation_policy_2.png │ │ ├── add_automation_policy_3.png │ │ ├── add_integration_guide_1.png │ │ ├── add_integration_guide_2.png │ │ ├── add_integration_guide_new_1.png │ │ ├── add_user_guide_1.png │ │ ├── add_userrole_guide_1.png │ │ ├── add_userrole_guide_2.png │ │ ├── login_mfa_guide_1.png │ │ └── new_add_user_guide_1.png └── theme │ ├── immy.css │ ├── index.ts │ └── style.css ├── .vscode ├── extensions.json ├── launch.json ├── settings.json └── tasks.json ├── FAQ.md ├── README.md ├── add-users.md ├── azure-graph-permissions-setup.md ├── build-your-own-integration.md ├── connectsecure-integration-setup.md ├── connectwise-automate-integration-setup.md ├── connectwise-control-integration-setup.md ├── connectwise-manage-integration-setup.md ├── getting-started.md ├── halo-integration-setup.md ├── image-1.png ├── image-10.png ├── image-2.png ├── image-3.png ├── image-4.png ├── image-5.png ├── image-6.png ├── image-7.png ├── image.png ├── immy-commands.md ├── index.md ├── markdown-examples.md ├── ncentral-integration-setup.md ├── ninjarmm-integration-setup.md ├── old-ncentral-integration-setup.md ├── onboarding.md ├── package.json ├── public ├── ImmyBotRunScriptV2.amp ├── favicon.ico ├── immybot-glasses.png └── logo-256x256.png ├── recommended-deployments.md ├── releases-2020.md ├── releases-2021.md ├── releases-2022.md ├── releases.md ├── scripts.md ├── terminology.md ├── troubleshooting.md ├── user-roles.md ├── windows-sandbox.md └── yarn.lock /.devcontainer/Dockerfile: -------------------------------------------------------------------------------- 1 | # See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/v0.158.0/containers/alpine/.devcontainer/base.Dockerfile 2 | 3 | # [Choice] Alpine version: 3.12, 3.11, 3.10 4 | ARG VARIANT="3.12" 5 | FROM mcr.microsoft.com/vscode/devcontainers/base:0-alpine-${VARIANT} 6 | 7 | # ** [Optional] Uncomment this section to install additional packages. ** 8 | RUN apk update \ 9 | && apk add --no-cache nodejs yarn -------------------------------------------------------------------------------- /.devcontainer/devcontainer.json: -------------------------------------------------------------------------------- 1 | // For format details, see https://aka.ms/devcontainer.json. For config options, see the README at: 2 | // https://github.com/microsoft/vscode-dev-containers/tree/v0.158.0/containers/alpine 3 | { 4 | "name": "Alpine", 5 | "build": { 6 | "dockerfile": "Dockerfile", 7 | // Update 'VARIANT' to pick an Alpine version: 3.10, 3.11, 3.12 8 | "args": { "VARIANT": "3.12" } 9 | }, 10 | 11 | // Set *default* container specific settings.json values on container create. 12 | 13 | "customizations": { 14 | "vscode": { 15 | "extensions": ["telesoho.vscode-markdown-paste-image", "docsmsft.docs-markdown", "vue.volar"], 16 | "settings": { 17 | "terminal.integrated.shell.linux": "/bin/ash" 18 | } 19 | } 20 | }, 21 | 22 | // Add the IDs of extensions you want installed when the container is created. 23 | // Note that some extensions may not work in Alpine Linux. See https://aka.ms/vscode-remote/linux. 24 | 25 | // Use 'forwardPorts' to make a list of ports inside the container available locally. 26 | "forwardPorts": [8080, 8081], 27 | 28 | // Use 'postCreateCommand' to run commands after the container is created. 29 | // "postCreateCommand": "uname -a", 30 | 31 | // Uncomment when using a ptrace-based debugger like C++, Go, and Rust 32 | // "runArgs": [ "--cap-add=SYS_PTRACE", "--security-opt", "seccomp=unconfined" ], 33 | 34 | // Comment out connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root. 35 | "remoteUser": "vscode" 36 | } -------------------------------------------------------------------------------- /.github/workflows/vitepress-deploy.yml: -------------------------------------------------------------------------------- 1 | name: Build and Deploy 2 | on: 3 | push: 4 | branches: 5 | - main 6 | permissions: 7 | contents: write 8 | jobs: 9 | build-and-deploy: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - name: Checkout 🛎️ 13 | uses: actions/checkout@v3 # If you're using actions/checkout@v2 you must set persist-credentials to false in most cases for the deployment to work correctly. 14 | - name: Install and Build 🔧 # This example project is built using npm and outputs the result to the 'build' folder. Replace with the commands required to build your project, or remove this step entirely if your site is pre-built. 15 | run: | 16 | yarn install 17 | yarn docs:build 18 | env: 19 | NODE_OPTIONS: "--openssl-legacy-provider" 20 | - name: Deploy 🚀 21 | uses: JamesIves/github-pages-deploy-action@v4 22 | with: 23 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 24 | BRANCH: gh-pages # The branch the action should deploy to. 25 | FOLDER: .vitepress/dist # The folder the action should deploy. 26 | CLEAN: true # Automatically remove deleted files from the deploy branch 27 | 28 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | pids 2 | logs 3 | node_modules 4 | npm-debug.log 5 | coverage/ 6 | run 7 | dist 8 | .DS_Store 9 | .nyc_output 10 | .basement 11 | config.local.js 12 | basement_dist 13 | .vs/ 14 | .vitepress/cache 15 | .vitepress/dist -------------------------------------------------------------------------------- /.unotes/unotes_meta.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "", 3 | "isOrdered": true, 4 | "folders": { 5 | "src": { 6 | "name": "src", 7 | "isOrdered": true, 8 | "folders": { 9 | "guide": { 10 | "name": "guide", 11 | "isOrdered": true, 12 | "folders": {}, 13 | "files": { 14 | "connectwise-control-integration-setup": 0, 15 | "connectwise-automate-integration-setup": 1, 16 | "connectwise-manage-integration-setup": 2, 17 | "csp-preconsent-instructions": 3, 18 | "immy-commands": 4, 19 | "introduction": 5, 20 | "releases": 6, 21 | "scripts": 7 22 | } 23 | } 24 | }, 25 | "files": { 26 | "index": 0 27 | } 28 | } 29 | }, 30 | "files": { 31 | "README": 0 32 | } 33 | } -------------------------------------------------------------------------------- /.vitepress/config.mts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vitepress'; 2 | import { withMermaid } from "vitepress-plugin-mermaid"; 3 | 4 | // https://vitepress.dev/reference/site-config 5 | export default withMermaid({ 6 | title: "immy.bot", 7 | head: [ 8 | ['link', { rel: 'icon', href: '/favicon.ico' }], 9 | [ 10 | 'script', 11 | {}, 12 | `(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 13 | new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 14 | j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 15 | 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 16 | })(window,document,'script','dataLayer','GTM-PF34XF88');` 17 | ] 18 | ], 19 | description: "A documentation suite for all things ImmyBot", 20 | sitemap: { 21 | hostname: 'https://docs.immy.bot' 22 | }, 23 | themeConfig: { 24 | logo: '/immybot-glasses.png', 25 | // https://vitepress.dev/reference/default-theme-config 26 | sidebar: [ 27 | { 28 | text: 'Introduction', 29 | collapsed: false, 30 | items: [ 31 | { text: 'Getting Started', link: '/getting-started' }, 32 | { text: 'What\'s New', link: '/releases' }, 33 | { text: 'Add Users', link: './add-users' }, 34 | { text: 'Onboarding', link: './onboarding' }, 35 | { text: 'Recommended Deployments', link: './recommended-deployments' }, 36 | { text: 'Terminology', link: './terminology' }, 37 | { text: 'Troubleshooting', link: './troubleshooting' }, 38 | { text: 'User Roles', link: './user-roles' }, 39 | { text: 'Windows Sandbox', link: './windows-sandbox' }, 40 | ], 41 | }, 42 | { 43 | text: 'Integrations', 44 | collapsed: false, 45 | items: [ 46 | { text: 'Build Your Own', link: '/build-your-own-integration' }, 47 | { text: 'ConnectSecure', link: '/connectsecure-integration-setup' }, 48 | { text: 'ConnectWise Automate', link: '/connectwise-automate-integration-setup' }, 49 | { text: 'ConnectWise Control', link: '/connectwise-control-integration-setup' }, 50 | { text: 'ConnectWise Manage', link: '/connectwise-manage-integration-setup' }, 51 | { text: 'N-Central', link: '/ncentral-integration-setup' }, 52 | { text: 'NinjaRMM', link: '/ninjarmm-integration-setup' }, 53 | { text: 'HaloPSA', link: '/halo-integration-setup' }, 54 | { text: 'Azure', link: '/azure-graph-permissions-setup' }, 55 | ], 56 | }, 57 | { 58 | text: 'Advanced', 59 | collapsed: false, 60 | items: [ 61 | { text: 'Scripting Guide', link: '/scripts' }, 62 | { text: 'Metascripts / Cloud Scripts', link: '/immy-commands' }, 63 | ], 64 | }, 65 | { text: 'Frequently Asked Questions', link: '/FAQ' }, 66 | ], 67 | 68 | socialLinks: [ 69 | { icon: 'github', link: 'https://github.com/immense/immybot-documentation' } 70 | ], 71 | search: { 72 | provider: 'algolia', 73 | options: { 74 | apiKey: "e84eee7e1fa61571b3814adfcb2a70f2", 75 | indexName: "immy", 76 | appId: 'SU6GB55GXI', 77 | } 78 | } 79 | }, 80 | ignoreDeadLinks: true 81 | }); 82 | -------------------------------------------------------------------------------- /.vitepress/images/2020-12-07-15-46-18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2020-12-07-15-46-18.png -------------------------------------------------------------------------------- /.vitepress/images/2020-12-07-15-47-07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2020-12-07-15-47-07.png -------------------------------------------------------------------------------- /.vitepress/images/2020-12-07-15-47-18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2020-12-07-15-47-18.png -------------------------------------------------------------------------------- /.vitepress/images/2020-12-07-15-47-33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2020-12-07-15-47-33.png -------------------------------------------------------------------------------- /.vitepress/images/2020-12-07-15-47-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2020-12-07-15-47-40.png -------------------------------------------------------------------------------- /.vitepress/images/2020-12-07-15-47-49.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2020-12-07-15-47-49.png -------------------------------------------------------------------------------- /.vitepress/images/2020-12-07-15-47-52.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2020-12-07-15-47-52.png -------------------------------------------------------------------------------- /.vitepress/images/2020-12-07-15-48-05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2020-12-07-15-48-05.png -------------------------------------------------------------------------------- /.vitepress/images/2020-12-07-15-48-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2020-12-07-15-48-10.png -------------------------------------------------------------------------------- /.vitepress/images/2020-12-07-15-48-22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2020-12-07-15-48-22.png -------------------------------------------------------------------------------- /.vitepress/images/2020-12-07-15-48-26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2020-12-07-15-48-26.png -------------------------------------------------------------------------------- /.vitepress/images/2020-12-07-15-48-31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2020-12-07-15-48-31.png -------------------------------------------------------------------------------- /.vitepress/images/2020-12-07-15-48-35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2020-12-07-15-48-35.png -------------------------------------------------------------------------------- /.vitepress/images/2020-12-07-15-48-38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2020-12-07-15-48-38.png -------------------------------------------------------------------------------- /.vitepress/images/2021-02-23-05-49-03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-02-23-05-49-03.png -------------------------------------------------------------------------------- /.vitepress/images/2021-02-23-06-14-05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-02-23-06-14-05.png -------------------------------------------------------------------------------- /.vitepress/images/2021-02-23-06-18-23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-02-23-06-18-23.png -------------------------------------------------------------------------------- /.vitepress/images/2021-02-23-06-34-22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-02-23-06-34-22.png -------------------------------------------------------------------------------- /.vitepress/images/2021-02-23-06-44-25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-02-23-06-44-25.png -------------------------------------------------------------------------------- /.vitepress/images/2021-02-23-06-45-47.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-02-23-06-45-47.png -------------------------------------------------------------------------------- /.vitepress/images/2021-02-23-06-51-47.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-02-23-06-51-47.png -------------------------------------------------------------------------------- /.vitepress/images/2021-02-23-07-14-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-02-23-07-14-24.png -------------------------------------------------------------------------------- /.vitepress/images/2021-02-23-07-20-20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-02-23-07-20-20.png -------------------------------------------------------------------------------- /.vitepress/images/2021-02-23-07-22-31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-02-23-07-22-31.png -------------------------------------------------------------------------------- /.vitepress/images/2021-02-23-07-24-17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-02-23-07-24-17.png -------------------------------------------------------------------------------- /.vitepress/images/2021-02-23-07-28-08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-02-23-07-28-08.png -------------------------------------------------------------------------------- /.vitepress/images/2021-02-23-08-05-57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-02-23-08-05-57.png -------------------------------------------------------------------------------- /.vitepress/images/2021-02-23-08-06-49.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-02-23-08-06-49.png -------------------------------------------------------------------------------- /.vitepress/images/2021-02-23-08-08-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-02-23-08-08-16.png -------------------------------------------------------------------------------- /.vitepress/images/2021-02-23-08-08-39.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-02-23-08-08-39.png -------------------------------------------------------------------------------- /.vitepress/images/2021-02-23-08-13-18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-02-23-08-13-18.png -------------------------------------------------------------------------------- /.vitepress/images/2021-02-23-08-22-00.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-02-23-08-22-00.png -------------------------------------------------------------------------------- /.vitepress/images/2021-02-23-08-46-09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-02-23-08-46-09.png -------------------------------------------------------------------------------- /.vitepress/images/2021-02-23-08-47-36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-02-23-08-47-36.png -------------------------------------------------------------------------------- /.vitepress/images/2021-02-23-09-15-27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-02-23-09-15-27.png -------------------------------------------------------------------------------- /.vitepress/images/2021-02-23-09-18-04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-02-23-09-18-04.png -------------------------------------------------------------------------------- /.vitepress/images/2021-02-23-09-44-51.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-02-23-09-44-51.png -------------------------------------------------------------------------------- /.vitepress/images/2021-02-23-09-46-59.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-02-23-09-46-59.png -------------------------------------------------------------------------------- /.vitepress/images/2021-02-24-05-54-53.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-02-24-05-54-53.png -------------------------------------------------------------------------------- /.vitepress/images/2021-02-24-05-55-20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-02-24-05-55-20.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-01-08-25-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-01-08-25-24.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-01-08-35-49.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-01-08-35-49.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-01-08-42-41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-01-08-42-41.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-01-08-44-19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-01-08-44-19.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-01-08-51-38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-01-08-51-38.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-01-14-17-29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-01-14-17-29.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-15-08-26-56.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-15-08-26-56.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-15-08-27-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-15-08-27-10.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-15-08-27-20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-15-08-27-20.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-15-08-27-29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-15-08-27-29.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-15-08-29-07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-15-08-29-07.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-15-08-29-35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-15-08-29-35.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-15-08-29-41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-15-08-29-41.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-15-08-29-52.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-15-08-29-52.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-15-08-29-57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-15-08-29-57.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-15-08-30-04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-15-08-30-04.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-15-08-30-29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-15-08-30-29.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-15-08-37-29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-15-08-37-29.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-15-08-37-36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-15-08-37-36.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-15-08-37-50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-15-08-37-50.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-15-08-47-28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-15-08-47-28.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-23-14-26-14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-23-14-26-14.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-23-14-28-30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-23-14-28-30.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-23-14-30-41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-23-14-30-41.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-23-14-32-00.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-23-14-32-00.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-23-14-43-35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-23-14-43-35.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-23-14-44-05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-23-14-44-05.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-23-15-05-59.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-23-15-05-59.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-23-15-14-46.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-23-15-14-46.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-23-15-16-29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-23-15-16-29.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-23-15-17-04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-23-15-17-04.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-23-15-17-43.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-23-15-17-43.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-23-15-18-39.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-23-15-18-39.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-23-15-19-31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-23-15-19-31.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-23-16-14-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-23-16-14-24.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-23-16-17-28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-23-16-17-28.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-23-16-18-19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-23-16-18-19.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-23-16-19-01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-23-16-19-01.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-23-16-30-41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-23-16-30-41.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-23-18-35-28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-23-18-35-28.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-23-18-35-49.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-23-18-35-49.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-23-18-39-00.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-23-18-39-00.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-23-18-57-19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-23-18-57-19.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-23-18-59-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-23-18-59-10.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-23-18-59-44.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-23-18-59-44.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-23-19-00-04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-23-19-00-04.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-23-19-01-36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-23-19-01-36.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-23-19-03-33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-23-19-03-33.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-23-19-06-55.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-23-19-06-55.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-23-19-08-30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-23-19-08-30.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-23-19-12-34.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-23-19-12-34.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-23-19-13-56.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-23-19-13-56.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-23-19-17-38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-23-19-17-38.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-23-19-21-03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-23-19-21-03.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-23-19-24-06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-23-19-24-06.png -------------------------------------------------------------------------------- /.vitepress/images/2021-03-24-11-18-30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-03-24-11-18-30.png -------------------------------------------------------------------------------- /.vitepress/images/2021-08-16-13-19-15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-08-16-13-19-15.png -------------------------------------------------------------------------------- /.vitepress/images/2021-08-16-13-20-45.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-08-16-13-20-45.png -------------------------------------------------------------------------------- /.vitepress/images/2021-08-16-13-23-26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2021-08-16-13-23-26.png -------------------------------------------------------------------------------- /.vitepress/images/2022-01-26-00-09-33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2022-01-26-00-09-33.png -------------------------------------------------------------------------------- /.vitepress/images/2022-01-26-00-11-38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2022-01-26-00-11-38.png -------------------------------------------------------------------------------- /.vitepress/images/2022-02-23_15-00-31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2022-02-23_15-00-31.png -------------------------------------------------------------------------------- /.vitepress/images/2022-12-12_10-42-55.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2022-12-12_10-42-55.png -------------------------------------------------------------------------------- /.vitepress/images/2022-12-12_11-26-00.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2022-12-12_11-26-00.png -------------------------------------------------------------------------------- /.vitepress/images/2022-12-12_11-41-18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2022-12-12_11-41-18.png -------------------------------------------------------------------------------- /.vitepress/images/2022-12-12_11-44-58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2022-12-12_11-44-58.png -------------------------------------------------------------------------------- /.vitepress/images/2022-12-12_12-10-21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/2022-12-12_12-10-21.png -------------------------------------------------------------------------------- /.vitepress/images/LoginImg1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/LoginImg1.png -------------------------------------------------------------------------------- /.vitepress/images/LoginImg2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/LoginImg2.png -------------------------------------------------------------------------------- /.vitepress/images/LoginImg3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/LoginImg3.png -------------------------------------------------------------------------------- /.vitepress/images/LoginImg6-1024x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/LoginImg6-1024x100.png -------------------------------------------------------------------------------- /.vitepress/images/LoginImg7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/LoginImg7.png -------------------------------------------------------------------------------- /.vitepress/images/Loginimg4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/Loginimg4.png -------------------------------------------------------------------------------- /.vitepress/images/connectsecuredocs/ApiUser_Step01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/connectsecuredocs/ApiUser_Step01.png -------------------------------------------------------------------------------- /.vitepress/images/connectsecuredocs/ApiUser_Step02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/connectsecuredocs/ApiUser_Step02.png -------------------------------------------------------------------------------- /.vitepress/images/connectsecuredocs/ApiUser_Step03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/connectsecuredocs/ApiUser_Step03.png -------------------------------------------------------------------------------- /.vitepress/images/connectsecuredocs/Integration_Step01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/connectsecuredocs/Integration_Step01.png -------------------------------------------------------------------------------- /.vitepress/images/connectsecuredocs/Integration_Step02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/connectsecuredocs/Integration_Step02.png -------------------------------------------------------------------------------- /.vitepress/images/connectsecuredocs/PodURL_Step01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/connectsecuredocs/PodURL_Step01.png -------------------------------------------------------------------------------- /.vitepress/images/connectsecuredocs/PodURL_Step02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/connectsecuredocs/PodURL_Step02.png -------------------------------------------------------------------------------- /.vitepress/images/image-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/image-1.png -------------------------------------------------------------------------------- /.vitepress/images/manage-sc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/manage-sc.png -------------------------------------------------------------------------------- /.vitepress/images/ncentraldocs/add_automation_policy_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/ncentraldocs/add_automation_policy_1.png -------------------------------------------------------------------------------- /.vitepress/images/ncentraldocs/add_automation_policy_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/ncentraldocs/add_automation_policy_2.png -------------------------------------------------------------------------------- /.vitepress/images/ncentraldocs/add_automation_policy_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/ncentraldocs/add_automation_policy_3.png -------------------------------------------------------------------------------- /.vitepress/images/ncentraldocs/add_integration_guide_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/ncentraldocs/add_integration_guide_1.png -------------------------------------------------------------------------------- /.vitepress/images/ncentraldocs/add_integration_guide_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/ncentraldocs/add_integration_guide_2.png -------------------------------------------------------------------------------- /.vitepress/images/ncentraldocs/add_integration_guide_new_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/ncentraldocs/add_integration_guide_new_1.png -------------------------------------------------------------------------------- /.vitepress/images/ncentraldocs/add_user_guide_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/ncentraldocs/add_user_guide_1.png -------------------------------------------------------------------------------- /.vitepress/images/ncentraldocs/add_userrole_guide_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/ncentraldocs/add_userrole_guide_1.png -------------------------------------------------------------------------------- /.vitepress/images/ncentraldocs/add_userrole_guide_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/ncentraldocs/add_userrole_guide_2.png -------------------------------------------------------------------------------- /.vitepress/images/ncentraldocs/login_mfa_guide_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/ncentraldocs/login_mfa_guide_1.png -------------------------------------------------------------------------------- /.vitepress/images/ncentraldocs/new_add_user_guide_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/images/ncentraldocs/new_add_user_guide_1.png -------------------------------------------------------------------------------- /.vitepress/theme/immy.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/.vitepress/theme/immy.css -------------------------------------------------------------------------------- /.vitepress/theme/index.ts: -------------------------------------------------------------------------------- 1 | // https://vitepress.dev/guide/custom-theme 2 | import { h } from 'vue'; 3 | import Theme from 'vitepress/theme'; 4 | import './style.css'; 5 | import './immy.css'; 6 | 7 | export default { 8 | extends: Theme, 9 | Layout: () => { 10 | return h(Theme.Layout, null, { 11 | // https://vitepress.dev/guide/extending-default-theme#layout-slots 12 | }); 13 | }, 14 | enhanceApp({ app, router, siteData }) { 15 | // ... 16 | } 17 | }; 18 | -------------------------------------------------------------------------------- /.vitepress/theme/style.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Customize default theme styling by overriding CSS variables: 3 | * https://github.com/vuejs/vitepress/blob/main/src/client/theme-default/styles/vars.css 4 | */ 5 | 6 | /** 7 | * Colors 8 | * 9 | * Each colors have exact same color scale system with 3 levels of solid 10 | * colors with different brightness, and 1 soft color. 11 | * 12 | * - `XXX-1`: The most solid color used mainly for colored text. It must 13 | * satisfy the contrast ratio against when used on top of `XXX-soft`. 14 | * 15 | * - `XXX-2`: The color used mainly for hover state of the button. 16 | * 17 | * - `XXX-3`: The color for solid background, such as bg color of the button. 18 | * It must satisfy the contrast ratio with pure white (#ffffff) text on 19 | * top of it. 20 | * 21 | * - `XXX-soft`: The color used for subtle background such as custom container 22 | * or badges. It must satisfy the contrast ratio when putting `XXX-1` colors 23 | * on top of it. 24 | * 25 | * The soft color must be semi transparent alpha channel. This is crucial 26 | * because it allows adding multiple "soft" colors on top of each other 27 | * to create a accent, such as when having inline code block inside 28 | * custom containers. 29 | * 30 | * - `default`: The color used purely for subtle indication without any 31 | * special meanings attched to it such as bg color for menu hover state. 32 | * 33 | * - `brand`: Used for primary brand colors, such as link text, button with 34 | * brand theme, etc. 35 | * 36 | * - `tip`: Used to indicate useful information. The default theme uses the 37 | * brand color for this by default. 38 | * 39 | * - `warning`: Used to indicate warning to the users. Used in custom 40 | * container, badges, etc. 41 | * 42 | * - `danger`: Used to show error, or dangerous message to the users. Used 43 | * in custom container, badges, etc. 44 | * -------------------------------------------------------------------------- */ 45 | 46 | :root { 47 | --vp-c-default-1: var(--vp-c-gray-1); 48 | --vp-c-default-2: var(--vp-c-gray-2); 49 | --vp-c-default-3: var(--vp-c-gray-3); 50 | --vp-c-default-soft: var(--vp-c-gray-soft); 51 | 52 | --vp-c-brand-1: var(--vp-c-indigo-1); 53 | --vp-c-brand-2: var(--vp-c-indigo-2); 54 | --vp-c-brand-3: var(--vp-c-indigo-3); 55 | --vp-c-brand-soft: var(--vp-c-indigo-soft); 56 | 57 | --vp-c-tip-1: var(--vp-c-brand-1); 58 | --vp-c-tip-2: var(--vp-c-brand-2); 59 | --vp-c-tip-3: var(--vp-c-brand-3); 60 | --vp-c-tip-soft: var(--vp-c-brand-soft); 61 | 62 | --vp-c-warning-1: var(--vp-c-yellow-1); 63 | --vp-c-warning-2: var(--vp-c-yellow-2); 64 | --vp-c-warning-3: var(--vp-c-yellow-3); 65 | --vp-c-warning-soft: var(--vp-c-yellow-soft); 66 | 67 | --vp-c-danger-1: var(--vp-c-red-1); 68 | --vp-c-danger-2: var(--vp-c-red-2); 69 | --vp-c-danger-3: var(--vp-c-red-3); 70 | --vp-c-danger-soft: var(--vp-c-red-soft); 71 | 72 | --vp-home-hero-name-background: var(--vp-c-text-1); 73 | --vp-home-hero-image-background-image: none; 74 | 75 | } 76 | 77 | /** 78 | * Component: Button 79 | * -------------------------------------------------------------------------- */ 80 | 81 | :root { 82 | --vp-button-brand-border: transparent; 83 | --vp-button-brand-text: var(--vp-c-white); 84 | --vp-button-brand-bg: var(--vp-c-brand-3); 85 | --vp-button-brand-hover-border: transparent; 86 | --vp-button-brand-hover-text: var(--vp-c-white); 87 | --vp-button-brand-hover-bg: var(--vp-c-brand-2); 88 | --vp-button-brand-active-border: transparent; 89 | --vp-button-brand-active-text: var(--vp-c-white); 90 | --vp-button-brand-active-bg: var(--vp-c-brand-1); 91 | } 92 | 93 | /** 94 | * Component: Home 95 | * -------------------------------------------------------------------------- */ 96 | 97 | :root { 98 | --vp-home-hero-name-color: transparent; 99 | --vp-home-hero-name-background: var(--vp-c-text-1); 100 | 101 | --vp-home-hero-image-background-image: none; 102 | --vp-home-hero-image-filter: blur(40px); 103 | } 104 | 105 | @media (min-width: 640px) { 106 | :root { 107 | --vp-home-hero-image-filter: blur(56px); 108 | } 109 | } 110 | 111 | @media (min-width: 960px) { 112 | :root { 113 | --vp-home-hero-image-filter: blur(72px); 114 | } 115 | } 116 | 117 | /** 118 | * Component: Custom Block 119 | * -------------------------------------------------------------------------- */ 120 | 121 | :root { 122 | --vp-custom-block-tip-border: transparent; 123 | --vp-custom-block-tip-text: var(--vp-c-text-1); 124 | --vp-custom-block-tip-bg: var(--vp-c-brand-soft); 125 | --vp-custom-block-tip-code-bg: var(--vp-c-brand-soft); 126 | } 127 | 128 | /** 129 | * Component: Algolia 130 | * -------------------------------------------------------------------------- */ 131 | 132 | .DocSearch { 133 | --docsearch-primary-color: var(--vp-c-brand-1) !important; 134 | } 135 | 136 | html.dark { 137 | --vp-home-hero-name-background: var(--vp-c-text-1); 138 | } -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | // See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations. 3 | // Extension identifier format: ${publisher}.${name}. Example: vscode.csharp 4 | 5 | // List of extensions which should be recommended for users of this workspace. 6 | "recommendations": [ 7 | "telesoho.vscode-markdown-paste-image", 8 | "docsmsft.docs-markdown", 9 | "yzhang.markdown-all-in-one" 10 | ], 11 | // List of extensions recommended by VS Code that should not be recommended for users of this workspace. 12 | "unwantedRecommendations": [ 13 | 14 | ] 15 | } -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "name": "Launch Edge against localhost", 9 | "type": "msedge", 10 | "request": "launch", 11 | "url": "http://localhost:5173", 12 | "webRoot": "${workspaceFolder}", 13 | "preLaunchTask": "serve", 14 | }, 15 | { 16 | "name": "Dev Docs - Live Server", 17 | "type": "node-terminal", 18 | "request": "launch", 19 | "command": "yarn docs:dev", 20 | "timeout": 3000, 21 | "serverReadyAction": { 22 | "pattern": ".*Local:.*:([0-9]{1,5}).*", 23 | "action": "debugWithEdge", 24 | "uriFormat": "http://localhost:%s", 25 | "webRoot": "${workspaceFolder}", 26 | "killOnServerStop": true 27 | } 28 | } 29 | ] 30 | } -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "files.eol": "\n", 3 | "files.trimTrailingWhitespace": true, 4 | "editor.rulers": [ 5 | 100 6 | ], 7 | "editor.tabSize": 2, 8 | "editor.formatOnPaste": true, 9 | "editor.formatOnSave": true, 10 | "[javascript]": { 11 | "editor.defaultFormatter": "esbenp.prettier-vscode" 12 | }, 13 | "javascript.format.insertSpaceAfterConstructor": true, 14 | "javascript.format.enable": false, 15 | "[typescript]": { 16 | "editor.defaultFormatter": "esbenp.prettier-vscode" 17 | }, 18 | "[vue]": { 19 | "editor.defaultFormatter": "esbenp.prettier-vscode" 20 | }, 21 | "prettier.singleQuote": false, 22 | "prettier.trailingComma": "es5", 23 | "prettier.printWidth": 100, 24 | "javascript.format.semicolons": "insert", 25 | "typescript.format.semicolons": "insert", 26 | "[json]": { 27 | "editor.defaultFormatter": "vscode.json-language-features" 28 | }, 29 | "editor.codeActionsOnSave": { 30 | "source.fixAll": "explicit" 31 | }, 32 | "findUnusedExports.detectCircularImports": true, 33 | "typescript.tsdk": "node_modules/typescript/lib", 34 | "MarkdownPaste.path": "../.vitepress/images" 35 | } -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0.0", 3 | "tasks": [ 4 | { 5 | "label": "serve", 6 | "type": "npm", 7 | "script": "docs:dev", 8 | "isBackground": true, 9 | "problemMatcher": [ 10 | "$vite", 11 | "$vite-eslint-visualstudio", 12 | "$vite-esbuild", 13 | { 14 | "owner": "typescript", 15 | "source": "Typescript", 16 | "fileLocation": "absolute", 17 | "applyTo": "allDocuments", 18 | "background": { 19 | "activeOnStart": true, 20 | "beginsPattern": "vite", 21 | "endsPattern": "Local" 22 | }, 23 | "pattern": [ 24 | { 25 | "regexp": "(ERROR|WARNING)\\(TypeScript\\) (.*)", 26 | "severity": 1, 27 | "message": 2 28 | }, 29 | { 30 | "regexp": "^ FILE (.*):(\\d*):(\\d*)$", 31 | "file": 1, 32 | "line": 2, 33 | "column": 3 34 | } 35 | ] 36 | } 37 | ] 38 | } 39 | ] 40 | } -------------------------------------------------------------------------------- /FAQ.md: -------------------------------------------------------------------------------- 1 | ::: warning *ImmyBot's EV code-signing certificate is changing on Feb. 11th, 2025* 2 | Please see the [FAQ section for more details](https://docs.immy.bot/FAQ.html#what-should-i-do-about-immybot-s-upcoming-code-signing-certificate-change) on updating security exclusions. 3 | ::: 4 | 5 | ::: danger *ImmyBot no longer supports Windows 7, Server 2008 (or Server 2012 w/o [ESUs](https://learn.microsoft.com/en-us/windows-server/get-started/extended-security-updates-overview)) machines.* 6 | Please see the [FAQ section for more details](https://docs.immy.bot/FAQ.html#what-windows-versions-does-immyagent-support) 7 | ::: 8 | # Frequently Asked Questions 9 | 10 | ## What is the difference between the Starter and Standard plan? 11 | 12 | Both plans allow you to import all of your existing agents into ImmyBot if you use one of our support integrations. 13 | 14 | Both plans allow installing and updating of the ImmyBot agent on all of your existing computers. 15 | 16 | Both plans allow running maintenance on all of your computers given that the computer was imported into ImmyBot in the last 7 days. 17 | 18 | ### Starter 19 | 20 | Starter does not charge maintenance per computer since it does not support ongoing maintenance for your computers. 21 | 22 | Once a computer has been in ImmyBot for at least 7 days, maintenance can no longer be executed against it. This includes all onboarding, full maintenance, and adhoc sessions. If you need to manage ongoing maintenance against a computer older than 7 days, then you will need to upgrade to Standard. 23 | 24 | ### Standard 25 | 26 | Standard charges per maintained computer since it supports ongoing maintenance. 27 | 28 | #### What is a maintained computer? 29 | 30 | Since we allow you to import all of your agents into ImmyBot, we don't simply charge per agent. 31 | 32 | Instead, we only consider computers that have received ongoing maintenance. 33 | 34 | A computer has received ongoing maintenance if an onboarding, full maintenance, or adhoc session has been run against it after the computer has been in ImmyBot for over 7 days. 35 | 36 | #### Maintenance per computer 37 | 38 | When maintenance is performed against a computer older than 7 days, ImmyBot will check the following: 39 | 40 | 1) Is this computer already counted towards your maintained count? 41 | 42 | - If it is, then maintenance can be performed on this computer. 43 | 44 | 2) Are we at the maximum number of maintained computers for this subscription? 45 | 46 | - If it is not, then this computer will be added to your active maintained computer count, and maintenance can be performed on this computer. 47 | 48 | When a subscription is at the maximum maintained count, only maintenance for computers considered in the count will be allowed. In order to run maintenance on other computers, you can purchase more computer licenses for your subscription. 49 | 50 | ## Do I need a separate USB/Installer per tenant? 51 | No. Create a USB pointing to your own tenant (or create an “Onboarding” tenant) and don’t select the Auto-Onboard option. 52 | 53 | You will change the tenant of the computer on the Onboarding area of the computer after it comes into New Computers 54 | 55 | ## Will ImmyBot start doing anything without my consent? Like when I save a deployment, will it automatically deploy? 56 | 57 | ImmyBot does not deploy anything automatically. You can feel safe saving your Deployments. Think of them like documenting how things SHOULD be. If you want Immy to automatically enforce deployments, you would need the ImmyBot Standard plan which allows you to create schedules. 58 | 59 | Think of it like if Group Policy only updated if you manually ran gpupdate /force or otherwise specified a schedule for the gpupdates to happen. We understand that updating and installing software on existing computers can be intrusive to the user which is why we schedule these actions out and give the user the ability to postpone via interactive emails. 60 | 61 | IMPORTANT: If you setup integration with your RMM, when you map an RMM client to an ImmyBot tenant, ImmyBot will begin running inventory scripts on those machines every 24 hours. These scripts are read-only, but if you have aggressive monitoring software it may cause false alarms. 62 | 63 | ## What if I don’t know which user will be using the computer? 64 | 65 | Do your best to find out, or assign machines to specific users ahead of time. Without this, user level customizations are impossible. However, you may find yourself in a shared-computer scenario where every computer gets the same 365 applications. Simply create a deployment for those 365 applications for all computers under that tenant. 66 | 67 | ## Can Immy join AzureAD? 68 | 69 | Yes. Create a deployment for the Join AzureAD task. We use the bulk enrollment technique and generate a provisioning package to join the machine to AzureAD. At the time of writing, this requires you to create a user in each customer’s tenant. We plan to remove this requirement in the future. 70 | 71 | ## My AzureAD Join action is failing, what are some common fixes? 72 | 73 | Check if MFA Requirement for Joining is enabled via [Conditional Access](https://portal.azure.com/#view/Microsoft_AAD_ConditionalAccess/ConditionalAccessBlade/~/Policies) or [Azure Device Settings](https://portal.azure.com/#view/Microsoft_AAD_Devices/DevicesMenuBlade/~/DeviceSettings/menuId~/null). 74 | MFA requirement for all users in [Conditional Access](https://portal.azure.com/#view/Microsoft_AAD_ConditionalAccess/ConditionalAccessBlade/~/Policies) will also block the execution, as the package_XXX user will encounter a MFA prompt. 75 | Most other situations are noted during execution failure. 76 | 77 | ## What should I do about ImmyBot's upcoming code-signing certificate change? 78 | 79 | ImmyBot's current code-signing certificate is set to expire Feb. 12th, 2025. We plan to switch over to our new certificate a day early on Feb. 11th, 2025 to ensure a smooth transition. 80 | 81 | This certificate is used to sign our Agent binaries & installers delivered to machines. 82 | 83 | Unfortunately, our new certificate's `Organization(O)` and `Common Name(CN)` fields are changing from `Immense Networks` to `ImmyBot LLC`. 84 | 85 | New Certificate on Feb. 11th, 2025: 86 | ``` 87 | CN=ImmyBot LLC, O=ImmyBot LLC, L=Baton Rouge, S=Louisiana, C=US 88 | ``` 89 | 90 | Existing Certificate: 91 | ``` 92 | CN=Immense Networks, O=Immense Networks, L=Baton Rouge, S=Louisiana, C=US 93 | ``` 94 | This means if you have followed either the [Security Software Exclusions](https://docs.immy.bot/troubleshooting.html#security-software-exclusions) or [ThreatLocker](https://docs.immy.bot/troubleshooting.html#threatlocker) Setup guides in the past, 95 | you must go through the guides again, adding our new certificate ***in addition*** to the existing certificate exclusion. 96 | 97 | ### *Will this certificate change mean I need to generate all new agent installers? Do I need to re-install the ImmyBot Agent on all my machines?* 98 | No. Binaries and installers signed with the existing certificate ***are valid and will continue to work past Feb. 12th, 2025 indefinitely*** as they were signed before the certificate expiry. 99 | Only new agents releases and installers generated after our transition period will be signed with our new certificate. This is why it is important to keep the prior certificate exclusions for instances with pre-exisiting machines. 100 | 101 | ## What Windows versions does ImmyAgent support? 102 | 103 | The ImmyAgent is written in .NET, and as such supports the same [Windows versions the .NET runtime supports](https://github.com/dotnet/core/blob/main/release-notes/8.0/supported-os.md). 104 | **Currently, the ImmyAgent runs on .NET 7 and therefore supports Win7+ devices. However, support for .NET 7 is ending May 14th, 2024.** 105 | After May 14th, Immybot will be transitioning the Agent to the .NET 8 runtime. Win7 is not officially supported in .NET 8, and as such will no longer be supported in ImmyBot. 106 | Older systems may continue to work inside of ImmyBot with necessary updates applied, however, we will not be offering any support for unsupported machines. 107 | - Internal testing has shown Win7 (and similar) machines can still work on .NET 8 as long as they have the necessary updates, utilizing a [3rd party tool such as Legacy Update](https://legacyupdate.net/). 108 | ::: danger 109 | We do not endorse Legacy Update or similar tools. The best thing to do is upgrade the system. Use at your own risk. 110 | ::: 111 | 112 | ## Can Immy make deploying via Intune more simple? 113 | 114 | Absolutely! There is a global [Task](#task) labeled "**Deploy ImmyAgent to Intune**" that can do an excellent job of it. 115 | - Ensure you are using the [**Custom** Graph Permissions](https://docs.immy.bot/azure-graph-permissions-setup.html#custom) 116 | - Ensure you have added the Graph **Application** permission DeviceManagementConfiguration.ReadWrite.All to your app registration 117 | - Ensure you have re-consented to your linked tenants with your new Custom registration 118 | - If there is a failure of the deployment, there is likely a permissions issue with the app registration 119 | 120 | ## Can Immy help migrate my customers to AzureAD from On-Premises environments? 121 | 122 | Yes, we have a [Task](#task) that can migrate machines to associate the user’s profile to their Azure AD identity and join the machine to Azure AD. It can also do the same to and from Active Directory 123 | 124 | ## Domain Join didn’t work, what gives? 125 | 126 | Make sure there is a Domain Controller in Immy for the machine. If you are using a supported RMM like CW Automate/Control setup the integration so the Domain Controller is imported automatically. Otherwise, you’ll need to install the ImmyAgent on a domain controller for that customer. 127 | 128 | If the Domain Controller doesn’t have the red “Domain Controller” designation, press “Run Inventory”. This may happen if it was recently added to ImmyBot. 129 | 130 | Pay attention to the script output, Immy may be reporting that there is a name collision, or that it was unable to run scripts on the domain controller, usually due to security software. 131 | 132 | ## Why are my computers stuck in [Identification](#identification) 133 | 134 | 1. The machine has a security tool like Defender for Endpoint, Crowdstrike, Bitdefender or Threatlocker blocking our scripts from running 135 | 136 | - You'll want to create exclusions for ImmyBot 137 | 138 | 1. WMI is broken on the machine (Usually on older machines) 139 | 140 | ## Can you target devices in Azure Groups? 141 | 142 | Yes, but ImmyBot requires an additional permission on the ImmyBot app registration. You need to grant the `Microsoft Graph - Devices.Read.All` permission in order for devices to be pulled from Azure Groups. 143 | 144 | ## How do I uninstall the ImmyAgent? 145 | Create a deployment for the "ImmyBot Agent" and set software should be to "Uninstalled" 146 | 147 | ![image](https://github.com/immense/immybot-documentation/assets/95599350/02be5654-7393-4f95-bf56-dde089582ccf) 148 | 149 | Or 150 | 151 | Run the following from Command Line 152 | ``` 153 | wmic product where name="ImmyBot Agent" call uninstall /nointeractive 154 | ``` 155 | Or 156 | ``` 157 | $product = Get-WmiObject win32_product | ` 158 | 159 | where{$_.name -eq "ImmyBot Agent"} 160 | 161 | $product.IdentifyingNumber 162 | 163 | msiexec /x $product.IdentifyingNumber /quiet /noreboot 164 | ``` 165 | 166 | 167 | ## How/are we able to define which version of Windows is installed during the initial setup? 168 | 169 | ImmyBot doesn't install Windows on bare metal. The workflow is you unbox the system from Dell, HP, Lenovo, Microsoft, or your manufacturer of choice and insert the USB with the ImmyBot.ppkg file at the root while the machine is at the out of box screen. 170 | 171 | We don't image the machine, we script the factory image into compliance. 172 | 173 | We can, however, install Feature Updates during Onboarding (as well as after Onboarding) 174 | 175 | ## Since Immy.Bot doesn’t use an ISO, does it require a device to have the ability to have 2 USB devices plugged in? One for a Windows ISO and one for the ImmyBot ppkg? 176 | 177 | If you want to wipe the computer you can use the Media Creation Tool to create a Windows Setup flash drive and then put our .ppkg file on it. After installing Windows, it will automatically apply the .ppkg 178 | 179 | ## Does Immy rely on the Windows preboot for drivers during initial deployment, or does the ImmyBot agent installer have drivers? 180 | 181 | Since we are working with the manufacturer's image, all drivers are typically installed. We will automatically install Dell, HP, and Lenovo driver and BIOS updates via those manufacturer's tools (Dell Command, HP Image Assistant, Lenovo System Update) 182 | 183 | ## Does Immy’s setup process support a USB NIC for WiFi? If so, how do we present those drivers to Immy, or do we even need to? 184 | 185 | I've found Windows has built in drivers for most USB NICs. If yours doesn't have drivers built into Windows, I'd suggest purchasing one that does. 186 | 187 | ## SentinelOne - How do we define which site Immy.Bot places the agent in during installation of the S1 agent? 188 | 189 | Supply ImmyBot with an API Key to SentinelOne, and Immy will look for a Site in your SentinelOne instance that matches the name of the Tenant you are onboarding the computer for. 190 | 191 | ## Are there any repository limits for software deployments? Either to the size of custom software or number of custom installers we can upload? 192 | 193 | There are currently no limits. Everything you upload goes into an Azure Storage Account created just for your ImmyBot instance. Don't be the reason we can't have nice things. 194 | 195 | # For computer rename, are there any other operators we can use when naming devices other then the ones shown? Can we add operators? 196 | 197 | You can duplicate the Task into your instance an manipulate it however you like. If it's something you think other MSPs could use, I'd encourage you to submit a request on the [ImmyBot Community](https://community.immy.bot) and we can add it. 198 | 199 | ## Employee profile caching during on-boarding - is this supported? If so/how? 200 | 201 | ImmyBot will create a profile for the Primary Person you selected for this machine on the Onboarding screen (It does this via the "Create Profile for Primary Person" task) 202 | 203 | We do this so subsequent tasks that set user level settings like default PDF handler and default browser, have the profile for the primary person and thus that user's HKCU where those settings live. 204 | 205 | ## For purchasing Immy, do you guys prefer Credit card or invoice? Would you rather us pay monthly, or can we pay all upfront? 206 | 207 | We prefer monthly credit card or ACH. 208 | 209 | ## Is Immy able to group devices and then do role based deployments to them? I assume this is done by tags? 210 | 211 | Yes, you would accomplish this with tags 212 | 213 | ## BitLocker - does this write the key to Azure AD by chance? 214 | 215 | Yes, but we can't verify that it is written to Azure AD as that would require additional privileges that our App Registration doesn't request. 216 | 217 | We also write the Bitlocker Recovery Key to Active Directory for Domain Joined machines. This doesn't require any Group Policy setup, or line of site to the domain controller. This works as long as the machine is joined to a domain and there is a domain controller for that domain in ImmyBot. 218 | 219 | ## Is Immy able to reset Windows / Wipe and Reload a computer? 220 | 221 | Yes, the current process will be simplified but here's how to do it: 222 | 223 | 1. Click Download ImmyAgent on the left to create a PPKG with the Windows Reset option selected 224 | 225 | ![image](https://user-images.githubusercontent.com/1424395/235902691-46845e47-2965-4141-a68c-2004a02b7300.png) 226 | 227 | ![image](https://user-images.githubusercontent.com/1424395/235902014-4a63dc2f-efe3-454c-a2f4-5c6578190982.png) 228 | 229 | 2. Create a Deployment for "Apply Provisioning Package (PPKG)" to deploy the PPKG to the specified machine 230 | 231 | ![image](https://user-images.githubusercontent.com/1424395/235902286-5ad3303e-167c-4cd4-abb6-5dea45da3600.png) 232 | 233 | ## ImmyBot Agent logs show an error of "The specified SAS token is expired" 234 | 235 | This will occur if the device's system time is incorrect. Ensure that the system time is correct and then restart the ImmyBot Agent Service. 236 | 237 | ## What are trusted manufacturers? 238 | 239 | Dell, HP, and Lenovo are considered trusted manufacturers. A trusted manufacturer is expected to provide unique serial numbers for their devices. We rely on trusted manufactuers and device serial numbers during device identification. If the agent reports it comes from a trusted manufacturer and a computer already exists inside ImmyBot with the same manufacturer and serial number, then we will automatically associated the agent with the existing computer. 240 | 241 | ## Can I embed the ImmyAgent into an image? 242 | 243 | Create a PPKG and place it in `C:\Recovery\Customizations`, create the folder if it doesn't exist. 244 | 245 | You can also use [SetupComplete](https://learn.microsoft.com/en-us/windows-hardware/manufacture/desktop/add-a-custom-script-to-windows-setup?view=windows-11) 246 | This method was confirmed working on Server 2022. 247 | 248 | Place both the ImmyAgent EXE installer and the SetupComplete.cmd in the C:\Windows\Setup\Scripts directory 249 | Content of SetupComplete.cmd can be as simple as: 250 | start C:\Windows\Setup\Scripts\ImmyAgentInstallerBundle.exe /qn 251 | 252 | A member of the ImmyBot community also likes to use the below method to embedded a PPKG into an image: 253 | ``` 254 | DISM.exe /Image:D:\mount /Add-ProvisioningPackage /PackagePath:C:\Users\Moi\Downloads\ImmyBotAgentInstaller.ppkg 255 | ``` 256 | 257 | ## Do you take requests for features/software/tasks/scripts? 258 | 259 | Yes, please feel welcome to submit a request on the [ImmyBot Community](https://community.immy.bot) 260 | 261 | 262 | ## Where do I find a file that was uploaded to a computer through ImmyBot Remote Control? 263 | 264 | Files uploaded through ImmyBot Remote Control can be found at %ProgramData%\RemoteControl\Shared 265 | 266 | ## Why am I getting this system update notification? 267 | 268 | We have something new and cool, be it a feature or bug fix! 269 | The system updates usually take 5-10 minutes to apply and restart your instance. During this time your instance will not be accessible. 270 | There are no sessions triggered on any endpoints as a result of the update, and if there are any sessions running when the update starts they will be restarted after the update completes. 271 | If you prefer not to think about doing updates, you can also schedule a time for automatic system updates to happen under Show More > Preferences. 272 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Welcome to ImmyBot Docs Github Repo 2 | 3 | Changes made to the main branch here are pushed to https://docs.immy.bot/ automatically. 4 | 5 | Feel free to contribute! We may even make you a [contributor](https://immy.bot/i-want-to-be-a-contributor/) 6 | 7 | To test locally, start by cloning this repo then opening the folder in VS Code. 8 | 9 | VS Code will recommend certain extensions when opening it the first time, we recommend you install these. 10 | 11 | Then run the following to install the required dependencies 12 | 13 | ``` 14 | yarn install 15 | ``` 16 | 17 | To host locally, run 18 | 19 | ``` 20 | yarn docs:dev 21 | ``` 22 | 23 | -------------------------------------------------------------------------------- /add-users.md: -------------------------------------------------------------------------------- 1 | # Adding Users 2 | 3 | Have the person attempt to login to ImmyBot. Have them request access: 4 | 5 | ![image](https://user-images.githubusercontent.com/1424395/153074628-4a22c81a-177e-4ebb-9845-898ab0f95d88.jpeg) 6 | 7 | Approve that access from a yellow indicator at the top of the screen. 8 | 9 | ![image](https://immybot.blob.core.windows.net/release-media/bb34184f-c7c3-41cf-9fa3-f6489e6c3600) 10 | -------------------------------------------------------------------------------- /azure-graph-permissions-setup.md: -------------------------------------------------------------------------------- 1 | # AzureAD/365 Graph Permissions 2 | 3 | Your first ImmyBot tenant will be automatically linked to the Azure tenant that you signed up for ImmyBot with. You can link other ImmyBot tenants to Azure from the tenant Azure tab. 4 | 5 | ## Linking to an Azure Tenant 6 | 7 | After creating an ImmyBot tenant, link it to an Azure tenant by navigating to the Azure tab in ImmyBot and entering the Azure tenant's principal id or domain and clicking `Save`. 8 | 9 | ## Azure Permission Level 10 | 11 | Once your ImmyBot tenant has been linked to Azure, you can set the **Azure Permission Level** from the tenant Azure tab. This allows ImmyBot to: 12 | 13 | 1. Sync all users from the Azure tenant 14 | 2. Sync all users from your GDAP customers **(please see [GDAP Customers](#gdap-customers))** 15 | 3. Install the 365 applications a user is licensed for 16 | - Apps for business/Apps for entrprise/Project/Visio 17 | 4. Deploy software to Teams, On-Premises Security Groups 18 | - Ex. Everyone in the Engineering Team gets AutoCAD 2022 19 | 20 | The **Azure Permission Level** has two modes: _Default_ and _Custom_ 21 | 22 | **NB: In both the _Default_ and _Custom_ modes, consent must be provided for each customer you want to sync. Please see [GDAP Customers](#gdap-customers) for requirements** 23 | 24 | ### Default 25 | 26 | In this mode, you don't need to create an app registration. You consent as an administrator, allowing ImmyBot access users in your tenant and your customers tenants. **Please see [GDAP Customers](#gdap-customers) if you want ImmyBot to access your customers' users**. 27 | 28 | ### Custom 29 | 30 | In this mode, you create an App Registration and provide its Application (client) Id and Secret to ImmyBot, allowing you to customize the permissions Immy has to you and your customer's environments. 31 | 32 | #### Create an App Registration 33 | 34 | Navigate to: 35 | 36 | ![](./.vitepress/images/2020-12-07-15-46-18.png) 37 | 38 | ![](./.vitepress/images/2020-12-07-15-47-07.png) 39 | 40 | ![](./.vitepress/images/2022-12-12_10-42-55.png) 41 | 42 | **Important!** Your app registration must have a Web redirect uri of `https://.immy.bot/consent-callback`, replacing `` appropriately 43 | 44 | #### Grant Permissions 45 | 46 | See the screenshots below for the minimum permissions. 47 | 48 | ![](./.vitepress/images/2020-12-07-15-47-33.png) 49 | 50 | ![image](https://github.com/immense/immybot-documentation/assets/1424395/24640a0d-b078-4575-8125-e035788f06e8) 51 | 52 | ![image](https://github.com/immense/immybot-documentation/assets/1424395/f5c4ec0f-35f2-49ad-a690-7e940c187d0a) 53 | 54 | > [!NOTE] 55 | > Since they are commonly used, please note that the `DeviceManagementManagedDevices.ReadWrite.All` permission is required for MDM enrollment with the **"Join AzureAD"** and **"Configure Directory"** tasks. 56 | 57 | #### Create Client Secret 58 | 59 | ![](./.vitepress/images/2021-08-16-13-19-15.png) 60 | 61 | ![](./.vitepress/images/2021-08-16-13-20-45.png) 62 | 63 | ![](./.vitepress/images/2021-08-16-13-23-26.png) 64 | 65 | **Please see [GDAP Customers](#gdap-customers) if you want ImmyBot to access your customers' data**. 66 | 67 | #### Copy the `Application (client) ID` and `Client Secret Value` into the form in ImmyBot. 68 | 69 | ## GDAP Customers 70 | 71 | To sync users from GDAP customers of your Azure Partner, permission must be granted in the customer 72 | tenants to Immy's app registration (_Default_ or _Custom_). This can be achieved either by clicking 73 | on the `Consent` button for each customer individually ("Manual consent") or by using the 74 | Pre-consent button ("Pre-consent"). 75 | 76 | ### Manual Consent 77 | 78 | This can be done by clicking on the `Consent` or `Reconsent` button for the customer on either the 79 | Azure Settings page or ont he Azure tab of the ImmyBot tenat linked to the customer. 80 | 81 | **NB: When manually consenting to an Azure customer, you must authenticate using an administrator account from that customer!** 82 | 83 | ### Pre-Consent 84 | 85 | Immy can automatically grant consent to your GDAP customers using the Partner Center API, removing 86 | the need to consent to each customer individually. To do this, you must authenticate to the Partner 87 | Center API with a user in the partner tenant that meets these requirements: 88 | 1. Is a member of the `AdminAgents` security group 89 | 2. Is given the `Application administrator` and `Privileged role administrator` Entra roles at the customer through the GDAP relationship 90 | 91 | #### Example: GDAP Role Assignments 92 | 93 | Here is an example GDAP relationship configuration that will work with Immy's pre-consent functionality: 94 | 95 | 1. Create security group in the partner tenant named `Application Administrators` 96 | 2. Create security group in the partner tenant named `Privileged Role Administrators` 97 | 3. Assign the `Application administrator` Entra role to the `Application Administrators` security group on the customer's admin relationship 98 | 4. Assign the `Privileged role administrator` Entra role to the `Privileged Role Administrators` security group on the customer's admin relationship 99 | 5. Add the partner user that you wish to sign-in to the Partner Center API with to `AdminAgents`, `Application Administrators` and `Privileged Role Administrators` security groups 100 | 101 | For more information, see these Azure docs: 102 | - [Obtain permissions to manage customer](https://learn.microsoft.com/en-us/partner-center/gdap-obtain-admin-permissions-to-manage-customer) 103 | - [Assign Microsoft Entra roles](https://learn.microsoft.com/en-us/partner-center/gdap-assign-microsoft-entra-roles) 104 | 105 | ## Common Issues 106 | 107 | ### Consent 108 | 109 | #### AADSTS500113: No reply address is registered for the application 110 | 111 | This error occurs when the redirect uri is not set correctly on the custom app registration. 112 | Please follow these steps to set the redirect uri correctly: 113 | 114 | 1. Navigate to the [Azure Portal](https://portal.azure.com) 115 | 1. Navigate to the [Microsoft Entra ID blade](https://portal.azure.com/#view/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/~/Overview) 116 | 1. Navigate to the [App Registrations blade](https://portal.azure.com/#view/Microsoft_AAD_RegisteredApps/ApplicationsListBlade) 117 | 1. Select the app registration you created for ImmyBot 118 | - You may need to change the filter to "All Applications" 119 | - You can paste the Application (client) ID of your custom app registration into the search box to find it 120 | ![image](https://github.com/immense/immybot-documentation/assets/95599350/2021ff38-03cd-4132-88b4-bd70fcf8f861) 121 | 1. Navigate to the Authentication blade 122 | - Select "Add a platform" 123 | - Select "Web" as the type 124 | ![image](https://github.com/immense/immybot-documentation/assets/95599350/a4ac66be-3353-45d6-af38-6d76c16dc303) 125 | - Enter `https://.immy.bot/consent-callback` as the redirect uri, replacing `` appropriately 126 | - Click "Configure" 127 | ![image](https://github.com/immense/immybot-documentation/assets/95599350/292eef9f-fa2b-46ff-8834-b2ef2f24ae0f) 128 | 129 | -------------------------------------------------------------------------------- /connectsecure-integration-setup.md: -------------------------------------------------------------------------------- 1 | # ConnectSecure Dynamic Integration 2 | 3 | ### Setting up this integration allows you to: 4 | 5 | - Agent identification by adding an inventory script to be run against all of your endpoints 6 | - Importing agents from linked clients into ImmyBot 7 | - Mapping clients from the integration to tenants in ImmyBot 8 | - Getting an install token for a specific client 9 | 10 | ### Prerequisites 11 | 12 | - The tenant name you use to log in to the ConnectSecure portal 13 | 14 | ## Create ImmyBot Api User 15 | 16 | 1. On the home page, switch to the Global view 17 | 18 | ![image](./.vitepress/images/connectsecuredocs/ApiUser_Step01.png) 19 | 20 | 2. Open the toolbar on the left and navigate to Settings > Users 21 | 22 | ![image](./.vitepress/images/connectsecuredocs/ApiUser_Step02.png) 23 | 24 | 3. Create a new api user, `AssetViewer` is the only role you need. Other viewer roles might be utlized in future interfaces, if you want to add them. 25 | 26 | ![image](./.vitepress/images/connectsecuredocs/ApiUser_Step03.png) 27 | 28 | 4. Save and copy the Client ID and Client Secret 29 | 30 | ## Get "pod" URL 31 | 32 | 1. Open the API Documentation from user icon menu in ConnectSecure portal. 33 | 34 | ![image](./.vitepress/images/connectsecuredocs/PodURL_Step01.png) 35 | 36 | 2. Grab the root URL from the API Documentation 37 | 38 | ![image](./.vitepress/images/connectsecuredocs/PodURL_Step02.png) 39 | 40 | ## Create Integration in ImmyBot 41 | 42 | 1. Create a new ConnectSecure Dynamic Integration from Show More -> Integration -> Add Integration -> ConnectSecure. 43 | 44 | 2. Insert the information you have previously obtained into the parameter fields. 45 | 46 | ![image](./.vitepress/images/connectsecuredocs/Integration_Step01.png) 47 | 48 | 3. Click "Update" 49 | 4. Map clients, as necessary. 50 | 51 | ![image](./.vitepress/images/connectsecuredocs/Integration_Step02.png) 52 | 53 | 5. Your done -------------------------------------------------------------------------------- /connectwise-automate-integration-setup.md: -------------------------------------------------------------------------------- 1 | # ConnectWise Automate 2 | 3 | Setting up this integration allows you to 4 | 1. Import customers from Automate 5 | 2. Import computers from Automate 6 | 3. Manage all computers in Automate without deploying the ImmyBot Agent 7 | 4. Map customers from Manage to ImmyBot tenant based on existing Automate<->Manage relationship 8 | 9 | ## Create ImmyBot Role 10 | ImmyBot requires the following permissions in Automate 11 | 12 | - Core 13 | - Clients.Read 14 | - Clients.Show All 15 | - Computers.Show All 16 | - Computers.Edit (For moving existing computers to new locations 17 | - Computers.Delete (For retiring duplicate computers) 18 | - Groups.Show All 19 | - Locations.Show All 20 | - Patch Manager.Read (Required if you want Immy to apply approved Windows Updates) 21 | 22 | ![](./.vitepress/images/2021-03-23-15-18-39.png) 23 | 24 | ![Immy-CWA-User Class Manager-Permissions](https://user-images.githubusercontent.com/5932122/187803601-f2d49a3a-11cc-46b9-8aa2-b7ea1123902e.png) 25 | 26 | 27 | ## Create ImmyBot User 28 | ![](./.vitepress/images/2021-03-23-16-14-24.png) 29 | 30 | ![](./.vitepress/images/2021-03-23-16-19-01.png) 31 | 32 | ![](./.vitepress/images/2021-03-23-16-30-41.png) 33 | 34 | ## Enable Google MFA for ImmyBot User 35 | 36 | The integration requires Google for MFA. Duo is not supported as Duo does not expose the MFA token anywhere for us to use and doesn't appear to be the standard TOTP like Google uses. 37 | You will need to exclude the integration user from your Duo deployment if using Duo and configure the Google MFA plugin for Automate for this user. 38 | 39 | ![](./.vitepress/images/2021-03-23-18-35-49.png) 40 | 41 | ![](./.vitepress/images/2021-03-23-18-35-28.png) 42 | 43 | ![](./.vitepress/images/2021-03-23-18-39-00.png) 44 | 45 | ## Add RMM Link for CW Automate 46 | 47 | ![image](https://user-images.githubusercontent.com/1424395/156473997-68337c8f-4c50-4f94-b197-f62218a8276c.png) 48 | 49 | ![](./.vitepress/images/2021-03-23-18-59-10.png) 50 | 51 | ![](./.vitepress/images/2021-03-23-19-00-04.png) 52 | 53 | ![](./.vitepress/images/2021-03-23-18-59-44.png) 54 | 55 | ## Import your customers 56 | 57 | ![](./.vitepress/images/2021-03-23-18-57-19.png) 58 | 59 | ![](./.vitepress/images/2021-03-23-19-01-36.png) 60 | 61 | Alternatively, you can create/map only certain customers. 62 | 63 | When you map a customer from an RMM, the computers will undergo Identification 64 | 65 | ![](./.vitepress/images/2021-03-23-19-03-33.png) 66 | 67 | ![](./.vitepress/images/2021-03-23-19-06-55.png) 68 | 69 | ![](./.vitepress/images/2021-03-23-19-08-30.png) 70 | -------------------------------------------------------------------------------- /connectwise-control-integration-setup.md: -------------------------------------------------------------------------------- 1 | # ConnectWise Control 2 | 3 | Setting up this integration allows you to 4 | 1. Import customers from Control 5 | 2. Import computers from Control 6 | 3. Manage all computers in Control without deploying the ImmyBot Agent 7 | 4. Remote into computers from the ImmyBot interface using Control (Note: We default to requiring customer consent, you can disable this under Settings->Preferences) 8 | 5. Fix the Automate agent using the Control agent (by creating a cross-tenant deployment for the Automate Agent and creating a schedule for your customers) 9 | 10 | ## Install ImmyBot Extension for Control 11 | 12 | ![](./.vitepress/images/2021-03-23-19-12-34.png) 13 | 14 | ![](./.vitepress/images/2021-03-23-19-13-56.png) 15 | 16 | ![](./.vitepress/images/2021-03-23-19-17-38.png) 17 | 18 | ## Create RMMLink for Control 19 | 20 | ![image](https://github.com/immense/immybot-documentation/assets/95599350/157501cd-b0df-48fa-9a31-d6445777a04b) 21 | ![image](https://github.com/immense/immybot-documentation/assets/95599350/7b8b278e-ce38-48bc-a12f-509542556f43) 22 | ![image](https://github.com/immense/immybot-documentation/assets/95599350/92bc66c7-6f07-4665-94fe-d849258bd159) 23 | 24 | ## FAQ 25 | What custom property do I use? 26 | 27 | By default most ConnectWise Control instances you would select 1 for the ClientName CustomProperty field, this is the "Company" property in Control. 28 | Secondary group is any number between 1-8 that you would like to group from based on Control groups. 29 | You can find more infomation about Control custom propertys here; 30 | https://docs.connectwise.com/ConnectWise_Control_Documentation/Get_started/Administration_page/Appearance_page/Add_custom_properties_to_sessions 31 | 32 | ## Import your customers 33 | 34 | ![](./.vitepress/images/2021-03-23-18-57-19.png) 35 | 36 | ![](./.vitepress/images/2021-03-23-19-01-36.png) 37 | 38 | Alternatively, you can create/map only certain customers. 39 | 40 | When you map a customer from an RMM, the computers will undergo Identification 41 | 42 | ![](./.vitepress/images/2021-03-23-19-21-03.png) 43 | 44 | ![](./.vitepress/images/2021-03-23-19-24-06.png) 45 | 46 | ![](./.vitepress/images/2021-03-23-19-08-30.png) 47 | 48 | ## Troubleshooting 49 | 50 | ConnectWise Control uses Sqlite under the hood, making it vulnerable to performance issues unless aggressive Database Maintenance Tasks are enabled. 51 | 52 | While ImmyBot only uses Control (and other integrations) to spawn an out-of-band connection, over the course of time the database can grow as ImmyBot establishes this connection on each machine once every 24 hours to collect inventory. 53 | 54 | Commands go into the SessionEvent table with EventType = 44 55 | Responses go into SessionConnectionEvent with EventType = 70 56 | 57 | ### Automatic Cleanup 58 | Ensure you have the following maintenance actions: 59 | Access Sessions: Purge records of session activity older than 7 days for all events EXCEPT AddedNote 60 | 61 | ![image](https://user-images.githubusercontent.com/1424395/160918827-b5de85c0-b528-46cc-bb21-5815fcb07fd0.png) 62 | 63 | Access Sessions: Purge records of session connections older than 7 days for Host and Guest connections 64 | 65 | ![image](https://user-images.githubusercontent.com/1424395/160918906-6d6c0485-fe57-4ff8-b52f-99fa03b4cd74.png) 66 | 67 | ### Manual Cleanup 68 | 69 | If you host Control yourself, you can restore performance by doing the following 70 | 71 | Download and Install [DB Browser for SQLite](https://sqlitebrowser.org/) on your server 72 | Open `C:\Program Files (x86)\ScreenConnect\App_Data\session.db` 73 | Navigate to SQL Editor 74 | Paste in the following SQL 75 | 76 | #### Soft delete all commands and responses (This usually solves the problem without kicking everyone out of Control) 77 | ```sql 78 | update SessionEvent set EventAttributes = 1 where EventType = 44; 79 | update SessionConnectionEvent set EventAttributes = 1 where EventType = 70; 80 | ``` 81 | You will need to commit the changes in DB Browser. You can do this by clicking Write Changes at the top by clicking File->Save 82 | If you forget to tdo this it will prompt you to commit the changes, when you exit, click yes. 83 | 84 | The reason this works is because the UI doesn't fetch soft-deleted items, so things become much snappier. 85 | 86 | However, if it doesn't work, do you following 87 | 88 | #### Delete commands and responses older than 7 days 89 | ```sql 90 | -- Delete queue commands in db older than 7 days 91 | DELETE 92 | FROM SessionEvent 93 | WHERE (EventType = 44) AND (Time < DATETIME('now', '-7 day')); 94 | 95 | -- Delete responses older than 7 days 96 | DELETE 97 | FROM SessionConnectionEvent 98 | WHERE (EventType = 70) AND (Time < DATETIME('now', '-7 day')) 99 | ``` 100 | 101 | -------------------------------------------------------------------------------- /connectwise-manage-integration-setup.md: -------------------------------------------------------------------------------- 1 | # ConnectWise Manage 2 | 3 | Setting up this integration allows you to 4 | 1. Deploy Software to machines covered by a certain agreement type 5 | - Example: Deploy Huntress to all customers with a Managed Security Agreement 6 | 1. (Preferred) Deploy Software to machines covered by an Agreement with a specific Addition 7 | - Example: Deploy SentinelOne to all computers that have SentinelOne as an Addition on their agreement 8 | 9 | **If you use Automate, setup the Automate integration first and import your customers from there. Importing customers from Manage generally results in many unnecessary Tenants being created in ImmyBot. You can link Automate to Manage to leverage the existing mappings between Automate<->Manage instead of manually mapping your Manage customers** 10 | 11 | ## Create an ImmyBot Role with the following permissions 12 | 13 | - *Company -> Company Maintenance -> Inquire Level (All)* 14 | - *Finance -> Agreements -> Inquire Level (All)* 15 | - *Procurement -> Product Catalog -> Inquire Level (All)* 16 | - *Procurement -> Product -> Inquire Level (All)* 17 | - *Service Desk -> Service Tickets -> Inquire -> (All)* 18 | - Optional - Required for the technician tools feature 19 | - *System -> API Reports -> Inquire Level (All)* 20 | 21 | ![alt text](./.vitepress/images/image-1.png) 22 | 23 | ![](./.vitepress/images/2022-02-23_15-00-31.png) 24 | 25 | ## Create an API Member 26 | 27 | Go to *System -> Members* and create a new **API Member** 28 | 29 | ![](./.vitepress/images/2021-03-23-14-28-30.png) 30 | 31 | Create a new API key 32 | 33 | ![](./.vitepress/images/2021-03-23-14-43-35.png) 34 | 35 | ## Plugin the API Keys in ImmyBot 36 | 37 | Create a new PSA Link and fill in the **Provider Info** 38 | 39 | ![](./.vitepress/images/2021-03-23-14-44-05.png) 40 | 41 | # CW Manage Pod v1 42 | 43 | Setting up this integration allows you to Look up the contact's email address in Immy and shows you their computers (Immy does User Computer Affinity behind the scenes so you don't have to do it manually). Technicians can jump into their computers or push software via the ticket. 44 | 45 | ![image](https://github.com/immense/immybot-documentation/assets/95599350/c9b28636-c7d9-4f80-b850-780efefe6b4e) 46 | 47 | 48 | Go to Show More -> Integrations 49 | 50 | Add CW Manage Pod 51 | 52 | Go to ConnectWise -> Setup Tables -> Manage Hosted API -> + 53 | 54 | ![image](https://github.com/immense/immybot-documentation/assets/1424395/88fade4c-0ee7-4b88-971e-34138929e4e3) 55 | 56 | 57 | ## Technician Tools 58 | 59 | [What is Technician Tools?](./terminology.md#technician-tools) 60 | 61 | **This feature only works for the `Service Ticket` screen.* 62 | 63 | ### Required Permissions 64 | 65 | Modify your immy.bot security role to include `Service Desk -> Service Tickets -> Inquire Level -> All` 66 | 67 | ![alt text](image-5.png) 68 | 69 | ### Setup 70 | 71 | In ConnectWise Manage, you can use "Manage Hosted API Setup" to embed content on certain pages in the UI. You can set one up by navigating to `System -> Setup Tables -> Manage Hosted API Setup` 72 | 73 | ![alt text](image-1.png) 74 | 75 | Copy the url template: 76 | 77 | ```https://.immy.bot/technician-pod/cw-manage/``` 78 | 79 | The URL is specific to your instance. You'll need to replace `` with your domain and `` with your CW Manage integration id. This id can be found here: 80 | 81 | ![alt text](image-4.png) 82 | 83 | After you setup the pod, navigate to a ticket, and it shoud load the technician tools pod for immy.bot. 84 | 85 | -------------------------------------------------------------------------------- /getting-started.md: -------------------------------------------------------------------------------- 1 | # Getting Started / Thinking with Immy 2 | 3 | **The goal of ImmyBot is to setup a computer knowing only the customer and the end user.** 4 | 5 | Thinking with Immy means thinking in terms of how things "Should" be. 6 | 7 | You teach Immy how things "should" be by creating Deployments. 8 | 9 | ```mermaid 10 | graph LR 11 | subgraph "Deployment" 12 | Input["Software or Task"] -->|"Should Be"| DesiredState["Desired State"] -->|on| Group["One or More Computers"] 13 | end 14 | ``` 15 | ```mermaid 16 | graph LR 17 | subgraph "Adobe Reader" 18 | Input1["Adobe Reader"] -->|"Should Be"| DesiredState1["Installed"] -->|on| Group1["All Workstations and Portable Devices"] 19 | end 20 | ``` 21 | 22 | How things "Should" be is often dependent on external factors. For example 23 | 24 | - Customer A should have SentinelOne because they pay for it 25 | - Person A should have Visio 365 because he has a license for it 26 | 27 | Luckily, deployments can be conditionally applied based on the result of scripts that reach out to external sources 28 | 29 | ```mermaid 30 | graph LR 31 | subgraph "Should Deployment Apply?" 32 | Input --> Metascript 33 | Metascript --> True 34 | Metascript --> False 35 | end 36 | ``` 37 | 38 | ```mermaid 39 | graph LR 40 | subgraph "Should Visio Install?" 41 | EndUser["Input: End User"] --> Script["Graph API Script: Does End User have Visio License?"] 42 | Script --> True1[True] 43 | Script --> False1[False] 44 | end 45 | ``` 46 | 47 | This is out of the box functionality in ImmyBot. I'm just showing you how it works to illustrate the power of the rules engine. 48 | 49 | ## Overview 50 | ImmyBot deploys 2 things: 51 | 1. Software 52 | 1. Tasks 53 | 54 | Tasks are for anything that isn’t software, think Bitlocker, Power Options, etc. 55 | 56 | - You can use Tasks to configure software by selecting a "Configuration Task" for the software 57 | - Configuration Tasks are useful for configuring the application (even if the application wasn't installed by ImmyBot) 58 | - Configuration Tasks run after Immy determines the software is installed 59 | - Configuration Task parameters are available in all scripts related to the software 60 | 61 | ImmyBot tests everything it does before and after it does it. 62 | - Software 63 | - Version Detection - Runs before install to determine if installation is necessary, and after to verify the desired version is installed 64 | - DisplayName 65 | - Contains 66 | - Regex 67 | - Traditional (Wildcard \*) 68 | - UpgradeCode (For MSI based installs) 69 | - Script 70 | - Must return a version or null 71 | - Test Script - If software is installed, the failure of this test (the test script returning $false) will trigger a "Repair" action (default Uninstall/Install) of the application 72 | - Example: Check to verify Foxit PDF Editor is the Preview handler extension is working in Windows Explorer, reinstalling the PDF Editor usually corrects this scenario 73 | - Tasks 74 | - Test script (When using separate scripts) 75 | - Combined script returns $false when $method is 'test' 76 | 77 | ### Example: Adobe Reader 78 | We find that most MSPs install Adobe Reader by default so ImmyBot includes a Recommended Deployment that states 79 | - "the latest version of Adobe Reader should be installed for all Workstations and Portable Devices" 80 | 81 | When this rule applies (i.e. it isn't disabled or overridden by a more specific rule) ImmyBot will do the following: 82 | 1. Find the latest available version of Adobe Reader by running the Adobe Reader "dynamic version" script that uses a public API to return the latest full version number of Adobe Reader, as well as the URL to download it, the latest patch version of Adobe Reader, and the URL to download it. 83 | 2. Determine the installed version (if any) by looking for Adobe Reader in Add/Remove Programs on the machine 84 | 3. Queue an Install or Upgrade task (depending on the previous step) 85 | 4. Set Adobe Reader to be the default PDF handler by running the "configuration task" that verifies that Reader is the default handler for .PDF files for each user on the machine. 86 | -------------------------------------------------------------------------------- /halo-integration-setup.md: -------------------------------------------------------------------------------- 1 | # HaloPSA 2 | 3 | Setting up this integration allows you to 4 | 1. Deploy Software to machines covered by a certain contract type 5 | - Example: Deploy Huntress to all customers with a Managed Security Contract 6 | 1. (Preferred) Deploy Software to machines covered by an Contract with a specific recurring invoice item 7 | - Example: Deploy SentinelOne to all computers that have SentinelOne on a recurring invoice as a recurring invoice item on their contract 8 | 9 | ## Create an ImmyBot Application under /config/integrations/api/applications 10 | 11 | - Under the details section, select the Client ID and Secret Authentication Method 12 | - Generate and copy the Client ID and Client Secret 13 | - The Login Type should be "Agent", and you should select an "Agent to log in as" 14 | 15 | ## Permissions: 16 | 17 | - read:customers -> Yes 18 | - read:contracts -> Yes 19 | - read:items -> Yes 20 | - edit:reporting -> Yes 21 | - edit:items -> Yes (*should not be needed > 2.99, API bug will not allow listing items without edit rights) 22 | - read:invoices -> Yes 23 | - read:software -> Yes 24 | - read:tickets -> Yes (required for the Technician Tools feature) 25 | - read:assets -> Yes (*future feature of the integration will include asset population, not currently necessary) 26 | - edit:assets -> Yes (*future feature of the integration will include asset population, not currently necessary) 27 | 28 | ## Plug in the Client ID and Client Secret in ImmyBot 29 | 30 | Create a HaloPSA Integration Link and fill in the **Integration Settings** 31 | 32 | ![image](https://user-images.githubusercontent.com/18588314/184726437-c4398dec-1add-48c3-9443-88dc1b384c5b.png) 33 | 34 | 35 | ## Embedded Ticket Tab 36 | HaloPSA version 2.125.5, introduced a new feature called Custom Tabs. You can configure these Custom Tabs to point to a web address, similar to an iframe. 37 | 38 | Within HaloPSA, configure the tab as follows: 39 | 40 | ![image](https://github.com/immense/immybot-documentation/assets/16939160/c851198c-60fb-4eb6-b9c8-36ce4bf6fd6c) 41 | 42 | This tab will then show on all tickets in the system, like this: 43 | 44 | ![image](https://github.com/immense/immybot-documentation/assets/16939160/f4aaf5f2-08bf-4d56-b313-eeea62e21051) 45 | 46 | ## Technician Tools 47 | 48 | [What is Technician Tools?](./terminology.md#technician-tools) 49 | 50 | HaloPSA version 2.125.5 introduced a new feature called Custom Tabs. You can configure these Custom Tabs to point to a web address that is rendered as an iframe. 51 | 52 | Within HaloPSA, configure the tab as follows: 53 | 54 | ![alt text](image-10.png) 55 | 56 | Copy the url template: 57 | 58 | ```https://.immy.bot/technician-pod/psa//ticket/$FAULTID``` 59 | 60 | The URL is specific to your instance. You'll need to replace `` with your domain and `` with your halo integration id. This id can be found here: 61 | 62 | ![alt text](image-2.png) 63 | 64 | After you setup the tab, navigate to a ticket and select the tab with the name you just created. It shoud load the technician tools page of immy.bot. 65 | 66 | -------------------------------------------------------------------------------- /image-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/image-1.png -------------------------------------------------------------------------------- /image-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/image-10.png -------------------------------------------------------------------------------- /image-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/image-2.png -------------------------------------------------------------------------------- /image-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/image-3.png -------------------------------------------------------------------------------- /image-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/image-4.png -------------------------------------------------------------------------------- /image-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/image-5.png -------------------------------------------------------------------------------- /image-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/image-6.png -------------------------------------------------------------------------------- /image-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/image-7.png -------------------------------------------------------------------------------- /image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/image.png -------------------------------------------------------------------------------- /immy-commands.md: -------------------------------------------------------------------------------- 1 | # Metascripts / Cloud Scripts 2 | 3 | A Metascript is a script that runs scripts. These scripts run in the backend of ImmyBot. 4 | 5 | A Metascript can run a script on a computer using Invoke-ImmyCommand. 6 | 7 | ## Example 8 | ```powershell 9 | $ServerPSVersionTable = $PSVersionTable 10 | $ComputerPSVersionTable = Invoke-ImmyCommand { 11 | $ServerPSVersionTable = $using:ServerPSVersionTable 12 | Write-Host "Running from $env:ComputerName but ImmyBot backend is running PowerShell $($ServerPSVersionTable.PSVersion)" -ForegroundColor Green 13 | return $PSVersionTable 14 | } 15 | $VerbosePreference = 'Continue' 16 | Write-Verbose "Running from ImmyBot backend, but the computer is running Windows PowerShell $($ComputerPSVersionTable.PSVersion)" 17 | ``` 18 | ## Output 19 | ![image](https://user-images.githubusercontent.com/1424395/186782839-81293dbb-8206-4dbb-be78-f94efbfbbacf.png) 20 | 21 | Invoke-ImmyCommand is modelled after PowerShell's native Invoke-Command, up to and including the ability to pass real objects into and out of the remote runspace, while preserving stream information. We consider our approach superior to capturing standard output and standard error as a string like most automation tools. 22 | 23 | Metascripts allow you to do things like persist reboots since the context is held by the backend. 24 | 25 | ## Cloud Scripts 26 | 27 | A Cloud script is the same as a Metascript except it targets a Tenant instead of a specific computer. This is useful for manipulating settings in each customer's Azure environment. 28 | 29 | Collectively we refer to Metascripts and Cloud scripts as server-side scripts. 30 | 31 | ## Common Commands 32 | 33 | These commands are available in all server-side scripts. 34 | 35 | ### Connect-ImmyAzureAD 36 | 37 | Provides a wrapper around `Connect-AzureAD` 38 | 39 | - https://docs.microsoft.com/en-us/powershell/module/azuread/connect-azuread?view=azureadps-2.0 40 | 41 | #### Example 42 | 43 | ```powershell 44 | Connect-ImmyAzureAD 45 | Get-AzureADUser -All $true 46 | ``` 47 | 48 | ### Get-ImmyAzureAuthHeader 49 | 50 | Obtains an auth header for the specified endpoint 51 | 52 | #### Usage 53 | 54 | ```powershell 55 | Get-ImmyAzureAuthHeader [-Endpoint] <["MSGraph", "AzureAD"]> 56 | ``` 57 | 58 | Returns a `[dictionary]` containing the auth header 59 | 60 | #### Examples 61 | 62 | ```powershell 63 | $Header = Get-ImmyAzureAuthHeader -ErrorAction Stop 64 | $Groups = Invoke-RestMethod "https://graph.microsoft.com/v1.0/groups/ 65 | ``` 66 | ### Get-ProviderInfo 67 | 68 | Retrieves an instance of an RMM Provider for the specified type. 69 | 70 | #### Alias 71 | Get-RmmInfo 72 | 73 | #### Usage 74 | 75 | ```powershell 76 | Get-ProviderInfo [[-ProviderType] ] [-IncludeClients] [] 77 | ``` 78 | 79 | #### Examples 80 | 81 | ```powershell 82 | param( 83 | [string]$FieldName, 84 | [string]$Value, 85 | $Computer 86 | ) 87 | 88 | if(!$Computer) 89 | { 90 | $Computer = Get-ImmyComputer 91 | } 92 | $RmmComputer = Get-RmmComputer -Computer $Computer -ProviderType CWAutomate 93 | $RmmInfo = Get-ProviderInfo -ProviderType CWAutomate 94 | 95 | $EDF = Get-CWAComputerEDF -FieldName $FieldName -Computer $Computer 96 | if(!$EDF) 97 | { 98 | Write-Warning "Aborting: Unable to find EDF $FieldName" 99 | return 100 | } 101 | 102 | $ExtraFieldDefinitionId = $EDF.ExtraFieldDefinitionId 103 | $ValueProperty = $EDF | select *FieldSettings* | Get-Member -MemberType NoteProperty | select -First 1 | %{$_.Name} 104 | $PatchPath = "$ValueProperty/Value" 105 | $Uri = "cwa/api/v1/computers/$($RmmComputer.RmmDeviceId)/extrafields/$ExtraFieldDefinitionId" 106 | $Body = ConvertTo-Json @(@{"op"="replace";"path"=$PatchPath;"value"=$Value}) 107 | Invoke-CWARestMethod $Uri -Provider $RmmInfo.Provider -Method PATCH -Body $Body 108 | ``` 109 | 110 | ## Metascript Commands 111 | 112 | ### Invoke-ImmyCommand 113 | 114 | A powerful command that allows you to execute scripts remotely on devices. 115 | 116 | #### Usage 117 | 118 | ```powershell 119 | Invoke-ImmyCommand [-ScriptBlock] [-Computer ] [-Context ] [-ArgumentList ] [-Timeout ] [-ConnectTimeout ] [-DisableConnectTimeoutWarnings] [-Parallel] [] 120 | ``` 121 | 122 | `-Context` accepts either "System" or "User" 123 | 124 | `-Timeout` accepts an integer denoted in seconds. The default is 120. 125 | 126 | `-Parallel` (switch, makes the script block run on all the computers simultaneously instead of in series) 127 | 128 | `-ConnectTimeout` (integer, seconds, to override the amount of time before giving up on trying to start the script on a computer) 129 | 130 | `-DisableConnectTimeoutWarnings` (switch, to suppress "WARNING: Timed out waiting for script to start on COMPUTER" for every computer that fails to start within the connect timeout). 131 | 132 | #### Examples 133 | 134 | ```powershell 135 | <# Execute a metascript against the primary computer #> 136 | Invoke-ImmyCommand { 137 | <# add powershell to run on the comptuer #> 138 | write-output "hello" 139 | } 140 | ``` 141 | 142 | ```powershell 143 | <# Retrieve a list of computers and run a command on all of them #> 144 | Get-ImmyComputer -TargetGroupFilter All | Invoke-ImmyCommand { 145 | Write-Output "Hello" 146 | } 147 | ``` 148 | ### Send-ImmyEmail 149 | 150 | Sends an Immybot styled email. If no `To` is provided, then the email will be sent using the same logic for sending the detection emails during a maintenance session. 151 | 152 | #### Usage 153 | 154 | ```powershell 155 | Send-ImmyEmail [-Subject] [-Body] [[-To] ] [[-Bcc] ] 156 | ``` 157 | 158 | #### Examples 159 | 160 | ```powershell 161 | <# Sends an email using the same logic used in sending detection emails out during maintenance. #> 162 | Send-ImmyEmail -Subject "Test" -Body "Some Body" 163 | ``` 164 | 165 | ### Refresh-ComputerSystemInfo 166 | 167 | #### Usage 168 | 169 | This command will run an inventory command to refresh the following computer information: 170 | 171 | - ComputerName 172 | - SerialNumber 173 | - ChassisTypes 174 | - DomainRole 175 | - Domain 176 | - OsName 177 | - OsInstallDate 178 | - LastBootTime 179 | - Model 180 | - Manufacturer 181 | 182 | ```powershell 183 | Refresh-ComputerSystemInfo [[-Computer] ] 184 | ``` 185 | 186 | #### Examples 187 | 188 | ```powershell 189 | <# If you do not supply the Computer parameter, then it will default to using the computer for the current session #> 190 | Refresh-ComputerSystemInfo 191 | ``` 192 | 193 | ```powershell 194 | <# This will refresh the computer system info for all servers. #> 195 | Get-ImmyComputer -TargetGroupFilter Servers | Refresh-ComputerSystemInfo 196 | ``` 197 | 198 | 199 | ### Get-RmmComputer 200 | 201 | Coming Soon 202 | 203 | ### Get-ImmyComputer 204 | 205 | Coming Soon 206 | 207 | ## Filterscript Commands 208 | 209 | ### Get-ImmyComputer 210 | 211 | Returns a list of computers for the specified tenant, or all computers if it is cross tenant scoped. 212 | 213 | #### Usage 214 | 215 | ```powershell 216 | Get-ImmyComputer [-InventoryKeys] 217 | ``` 218 | 219 | #### Examples 220 | 221 | Coming soon 222 | 223 | ## Software Auto Update Commands 224 | 225 | ### Add-Script 226 | 227 | Coming Soon 228 | 229 | ### Get-Script 230 | 231 | Coming Soon 232 | 233 | ### Add-SoftwareVersion 234 | 235 | #### Usage 236 | 237 | ```powershell 238 | Add-SoftwareVersion [-SoftwareVersion ] 239 | [-SoftwareType {GlobalSoftware | LocalSoftware | WindowsUpdate | Chocolatey | Ninite}] 240 | [-DisplayName ] 241 | [-SemanticVersion ] 242 | [-TestRequired ] 243 | [-Url ] 244 | [-RelativeCacheSourcePath ] 245 | [-InstallerFile ] 246 | [-PackageHash ] 247 | [-TestFailedError ] 248 | [-InstallScriptId ] 249 | [-InstallScriptType {Global | Local}] 250 | [-TestScriptId ] 251 | [-TestScriptType {Global | Local}] 252 | [-UpgradeScriptId ] 253 | [-UpgradeScriptType {Global | Local}] 254 | [-UninstallScriptId ] 255 | [-UninstallScriptType {Global | Local}] 256 | [-PostInstallScriptId ] 257 | [-PostInstallScriptType {Global | Local}] 258 | [-PostUninstallScriptId ] 259 | [-PostUninstallScriptType {Global | Local}] 260 | [-LicenseType {None | LicenseFile | Key}] 261 | [-UpgradeStrategy {None | UninstallInstall | InstallOver | UpgradeScript}] 262 | [-PackageType {None | EntireFolder | InstallerFile}] 263 | [-InstallerType {None | File | Url}] 264 | [-BlobName ] 265 | [-Notes ] 266 | [-ProductCode ] 267 | [] 268 | ``` 269 | 270 | #### Examples 271 | 272 | ```powershell 273 | $download_page = Invoke-WebRequest -Uri 'https://github.com/dbeaver/dbeaver/releases/latest' -UseBasicParsing 274 | $url = $download_page.links | ? href -match '\.exe$' | select -Expand href -First 1 | % { 'https://github.com' + $_ } 275 | $versionString = $url -split '/' | select -Last 1 -Skip 1 276 | $latestVersion = $SoftwareVersions | sort SemanticVersion | select -last 1 277 | $createdVersion = Add-SoftwareVersion -SoftwareVersion $latestVersion -SemanticVersion $versionString -Url $url 278 | ``` 279 | 280 | ### Get-AllLocalScripts 281 | 282 | Coming Soon 283 | 284 | ### Get-AllGlobalScripts 285 | 286 | Coming Soon 287 | 288 | ## CW Automate Commands 289 | 290 | ### Invoke-CWAQuery 291 | 292 | Coming Soon 293 | 294 | ### Invoke-CWARestMethod 295 | 296 | Coming Soon 297 | 298 | ### Get-CWARestPages 299 | 300 | Coming Soon 301 | -------------------------------------------------------------------------------- /index.md: -------------------------------------------------------------------------------- 1 | --- 2 | # https://vitepress.dev/reference/default-theme-home-page 3 | layout: home 4 | 5 | hero: 6 | name: "immy.bot" 7 | text: "" 8 | tagline: "Documentation" 9 | image: 10 | src: /logo-256x256.png 11 | alt: ImmyBot 12 | actions: 13 | - theme: brand 14 | text: Getting Started 15 | link: /getting-started 16 | - theme: alt 17 | text: What's New 18 | link: /releases 19 | 20 | features: 21 | - title: FAQ 22 | details: Frequently Asked questions 23 | link: /FAQ 24 | - title: Add Users 25 | details: How to add users 26 | link: /add-users 27 | - title: Computer Onboarding 28 | details: Setup a New Computer using ImmyBot 29 | link: /onboarding 30 | - title: Integrations 31 | details: Integrations that ImmyBot supports 32 | link: /build-your-own-integration 33 | - title: User Roles and Security 34 | details: Restrict access to ImmyBot features 35 | link: /user-roles 36 | - title: Scripting 37 | details: Understand the Metascript engine 38 | link: /scripts 39 | - title: Terminology 40 | details: ImmyBot Jargon 41 | link: /terminology 42 | - title: Troubleshooting 43 | details: What do? 44 | link: /troubleshooting 45 | --- 46 | -------------------------------------------------------------------------------- /markdown-examples.md: -------------------------------------------------------------------------------- 1 | # Markdown Extension Examples 2 | 3 | This page demonstrates some of the built-in markdown extensions provided by VitePress. 4 | 5 | ## Syntax Highlighting 6 | 7 | VitePress provides Syntax Highlighting powered by [Shiki](https://github.com/shikijs/shiki), with additional features like line-highlighting: 8 | 9 | **Input** 10 | 11 | ```` 12 | ```js{4} 13 | export default { 14 | data () { 15 | return { 16 | msg: 'Highlighted!' 17 | } 18 | } 19 | } 20 | ``` 21 | ```` 22 | 23 | **Output** 24 | 25 | ```js{4} 26 | export default { 27 | data () { 28 | return { 29 | msg: 'Highlighted!' 30 | } 31 | } 32 | } 33 | ``` 34 | 35 | ## Custom Containers 36 | 37 | **Input** 38 | 39 | ```md 40 | ::: info 41 | This is an info box. 42 | ::: 43 | 44 | ::: tip 45 | This is a tip. 46 | ::: 47 | 48 | ::: warning 49 | This is a warning. 50 | ::: 51 | 52 | ::: danger 53 | This is a dangerous warning. 54 | ::: 55 | 56 | ::: details 57 | This is a details block. 58 | ::: 59 | ``` 60 | 61 | **Output** 62 | 63 | ::: info 64 | This is an info box. 65 | ::: 66 | 67 | ::: tip 68 | This is a tip. 69 | ::: 70 | 71 | ::: warning 72 | This is a warning. 73 | ::: 74 | 75 | ::: danger 76 | This is a dangerous warning. 77 | ::: 78 | 79 | ::: details 80 | This is a details block. 81 | ::: 82 | 83 | ## More 84 | 85 | Check out the documentation for the [full list of markdown extensions](https://vitepress.dev/guide/markdown). 86 | -------------------------------------------------------------------------------- /ncentral-integration-setup.md: -------------------------------------------------------------------------------- 1 | ::: info 2 | This page is now dedicated to the new N-Central integration, utilizing the new N-Central REST API & ImmyBot Dynamic Integrations. 3 | 4 | This new integration should provide improved stability over our classic (and soon to be deprecated) integration. 5 | 6 | Looking for the classic N-Central integration guide? 7 | We recommend against it, but here is [the classic setup guide](/old-ncentral-integration-setup.html). 8 | ::: 9 | # N-Central REST API Dynamic Integration 10 | 11 | Setting up this integration allows you to: 12 | 1. Import customers from N-Central 13 | 2. Import computers from N-Central 14 | 3. Manage all computers in N-Central without deploying the ImmyBot Agent 15 | 16 | ## Create ImmyBot Role in N-Central 17 | 18 | ImmyBot currently requires the following role permissions to operate correctly: 19 | 20 | ### Devices 21 | - Devices View 22 | - All Devices -> Read Only 23 | - Scheduled Tasks 24 | - Scheduled Tasks -> Manage 25 | - Downloads 26 | - N-central Installers Download 27 | 28 | Create an "ImmyBot" role in your N-Central instance using above roles. 29 | ![](./.vitepress/images/ncentraldocs/add_userrole_guide_1.png) 30 | 31 | ![](./.vitepress/images/ncentraldocs/new_add_user_guide_1.png) 32 | 33 | 34 | ## Create an API-Only ImmyBot user in N-Central 35 | 36 | N-Able themselves have an [offical short guide for doing this we recommend following](https://documentation.n-able.com/N-central/userguide/Content/User_Management/Role%20Based%20Permissions/role_based_permissions_create_APIuser.htm) for this part, but here is a recap: 37 | 38 | 1. Create a new "ImmyBot" user in the instance with the "ImmyBot" role applied. 39 | 2. Set a password (it is required for now but the api team is working on removing this) 40 | 3. Under "Access Groups", add an Access Group that covers all of your tenants (or at least an access group that covers the tenants you want to have access to in ImmyBot) 41 | 4. Under "API Access", ensure "Api-Only User" is checked. 2FA MUST be disabled for the API User! 42 | 5. Save the new ImmyBot user, and press the "Generate JSON Web Token" button. Copy this value somewhere for later. 43 | 44 | **IMPORTANT** - Right now, the password for the api user needs to be reset every 90 days. Your integration will stop working if you do not reset the password. The api team has also mentioned they are looking to remove this functionality for api users. 45 | 46 | 47 | ## Add the necessary 'RunScript' Automation Policy 48 | 49 | After completing the new API-Only user setup, it's time time add an Automation Policy to N-Central so Immybot can 50 | run scripts on the machines. 51 | 52 | First, navigate to the "Script/Software Repository" under "Schedules Tasks" beneath the "Configuration" tab in N-Central. 53 | Once at the Script Repository page, select "Add" -> "Automation Policy". 54 | ![](./.vitepress/images/ncentraldocs/add_automation_policy_1.png) 55 | 56 | Second, download the ImmyBot RunScript Automation Policy and upload it to your instance. Fill out the Name and Description how you see fit if required. 57 | ![](./.vitepress/images/ncentraldocs/add_automation_policy_2.png) 58 | 59 | Last step is to ensure this new automation policy we have uploaded is able to be invoked by the Immybot API User. 60 | Find the automation by searching for "Immybot", then flipping the `Enable API` switch. Accept the confirmation modal, then copy the `Repository ID` for later use. 61 | ::: warning Make sure you copy YOUR `Repository ID`, as this identifier for the automation policy will be unique across every N-Central instance! 62 | ::: 63 | ![](./.vitepress/images/ncentraldocs/add_automation_policy_3.png) 64 | 65 | ## Add integration for N-Central 66 | 67 | After completing setup in N-Central, it's time to add the integration to ImmyBot. 68 | Navigate to the "Integrations" page in ImmyBot, and create a new `N-Central v2` integration. 69 | Input a name you'd like for the integration, followed by your N-Central server URL, and the `JWT` you copied in the steps to make an "ImmyBot" API user. 70 | Then, input the `RepositoryId` gathered from the step before. 71 | Lastly, flip the `Enable Integration` switch. 72 | 73 | ::: warning If the `Health Check` reports an error after enabling the integration, ensure you have completed the above steps correctly. If you continue to have issues, reachout to the community or support for assistance. 74 | ::: 75 | 76 | **If your error message contains "Unable to validate UI session: javax.validation.ValidationException: Unable to validate UI session.", then reset the password on your api user and generate a new JWT. This is a limitation imposed by N-Central** 77 | 78 | ![](./.vitepress/images/ncentraldocs/add_integration_guide_new_1.png) 79 | 80 | ## Import your customers 81 | 82 | ![](./.vitepress/images/2021-03-23-18-57-19.png) 83 | 84 | ![](./.vitepress/images/2021-03-23-19-01-36.png) 85 | 86 | Alternatively, you can create/map only certain customers. 87 | 88 | When you map a customer from an RMM, the computers will undergo Identification 89 | 90 | ![](./.vitepress/images/2021-03-23-19-03-33.png) 91 | 92 | ![](./.vitepress/images/2021-03-23-19-06-55.png) 93 | 94 | ![](./.vitepress/images/2021-03-23-19-08-30.png) 95 | 96 | ## Troubleshooting 97 | 98 | ### My customers are showing up but no computers 99 | Login to N-Central as the ImmyBot User and accept the EULA 100 | 101 | ### Unable to validate UI session 102 | 103 | If your error message contains "Unable to validate UI session: javax.validation.ValidationException: Unable to validate UI session.", then reset the password on your api user and generate a new JWT. Passwords are required to be reset every 90 days, even for api users - https://github.com/ToschAutomatisering/PS-NCentral/issues/5. This is a limitation imposed by N-Central that will hopefully be addressed in a future release. 104 | -------------------------------------------------------------------------------- /ninjarmm-integration-setup.md: -------------------------------------------------------------------------------- 1 | # NinjaRMM Dynamic Integration 2 | 3 | ### Setting up this integration allows you to: 4 | 5 | - Import customers from NinjaRMM 6 | - Import computers from NinjaRMM 7 | - Manage all computers in NinjaRMM without deploying the ImmyBot Agent 8 | - Create ImmyBot Role in NinjaRMM 9 | 10 | ### Configure the following in general settings (Administration -> General -> Settings): 11 | 12 | - Ninja Agent uninstall prevention -> OFF (Optional: This permission is only needed so ImmyBot can also uninstall the Ninja agent) 13 | - Advanced Installer Options -> ON 14 | 15 | ### ImmyBot currently requires the following client app scopes to operate correctly: 16 | 17 | - Monitoring 18 | - Management 19 | - Control 20 | 21 | ### As well as the following grant types: 22 | 23 | - Authorization Code 24 | - Refresh Token 25 | 26 | ## Create a client app in your NinjaRMM instance using above permissions: 27 | (`Administration` -> `Apps` -> `Api` -> `Add`) 28 | 29 | ![image](https://github.com/user-attachments/assets/5a27d217-a574-4a34-b42a-dd9a984e2ce1) 30 | > [!WARNING] 31 | > Note: Change the "instance" in the redirect uri to your ImmyBot subdomain 32 | 33 | ## Copy the below script to NinjaRMM Automation library and name it ImmyBot: 34 | (`Administration` -> `Library` -> `Automation` -> `Add` -> `New Script`) 35 | 36 | ```powershell 37 | Param( 38 | [Parameter(Mandatory=$true)] 39 | [string]$code 40 | ) 41 | 42 | $bytes = [System.Convert]::FromBase64String($code) 43 | $DecodedCommand = [System.Text.Encoding]::UTF8.GetString($bytes) 44 | 45 | # Execute Script Content 46 | iex $DecodedCommand 47 | Write-Host "Ephemeral Agent started" 48 | ``` 49 | 50 | Before leaving the script, also create a `Script Variable`. 51 | 1. Hit `+ Add` next to `Script Variables`. 52 | 2. Select the `String/Text` type. 53 | 3. Enter `Code` as the variable name. 54 | 4. Hit `Add` to save it. 55 | 56 | Note the script Id in the URL `https://{region}.ninjarmm.com/#/editor/script/71` -> `71`. 57 | It will be needed as one of the parameters in the integration setup to run scripts. 58 | 59 | ## In ImmyBot, create a new dynamic integration with the NinjaRMM integration type: 60 | (`Show More` -> `Integrations` -> `Add Integration` -> `NinjaRMM`) 61 | 62 | Add the required parameters and authenticate the OAuthInfo parameter with a NinjaRMM user with sufficient privileges: 63 | ![image](https://github.com/user-attachments/assets/78b760fd-b0f9-4230-9b3e-389d487dfea3) 64 | > [!WARNING] 65 | > At this time Client IDs do not support special characters. 66 | > Please create a new client app if one is generated for you. 67 | 68 | 69 | > [!WARNING] 70 | > Currently the UI element for the OAuthInfo parameter button will not persist when you refresh the browser window. 71 | > This will not kill your integration, so just leave it as is. 72 | 73 | 74 | At this point, you should be able to map clients. Once clients are mapped, agents will start getting identified. 75 | -------------------------------------------------------------------------------- /old-ncentral-integration-setup.md: -------------------------------------------------------------------------------- 1 | ::: warning 2 | This classic N-Central integration is soon to be deprecated and not recommended for further use. 3 | It is unlikely to receive further updates. 4 | 5 | Please migrate to the [New N-Central REST API Integration](/ncentral-integration-setup.html) 6 | ::: 7 | # N-Central Integration 8 | 9 | Setting up this integration allows you to 10 | 1. Import customers from N-Central 11 | 2. Import computers from N-Central 12 | 3. Manage all computers in N-Central without deploying the ImmyBot Agent 13 | 14 | ## Create ImmyBot Role in N-Central 15 | 16 | ImmyBot currently requires the following role permissions to operate correctly: 17 | 18 | ### Devices 19 | - Devices View 20 | - All Devices -> Read Only 21 | - Direct Support 22 | - Command Prompt -> Manage 23 | - File System -> Manage 24 | - Remote Control 25 | - Custom -> Manage 26 | - Take Control -> Manage 27 | - Network Devices 28 | - Add/Import Devices -> Manage 29 | - Edit Device Settings -> Manage 30 | 31 | Create an "ImmyBot" role in your N-Central instance using above roles. 32 | ![](./.vitepress/images/ncentraldocs/add_userrole_guide_1.png) 33 | 34 | ![](https://github.com/immense/immybot-documentation/assets/31077619/0e76619f-31af-4869-a9ac-78a221614aa9) 35 | 36 | 37 | ## Create ImmyBot user in N-Central 38 | 39 | Create a new "ImmyBot" user in the instance with the "ImmyBot" role applied. 40 | ![](./.vitepress/images/ncentraldocs/add_user_guide_1.png) 41 | ![](./.vitepress/images/ncentraldocs/add_userrole_guide_2.png) 42 | 43 | ## Login to the new ImmyBot user to get MFA code and accept EULA 44 | 45 | Once you have created the new ImmyBot user account, you must attempt to login 46 | so that you may retrieve the MFA key, and complete any initial setup. 47 | After entering the accounts email and password, there will be a MFA QR code displayed. 48 | You MUST press the "CAN'T SCAN IT?" button to get the Base32-encoded MFA key. 49 | After saving the key, use [a site such as this](https://totp.danhersam.com/?period=30&digits=6) to get the current token from the key, or temporarily scan the QR code on a device to complete sign-in. 50 | ![](./.vitepress/images/ncentraldocs/login_mfa_guide_1.png) 51 | ::: tip 52 | Make sure you accept the EULA when you login, otherwise the computers will not import! 53 | ::: 54 | 55 | ## Add integration for N-Central 56 | 57 | After completing setup in N-Central, it's time to add the integration to ImmyBot. 58 | Navigate to the "Integrations" page in ImmyBot, and create a new "N-Central" integration. 59 | Input all the N-Central user account data to the fields on the right. 60 | ![](./.vitepress/images/ncentraldocs/add_integration_guide_1.png) 61 | ![](./.vitepress/images/ncentraldocs/add_integration_guide_2.png) 62 | 63 | Press the "Verify Credentials" button, then, if completed successfully, press the button again to save the integration. 64 | 65 | ## Import your customers 66 | 67 | ![](./.vitepress/images/2021-03-23-18-57-19.png) 68 | 69 | ![](./.vitepress/images/2021-03-23-19-01-36.png) 70 | 71 | Alternatively, you can create/map only certain customers. 72 | 73 | When you map a customer from an RMM, the computers will undergo Identification 74 | 75 | ![](./.vitepress/images/2021-03-23-19-03-33.png) 76 | 77 | ![](./.vitepress/images/2021-03-23-19-06-55.png) 78 | 79 | ![](./.vitepress/images/2021-03-23-19-08-30.png) 80 | 81 | ## Troubleshooting 82 | 83 | ### My customers are showing up but no computers 84 | Login to N-Central as the ImmyBot User and accept the EULA 85 | -------------------------------------------------------------------------------- /onboarding.md: -------------------------------------------------------------------------------- 1 | # Setup your first Computer 2 | 3 | When you first login to ImmyBot the Getting Started Wizard will be prompt you to create your ImmyBot flash drive, and plug it into the new computer. 4 | 5 | **THIS IS A ONE TIME PROCESS, YOU DO NOT NEED TO CREATE A FLASH DRIVE FOR EACH CLIENT. YOU WILL CHANGE THE CLIENT AFTER THE MACHINE IS IN IMMYBOT** 6 | 7 | ![image](https://user-images.githubusercontent.com/1424395/173570369-b7a69a46-95b8-4a85-a4f9-9a4dda57b7e7.png) 8 | 9 | **We recommend unboxing a physical computer (Dell, HP, or Lenovo) so we can demonstrate applying the latest manufacturer BIOS and driver updates.** 10 | 11 | **If you insist on testing on a virtual machine, do the following to receive the PPKG inside an ISO, then mount it to the VM, and press the Windows Key 5 times when you are at the Region Selection screen. If you are past the region selection screen, simply double click the PPKG from the mounted disk** 12 | 13 | ![image](https://user-images.githubusercontent.com/1424395/173570635-c50681ea-5612-4326-8203-c0de62e2c154.png) 14 | 15 | ![image](https://user-images.githubusercontent.com/1424395/173571790-482162a3-a655-42ce-8d06-8dcd6ae973e8.png) 16 | 17 | Once the computer is identified, you will be directed to that computer to begin the Onboarding process: 18 | 19 | ![image](https://user-images.githubusercontent.com/1424395/173592966-cb7d3ccd-098c-4940-bfa0-a435ca68d513.png) 20 | 21 | ImmyBot needs: 22 | 1. Customer 23 | 2. Primary User (That will be using the computer, optional but recommended) 24 | 25 | ![image](https://user-images.githubusercontent.com/1424395/173594097-f975123b-217f-42ef-aa47-2b816a5593b6.png) 26 | 27 | 28 | You only have one customer and one person right now, and it’s your MSP and you. That’s fine, we’ll pretend we’re setting up a computer for you and your MSP. 29 | 30 | > [!TIP] 31 | > Customers can be imported from your RMM or PSA, or by setting up the Azure integration 32 | 33 | > [!TIP] 34 | > People are imported from your customers' Azure AD via the Azure integration 35 | 36 | An "Onboarding" session will be created for this computer, and ImmyBot will apply the "Recommended Deployments" 37 | 38 | > [!TIP] 39 | > You can add your own Deployments and re-run this session as many times as you like until everything is to your liking. 40 | 41 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "devDependencies": { 3 | "@ulu/vitepress-auto-menus": "^0.0.3", 4 | "mermaid": "^10.5.0", 5 | "path": "^0.12.7", 6 | "vite": "^5.0.11", 7 | "vitepress": "^1.0.0-rc.31", 8 | "vitepress-plugin-mermaid": "^2.0.16", 9 | "vue": "^3.3.4" 10 | }, 11 | "scripts": { 12 | "docs:dev": "vitepress dev --port 5175", 13 | "docs:build": "vitepress build", 14 | "docs:preview": "vitepress preview" 15 | }, 16 | "dependencies": {} 17 | } 18 | -------------------------------------------------------------------------------- /public/ImmyBotRunScriptV2.amp: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 94a2aa35-ef52-44e3-8422-2b611db86408.StdOut 7 | OutputObject 8 | 9 | StdOut 10 | 11 | 12 | 94a2aa35-ef52-44e3-8422-2b611db86408.ExitCode 13 | OutputObject 14 | 15 | ExitCode 16 | 17 | 18 | 94a2aa35-ef52-44e3-8422-2b611db86408.Exception 19 | OutputObject 20 | 21 | Exception 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 490,571 31 | Assembly references and imported namespaces serialized as XML namespaces 32 | 33 | 34 | 35 | 36 | 37 | 38 | [BatchScript] 39 | 40 | 41 | 42 | 43 | [ScriptPath] 44 | 45 | 46 | 47 | 48 | [FileName] 49 | 50 | 51 | 52 | 53 | 54 | 55 | [RunPowerShellScript_StdOut] 56 | 57 | 58 | 59 | 60 | [RunPowerShellScript_ExitCode] 61 | 62 | 63 | 64 | 65 | [RunPowerShellScript_Exception] 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/public/favicon.ico -------------------------------------------------------------------------------- /public/immybot-glasses.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/public/immybot-glasses.png -------------------------------------------------------------------------------- /public/logo-256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/immense/immybot-documentation/51e2ab66f351b4a1ece768eb0331345481c07c8b/public/logo-256x256.png -------------------------------------------------------------------------------- /recommended-deployments.md: -------------------------------------------------------------------------------- 1 | # Recommended Deployments 2 | 3 | ## Create Profile for Primary User 4 | 5 | This allows Immy to set default browser and pdf editors. 6 | 7 | Remember how Microsoft made default PDF handler and default browser user level settings? These settings are stored in the profile of the user. Specifically in the user’s registry. But this is a new computer, and there is no user registry because the user hasn’t logged into the computer, and therefore a profile doesn’t exist for us to specify those settings. Rather than requiring you to ask the user for their password, we fetch their SID from AzureAD. If we find that the user is synced from Active Directory, we will use the SID from Active Directory. If the user is cloud only, we use their Azure AD SID. For the more discerning you may be wondering how we deal with the UserChoice hash, the anti-tamper mechanism preventing the automatic setting of these preferences. 8 | 9 | ## Microsoft 365 Apps 10 | Immy installs the apps the selected user is licensed for. 11 | Immy contains recommended deployments for 12 | * Apps for business 13 | * Apps for enterprise 14 | * Project 15 | * Visio 16 | 17 | You may be tempted to disable these because you are afraid Immy will install all of these apps on every computer. These deployments are limited using a “Metascript” filter that reaches out to the Microsoft Graph API to determine whether the selected user has a license for the product in question. 18 | 19 | ## Dell/Lenovo/HP Updates 20 | ImmyBot will install the latest updates from Dell, HP, and Lenovo, including driver updates and BIOS updates. 21 | 22 | You may be tempted to disable these Deployments as you don’t want HP updates applying to your Dell. This won’t happen. Each deployment uses a Filter script to ensure that these updates only apply to the appropriate machines 23 | 24 | ## Adobe Reader 25 | You may be tempted to disable this deployment because not all of your customers use Adobe Reader. You should instead leave it enabled and handle exceptions to the rule. See more under “Deployment Resolution” 26 | 27 | ## Set Computer Name and Domain Join 28 | This is one that I’d advise you to turn off, and instead customize for each customer. We leave it as a recommended deployment mostly to raise awareness that ImmyBot has the capability, but fully expect you to override it to suit your needs. 29 | -------------------------------------------------------------------------------- /releases-2020.md: -------------------------------------------------------------------------------- 1 | # Releases in 2020 2 | 3 | ## 0.38.2 4 | 5 | Released 2020-12-29 6 | 7 | ### New Features 8 | 9 | Updated the export default name to be meaningful. 10 | 11 | ![image](https://immybot.blob.core.windows.net:443/media/15b34d24-cffc-453f-a8f1-bf2db2efc422.png) 12 | 13 | ![image](https://immybot.blob.core.windows.net:443/media/f0c9037a-85f3-4163-b122-9fe5fdeacaa6.png) 14 | 15 | Added a Uri datatype for maintenance task parameters. 16 | 17 | ![image](https://immybot.blob.core.windows.net:443/media/c6a0ee48-29e4-48a3-a349-44aaf7d601b1.png) 18 | 19 | This parameter is available as a Uri type in power shell for users to us inside of scripts. 20 | 21 | ![image](https://immybot.blob.core.windows.net:443/media/e54f2606-7869-4fab-a18b-c8868c49f319.png) 22 | 23 | ### Improvements 24 | 25 | - When creating new software versions, we will default the new version's settings to the previous version's settings. This is generally more reliable that using the analysis results by default. If there is no previous version, then we will still use the analysis results as default. 26 | - Adds the result message to the action column in the deployment excel export to help indicate success/failure. 27 | - Using the new Uri datatype no additional parsing will be needed to convert a string to a Uri inside of the script. 28 | - Made the system update page show current version release notes 29 | - Added current release update notes; Switched to using cards for displaying releases 30 | - Display computer provider type button for each RMM Link instead of type and hid disabled links 31 | - Updates the Schedules List to show the same Target fields that the Deployment List shows. 32 | 33 | - ![image](https://immybot.blob.core.windows.net:443/media/ea0054df-3343-43cf-8326-6ac5f0fdf5b2.png) 34 | 35 | ### Bug Fixes 36 | 37 | - Fixed issue with saving global maintenance task with non-file parameters 38 | - Fixed an issue when uploading an installer Immy would not try and match it to an existing software. 39 | - Fixed a bug on the upload software version page where clicking the **next** button was not loading the next screen. 40 | - Fixed a bug when saving cross tenant deployments where we did not clear the tenant field if the deployment was previously for a specific tenant. 41 | - Fixed issues with the session list page not showing correct results when the time filter was applied. 42 | - Fixed an issue where we could show non IP addresses for a computer's external IP field when the External IP Inventory script runs 43 | - Fixed an issue where BITS Download would not fallback to basic download if the command timed out. 44 | - Fixed issue with showing the updated by and update by by person on the Schedules List page. 45 | - Hid the Download ImmyAgent link when ImmyAgent RMMLink is disabled. 46 | - When detecting software version after install a newer version than expected will no longer cause a failure for that action. 47 | - This fixes the case in where some software auto update themselves right after installation. 48 | 49 | ## 0.38.1 50 | 51 | Released 2020-12-23 52 | 53 | ### Bug Fixes 54 | 55 | - Corrected issue preventing Maintenance Tasks from being saved 56 | 57 | ## 0.38.0 58 | 59 | Released 2020-12-21 60 | 61 | ### New Features 62 | 63 | #### Maintenance Tasks Files 64 | 65 | ![image](https://immybot.blob.core.windows.net:443/media/a3575538-bde6-4d5b-89a2-85c0efdaeba4.png) 66 | 67 | - Specify a default file if the user doesn't specify one 68 | - Include utilities with maintenance tasks by marking the parameter as hidden 69 | 70 | ![image](https://immybot.blob.core.windows.net:443/media/a3575538-bde6-4d5b-89a2-85c0efdaeba4.png) 71 | 72 | #### Log Highlighting 73 | 74 | ![image](https://immybot.blob.core.windows.net:443/media/372b9485-34a8-4316-96cb-89ff338152a2.png) 75 | 76 | - Highlights the important logs for a software or task so they are more easily recognized. 77 | 78 | #### Safely create Uris for REST APIs 79 | 80 | ![image](https://immybot.blob.core.windows.net:443/media/a5e267ee-bda3-40e8-89e0-67a7a3c07e9d.png) 81 | 82 | ##### Example 83 | 84 | ```powershell 85 | Add-UriQueryParameter -Uri 'https://my.thingwithqueryparams.com/items' -Parameter @{'Filter'='subject like "hello"'} 86 | ``` 87 | 88 | ##### Output 89 | 90 | ``` 91 | https://my.thingwithqueryparams.com:443/items?Filter=subject+like+%22hello%22 92 | ``` 93 | 94 | #### Accessing Azure KeyVault 95 | 96 | ```powershell 97 | $Headers = Get-ImmyAzureAuthHeader -Endpoint Keyvault 98 | Invoke-RestMethod 'https://.vault.azure.net/secrets/secretname?api-version=7.1' -Header $Headers | Select -Expand Value 99 | ``` 100 | 101 | ![image](https://immybot.blob.core.windows.net:443/media/6b9e3afc-b182-4d51-b6c6-d01fff3033b9.png) 102 | 103 | #### Access arbitrary Azure authenticated resource URIs 104 | 105 | ```powershell 106 | $Headers = Get-ImmyAzureAuthHeader -ResourceUri 'https://vault.azure.net' 107 | Invoke-RestMethod 'https://.vault.azure.net/secrets/secretname?api-version=7.1' -Header $Headers 108 | ``` 109 | 110 | ### Improvements 111 | 112 | - Added the capability for ImmyAgent Provisioning packages to be downloaded an ISO. 113 | ![image](https://immybot.blob.core.windows.net:443/media/67960ec4-5b96-4d2c-8d68-a1f5d0010234.png) 114 | - Added date/time tooltips to session times to see specifically when a session started 115 | - Removed automatic software evaluation run from computer details page 116 | - Adds Open remote session buttons to the computer deployment list. 117 | - Adds a checkbox to include/exclude offline computers from the computer list page. 118 | - Configuration task parameters are now available in software test scripts. 119 | - Added OS Name and Manufacturer to the Computer Overview tab. 120 | - Added dependency badges to maintenance action items 121 | - Added default to maintenance action table to hide actions with `No Action` to reduce clutter. 122 | 123 | * Removed unnecessary show preview div from Computer Details->Software tab 124 | * Removed automatic software evaluation from Computer Details page 125 | * Added Remote Session button on Edit Deployment page 126 | * Added offline computer checkbox filter to computer list page 127 | * Fixed test script result parsing and added config task variables to it 128 | * Removed legacy TestResult syntax from SoftwareVersion scripts 129 | * Added date tooltips to sessions/actions times 130 | * Set JobArgs to Suppress reboots when running action from Computer Details; Needs Attention 131 | * Moved the drag handle for RMM Priority ordering to the left side 132 | * Start system required inventory in overwrite existing command 133 | * Added dependency badge to maintenance session action list item and action table 134 | * Refactored to keep GetAuthConnectionString() private and added -Endpoint KeyVault as an alias for the resourceUri 135 | * Added parametersetnames to Get-ImmyAzureAuthHeader to differentiate between orthogonal use cases 136 | * Default to hiding 'No Action' in the computer actions table 137 | * Removed string expansion from MetascriptHost to prevent need for backticks in Set-ComputerName Metascript 138 | * Decreased timeout for the pending reboot check as this could cause sessions to hang for an unnecessarily long period of time if the script doesn't respond 139 | 140 | ### Bug Fixes 141 | 142 | - Fixed 'Rerun' button action not suppressing reboots. 143 | - Fixed maintenance action start and end time issues showing the wrong times 144 | - Fixed an issue where the computer would show online even though all agents were disabled. 145 | - Maintenance Task parameters and built in variables values are preserved and no longer string expanded in the Metascript context, allowing you to pass these values unaltered to scripts run via Invoke-ImmyCommand 146 | - Fixed UTC/local issues with action start and end time 147 | - Fixed online status for disabled RMMLinks 148 | 149 | ## 0.37.10 150 | 151 | Released 2020-12-15 152 | 153 | ### Bug Fixes 154 | 155 | - Fixes an issue on the computer software list where some fields were not immediately updating. 156 | - Reduces padding of each item in the software list 157 | - Fixed issue where scripts would occasionally fail to execute as the user even though the user is logged in 158 | - Invoke-ImmyCommand no longer returns System.Object instead of $null, making it easier to detect null results 159 | - $using variables no longer throw a null reference exception when the value is null in the parent context 160 | - $using variables will issue a warning when they are not present in the parent context, previously a NullReferenceException was thrown both when the variable was declared but had a null value and when the variable was not declared. (Sometimes null is a valid value) 161 | 162 | ## 0.37.9 163 | 164 | Released 2020-12-14 165 | 166 | ### Bug Fixes 167 | 168 | - Fixed regression in 0.37.8 that broke inventory for most machines 169 | 170 | ## 0.37.8 171 | 172 | Released 2020-12-12 173 | 174 | ### New Features 175 | 176 | - Adds a helpful alert letting the user know that user scripts with a user action trigger of `Run once at login`, `Run at every login`, and `Active Setup at login` will run immediately if the user is logged in. 177 | 178 | ### Bug Fixes 179 | 180 | - Fixes an issue running some inventory scripts against computers running PowerShell 2.0 (And possibly other PS versions, causing inventory to fail and computer names to be displayed as GUIDs) 181 | - Un-reversed order of first and last names on edit deployment page 182 | - Adds missing maintenance task category to the maintenance task details page 183 | - Fixes an issue where we were not properly updating the maintenance action if the desired state was `Update If Found` and the software was not present` 184 | - Now properly resolves the action result to `Success`, the Action Type to `No Action`, and the Action Reason to `Software Missing`. 185 | - Fixes issue where RunAsUser fails because user is not a local admin 186 | - Fixed issue where Immy was pre-selecting incorrect Software after analyzing non-MSI installers 187 | - Fixes error when using 'Update if Found' with ninite packages. 188 | 189 | ## 0.37.7 190 | 191 | Released 2020-12-10 192 | 193 | ### Enhancements 194 | 195 | - Allows for saving scripts while focused in the editor by pressing Ctrl S. 196 | - Adds an alert prompting to save changes when navigating away from a modified script 197 | 198 | ### Bug Fixes 199 | 200 | - Fixes a permission issue when searching the computer list by primary user 201 | - Fixed object serialization issue from Windows Server 2003 machines 202 | 203 | ## 0.37.6 204 | 205 | Released 2020-12-09 206 | 207 | ### Bug Fixes 208 | 209 | - Fixes an issue where CW Control RMM Links were failing if the CW Control URL contained a specific route. 210 | - e.g. https://contoso.com/specificroute would not work, but it now does 211 | - Fixes the excel export on the Deployment page's Affected Computers panel 212 | - Fixes a bug on script details form where the scripts timeout was not showing the correct value 213 | - Fixes a bug when viewing the script details in a modal, where the default timeout was not being supplied. 214 | - Resolves issue where Immy incorrectly reports "User is not logged in" when a user is logged in over RDP 215 | - Fixes a bug on the computer details page sessions tab where sessions for other computers show up if you change the time filter 216 | - Fixes a bug in the computer list page, if the computer name is missing, we now show the device id 217 | 218 | ### Enhancements 219 | 220 | - If a provider fails to initialize, it will be automatically disabled to increase the overall health of Immy. 221 | 222 | ## 0.37.5 223 | 224 | Released 2020-12-08 225 | 226 | ### New Features 227 | 228 | - Function Scripts! Keep your code dry! You can now call scripts from other scripts. Simply create a new script with category Function, define your logic, and then call the function from another **MetaScript**. 229 | - Adds a new column to the session table called "Type" to indicate whether the session was "Scheduled" or "Manual". 230 | 231 | ### Bug Fixes 232 | 233 | - Fixed duplicate persons issue. Syncing persons from azure users now checks if there is an existing person with the same user principal name (email) and will update that person instead of creating a new one. 234 | - Fixes an issue where the onboarding form's primary user selector was returning people outside of the selected tenant (Only an issue for MSP users). 235 | - Fixes a bug where the `New` and `Copy as New` buttons were missing from the script selector. 236 | - Fixed an issue with Immybot using the incorrect software version when deploying the "latest" version 237 | - You can now analyze a version without specifying the "Installer Executable Path" if the file is a zip file 238 | - Renamed metascript `Get-RmmProvider` to `Get-RmmInfo` and added the information required to retrieve EDFs for Clients and Computers from Automate 239 | - Addresses memory performance issues with the computer list page 240 | - Fixes some default properties when loading the maintenance task form in a modal. 241 | Fixes a bug in Invoke-ImmyCommand where providing the same $using variable with different capitalization threw a duplicate variable error. 242 | 243 | ### Enhancements 244 | 245 | - Added logic to auto select an existing software by upgrade code on the software version upload page 246 | - Updates the deployment form's software, version, and configuration task "View" buttons 247 | 248 | ## 0.37.4 249 | 250 | Released 2020-12-08 251 | 252 | ### Bug Fixes 253 | 254 | - Fixed an issue with inventory scripts being retried every minute on devices that return exceptions 255 | 256 | ## 0.37.3 257 | 258 | Released 2020-12-01 259 | 260 | ### Bug Fixes 261 | 262 | - Fixed issue with terminal not rendering output when launched from Edit button on session logs 263 | - Fixes an issue where the suggested rmm link name conflicted with an existing name 264 | - Set the Hangfire Redis MaxStateHistoryLength to 5 to fix issues with uncontrolled memory leak 265 | 266 | ## 0.37.2 267 | 268 | Released 2020-11-24 269 | 270 | ### Hotfixes 271 | 272 | - Fixed several broken maintenance session links that were not bringing the user to the correct page. 273 | - Fixed an error in metascripts about the use of duplicate `$__using` variables. 274 | - Fixed an issue rendering the xterm terminal within the script editor modal. 275 | 276 | ## 0.37.1 277 | 278 | Released 2020-11-23 279 | 280 | ### Hotfixes 281 | 282 | - Fixed filter scripts to only return a single computer when run for a maintenance session. Not doing this was causing memory to balloon up unnecessarily. 283 | 284 | ## 0.37.0 285 | 286 | Released 2020-11-23 287 | 288 | ### Enhancements 289 | 290 | Check out our new documentation site! https://docs.immy.bot/ 291 | 292 | ##### Actionable Software Inventory 293 | 294 | - Updated the _Software_ tab to now provide actionable buttons for software and maintenance tasks that are not compliant 295 | 296 | ##### Automatic Onboarding 297 | 298 | - Plug in the USB drive and setup begins automatically without having to login to Immy 299 | - Create a new _Windows 10 Setup USB Package_ and enable the auto-onboarding option 300 | - Added a new tab called _Sessions_ that allows a user to easily see computer sessions without leaving the computer details page 301 | - Added an _Onboarding_ tab to the computer details page to allow easier changing of customer and primary user 302 | 303 | ##### Script Engine 304 | 305 | - Simplified Filter Script syntax, removed -TargetType and -TargetGroupFilter as these are selectable in the UI 306 | - Added xterm.js to the Script Editor for better handling of large return payloads 307 | - Write-Host output is no longer suppressed when run within Invoke-ImmyCommand 308 | - Write-Debug, Write-Verbose, Write-Warning, and Write-Error all work both within Metascripts, and scripts run via Invoke-ImmyCommand (Note: $DebugPreference and $VerbosePreference need to be set to 'Continue' as the PowerShell default will suppress the output from these cmdlets) 309 | - Write-Host in Metascripts and Cloudscripts supports -ForegroundColor, -BackgroundColor and -NoNewLine parameters 310 | - Terminal now formats Errors and many other objects according to the PowerShell 7 default 311 | - PowerShell 7 $ErrorView= 'ConciseView' is now supported 312 | - Exceptions thrown within scripts now show the script line instead of a backend stack trace 313 | - Added $AzureTenantId variable to all scripts 314 | 315 | ### Stability 316 | 317 | - Fixed memory leak in the user affinity job that was causing instances to hang on an error page 318 | - Added availability health checks for some azure resources to help diagnose issues faster. 319 | 320 | #### Hotfixes 321 | 322 | - Fixed an issue where renaming a computer did not immediately show the change in the browser 323 | - Fixed an issue with sending test emails from the smtp page. It would sometimes incorrectly throw an error about enabling authentication 324 | - Added Update If Found desired state for Ninite Software 325 | - Fixed selecting a software on the deployment page to auto select "Installed" and "Latest" as the default options 326 | - Fixed an issue where it was not possible to view global maintenance task scripts from within the Maintenance Task interface 327 | - ImmyAgent no longer executes Batch/CommandLine as PowerShell 328 | 329 | #### Security 330 | 331 | - Get-ImmyComputer no longer returns computers from other tenants when run by a non-MSP user 332 | 333 | ## 0.36.4 334 | 335 | Released 2020-11-19 336 | 337 | ### Bug Fixes 338 | 339 | - Moved the pending reboot check from the beginning of the session to the beginning of the execution phase so computers do not reboot during detection. Computers usually run detection during the day and we do not want to reboot computers while they are being used. 340 | 341 | ## 0.36.3 342 | 343 | Released 2020-11-13 344 | 345 | ### Bug Fixes 346 | 347 | - Fixes bug where rebooting a computer would sometimes hang the maintenance session 348 | - Fixes a typo `reading for onboarding` -> `ready for onboarding` 349 | - Fixed issue preventing a computer from rebooting if necessary before it starts a maintenance session 350 | - Fixes an issue where an action would immediately fail if the computer failed to reboot 351 | - e.g. A software is supposed to be uninstalled and then reinstalled. After the uninstall, a reboot may be attempted. If it fails, we will now still attempt the reinstall anyway. 352 | - Fixes a critical bug that could allow a person to be incorrectly associated with another tenant. 353 | 354 | ## 0.36.2 355 | 356 | Released 2020-11-04 357 | 358 | ### Bug Fixes 359 | 360 | - Fixed an issue where the `Update Now` and `Postpone` buttons were missing on the maintenance email when they were set to be shown by its schedule. 361 | 362 | ## 0.36.1 363 | 364 | Released 2020-11-02 365 | 366 | ### Bug Fixes 367 | 368 | - Run Maintenance button at the top of the Computer Details Page now suppresses reboots by default 369 | - Edit PSALink page no longer throws exception when CWManage API returns duplicate companies 370 | - Updated task type and task category label names on the task form 371 | - Fixed a null reference exception when calling Get-ImmyComputer passing in InventoryKeys 372 | 373 | ## 0.36.0 374 | 375 | Released 2020-10-26 376 | 377 | ### Features 378 | 379 | - New and improved **Computer Details Page** that shows much more details 380 | - Added Inventory Task feature 381 | - Added a **System Status Page** that shows script execution metrics for enabled RMM Providers 382 | - Added a **System Update Page** that allows an administrator to update to newer versions of ImmyBot when they are released 383 | - Implemented Downgrade logic for software 384 | 385 | #### Enhancements 386 | 387 | - Optimized script execution when using the CW Control RMM Provider 388 | - Optimized background job scheduling 389 | - Re-designed the **Computer List Page** 390 | - Merged the Onboarding and Pending Computer Pages into one page called **New Computers** 391 | - Made the ImmyAgent more scalable 392 | - Added a loading animation when filtering the **Computer List Page** 393 | - When a session expires and the page is reloaded, you will now be redirected back to the page you were on 394 | 395 | #### Bug fixes 396 | 397 | - Fixed CW Control extension to work on latest version of CW Control (2020.11) 398 | - Fixed session failing with Ninite fails to download 399 | - Fixed a CORS issue when new instances are registered with uppercase characters 400 | - Fixed an edge case when scripts erroneously indicate they have been modified when pressing cancel 401 | - Removed validation requirement for username in SMTP settings 402 | - Fixed Automate Computers with _UTC+0_ (UK) do not sync due an issue with using `DateTime.Subtract(0)` 403 | - Fixed an error occurring on Windows 7/PS 2.0 404 | - Fixed an edge case where a server got caught in an endless reboot 405 | - Removed the WiFi SSID minimum length for PPKGs 406 | - Fixed a bug where license files did not download before running the **Test** script 407 | - Fixed an issue where **User Context Scripts** were returning `'gt' is not recognized` 408 | - Fixed a bug where maintenance tasks were performed out of order when there was a software dependency 409 | - Fixed a bug on the Deployment Page where selecting a domain controller was causing an error 410 | - Fixed a bug in metascripts where `Get-ImmyComputer -TargetType TenantDomainControllers` was failing 411 | - Fixed bug where the Users List showed a _System_ user 412 | - Fixed a bug where bulk software detection failed on PS 2.0 and PS 3.0 when using `[Guid]::new` 413 | - Fixed a bug where the CW Automate Provider was not leveraging the 301 command 414 | - Fixed a bug where the ImmyAgent did not start on VMware VMs due to lack of BoardSerialNumber 415 | - Fixed some edge cases where sessions kept getting stuck in the _Created_ status 416 | - Fixed a bug where the ImmyAgent was defaulting to 10 seconds for the script execution 417 | - Fixed a bug where the software selector on the license form was showing parameters for linked maintenance tasks 418 | - Fixed a bug where maintenance task fields _Hidden_ and _Default Values_ were not saving on Create 419 | - Fixed a bug in the package analyzer where it was throwing `Key Not Found` for Inno version 6 installers 420 | - Fixed a bug with Deployments using a desired state of Uninstall/NotPresent that was causing failures due to _missing required parameters_ 421 | - Fixed a bug with maintenance task parameters not being provided to software install scripts 422 | - Fixed a bug where users could not open the **Maintenance Session Details Page** for computers they onboarded 423 | - Fixed a bug where deployments for maintenance tasks with password parameter types were unable to be deployed 424 | - Fixed a bug where the _Current User_ user action trigger was not available for scripts created on the software version form 425 | - Fixed a bug where the RMM to PSA auto client mapping failed when the RMM returns non-unique external ids 426 | - Fixed a bug where non-msp users could not access software or deploy the ImmyAgent 427 | 428 | ## 0.35.16 429 | 430 | Released 2020-10-23 431 | 432 | This is the first release in the release cycle 433 | -------------------------------------------------------------------------------- /scripts.md: -------------------------------------------------------------------------------- 1 | # Scripting Guide 2 | 3 | ## Best Practices 4 | * Use Ctrl+Shift+F or Ctrl+P in our script editor to find scripts that already do what you want. There is a lot of good logic in the built in function scripts 5 | * Have a machine you can test on 6 | * Have a _separate_ machine to test your sanity if you bork your first machine 7 | * Test by clicking Open Debugger in the logs 8 | * This gives you all available parameters on the left so you can test the script in its natural context 9 | * You can quickly revise the script here until it works as expected 10 | * Saving the script here saves it permanently 11 | * Don’t hardcode paths to installer or license files, instead rely on $InstallerFile and $LicenseFilePath 12 | * Don’t hardcode license values or other sensitive information, instead utilize $LicenseValue or a custom parameter 13 | * Avoid (where possible) installers that have client specfic licenses or customizations built in 14 | * If a generic installer isn't available (BitDefender) use Dynamic Versions (and potentially a URL parameter) to specify the download URL per customer or perhaps use an API to find the URL for the given customer 15 | * If the URL requires authentication, use a custom Download script to perform the authenticated download (CrowdStrike/SentinelOne) 16 | * Don’t repeat yourself. Leverage function scripts to reuse code 17 | * Include code to verify that the script did what it intended to do 18 | * For Tasks, implement a “test” script 19 | * For Software, make sure your Detection method works, and optionally implement a Test script to verify things are in working order 20 | * When a software Test script returns $false, ImmyBot will re-install the software. 21 | * Use Metascripts, especially if your script needs to restart the machine or access APIs like IT Glue and therefore will contain sensitive data like API keys 22 | * Use throw “The bad thing that happened, what user should do” to prevent cascading failure. That message will be shown to the user in a prominent location so they can take corrective action 23 | * Tasks have a “test” mechanism that should return $true or $false to indicate compliance 24 | 25 | **While it may be cumbersome to write additional logic to verify your work, the reward of knowing exactly how many machines are or are not compliant with your desired state is worth it. Without it, you are flying blind. With it, you know exactly how many machines require additional attention, giving you the opportunity to write better code that handles more edge cases. See the Helper Function section to see how we make your life easier.** 26 | 27 | ## Script Types 28 | 29 | * Software Detection 30 | * Software Action (Install/Uninstall/Update) 31 | * Maintenance Task Setter 32 | * Metascript (Deployment Target) 33 | * Filter Script (Deployment Target) 34 | * Device Inventory 35 | * Function 36 | * Dynamic Version 37 | * Download Installer 38 | * Module 39 | * Preflight 40 | * Integration 41 | 42 | ### Software Detection 43 | 44 | Software Detection scripts are used to determine whether an existing software is present and what version it may be. 45 | 46 | Avoid custom detection scripts where possible. Software with a custom detection script can't be matched to pre-existing inventory data on the machine, making it difficult to report on how many machines have the software already. Further, the "Assignable" software tab won't work since that matches the detection method to existing inventory data. However if your software doesn't create an entry in Add/Remove Programs, you may have no choice but to use a custom detection script. It is important to note that a lot of software creates hidden entries under Add/Remove Programs, ImmyBot inventories these hidden entries, further reducing the need for custom detection scripts. 47 | 48 | When you write your custom detection script, your best bet is to find a exe or dll file under Program Files\ or ProgramData\ that shows the version when you right click on it and go to Properties. To retrieve this version use a script similar to the following: 49 | 50 | ```powershell 51 | Get-Command "C:\Program Files*\\mysoftware.exe" -ErrorAction SilentlyContinue | %{ $_.Version.ToString() } 52 | ``` 53 | 54 | If there is no exe or dll file containing the version, perhaps there is a .ini, .config, .json or .xml file that contains the installed version. 55 | 56 | If all else fails, you can simply return "1.0" if a file associated to the software exists. 57 | 58 | These scripts **must return a string that will cast to a valid `System.Version`**. 59 | Returning an actual `System.Version` will fail. (Although we may correct this in the future) 60 | For example 61 | ``` 62 | $version = [String]"1.2.3" 63 | return $version 64 | ``` 65 | will work, but currently 66 | ``` 67 | $version = [System.Version]"1.2.3" 68 | return $version 69 | ``` 70 | will fail. 71 | 72 | ### Software Auto Update (Deprecated, use dynamic versions instead) 73 | 74 | These scripts are useful for automatically adding new versions for a software. 75 | Script should return a `$SoftwareVersion` object. 76 | ``` 77 | $SoftwareVersion = @{} 78 | $SoftwareVersion.url = $LatestPackage.OriginFile.OriginUri 79 | $SoftwareVersion.displayVersion = $VersionFromMsi 80 | return $SoftwareVersion 81 | ``` 82 | 83 | ### Software Version Action 84 | 85 | These scripts can be used on a software version for installation, post-installation, uninstallation, post-uninstallation, testing, and upgrade scripts. 86 | 87 | ### Maintenance Task 88 | 89 | These scripts are available only on maintenance tasks. 90 | 91 | ### Metascript Deployment Target 92 | 93 | These scripts are used on deployments as a target. 94 | 95 | They **must return `$true` or `$false`**. 96 | 97 | A value of `$true` indicates that the computer applies to this deployment. A value of `$false` indicates that the computer does not apply to this deployment. 98 | 99 | ### Filter Script Deployment Target 100 | 101 | These scripts are used on deployments as a target. 102 | 103 | They **must return a `Computer[]` array**. 104 | 105 | The deployment will only apply to computers specified in the returned array. 106 | 107 | ## Script Execution Contexts 108 | 109 | A script will have a specific execution context. This context determines how the script gets run. 110 | 111 | ### System 112 | 113 | The script runs on the computer under the system user. 114 | 115 | ### User 116 | 117 | The script runs on the computer under a specific user. 118 | 119 | ### Metascript 120 | 121 | The script runs on the server in the context of a specific computer. 122 | 123 | ### Cloudscript 124 | 125 | The script runs on the server in the context of a specific tenant. 126 | 127 | ## Variables 128 | 129 | Avoid setting these variables yourself or having variables with similar names. 130 | 131 | ### $AzureTenantId 132 | 133 | `[string]` The Azure Principal Id of the computer's tenant. 134 | 135 | #### Accessible in 136 | 137 | - Software Detection 138 | - Software Auto Update 139 | - Software Version Action 140 | - Maintenance Task Setter 141 | - Metascript Deployment Target 142 | - Filterscript Deployment Target 143 | 144 | ### $ComputerName 145 | 146 | `[string]` Name of the computer the session is running against 147 | 148 | #### Accessible in 149 | 150 | - Software Detection 151 | - Software Auto Update 152 | - Software Version Action 153 | - Maintenance Task Setter 154 | - Metascript Deployment Target 155 | 156 | ### $DetectionString 157 | 158 | `[string]` String used to find the software in the registry 159 | 160 | #### Accessible in 161 | 162 | - Software Version Action 163 | 164 | ### $DisplayName 165 | 166 | `[string]` Display Name of the Software Version 167 | 168 | #### Accessible in 169 | 170 | - Software Version Action 171 | 172 | ### $DisplayVersion 173 | 174 | `[System.Version]` version of the software being deployed `1.2.3.4` 175 | 176 | #### Accessible in 177 | 178 | - Software Version Action 179 | 180 | ### $InstallerFile 181 | 182 | `[string]` Full path to the installer file itself 183 | 184 | #### Accessible in 185 | 186 | - Software Version Action 187 | 188 | ### $InstallerFolder 189 | 190 | `[string]` Full path to the folder the installer file can be found in 191 | 192 | #### Accessible in 193 | 194 | - Software Version Action 195 | 196 | ### $InstallerLogFile 197 | 198 | `[string]` Suggested full path for log file. When used Immy will get the content of this file for you and display it in our logs. 199 | 200 | #### Accessible in 201 | 202 | - Software Version Action 203 | 204 | ### $IsPortable 205 | 206 | `[boolean]` 'True' or 'False' indicating whether the current computer is a laptop/tablet 207 | 208 | #### Accessible in 209 | 210 | - Software Detection 211 | - Software Auto Update 212 | - Software Version Action 213 | - Maintenance Task 214 | - Metascript Deployment Target 215 | 216 | ### $LicenseFilePath 217 | 218 | `[string]` Full path to the license file for the software (from the Deployment) Note: Software must be marked 'Licensed' and Software Version must indicate that it requires a License File and an Deployment applicable to this user/computer must specify a license file. 219 | 220 | #### Accessible in 221 | 222 | - Software Version Action 223 | 224 | ### $LicenseValue 225 | 226 | `[string]` From Deployment. Used for software that requires a key. Alternative usage could be to use this to hold additional command line parameters to customize installation for different computers. Software must be marked as Licensed for this variable to be replaced. 227 | 228 | #### Accessible in 229 | 230 | - Software Version Action 231 | 232 | ### $Method 233 | 234 | `[string]` Will be a value consisting of `[ "get" | "set" | "test" ]` that can be used in Combined Task scripts. 235 | 236 | #### Accessible in 237 | 238 | - Maintenance Task 239 | 240 | ### $PrimaryPersonAzurePrincipalId 241 | 242 | `[Guid]` User's unique identifier in Azure 243 | 244 | #### Accessible in 245 | 246 | - Software Detection 247 | - Software Auto Update 248 | - Software Version Action 249 | - Maintenance Task 250 | - Metascript Deployment Target 251 | 252 | ### $PrimaryPersonEmail 253 | 254 | `[string]` Mail Address of the person that most frequently uses this computer 255 | 256 | #### Accessible in 257 | 258 | - Software Detection 259 | - Software Auto Update 260 | - Software Version Action 261 | - Maintenance Task 262 | - Metascript Deployment Target 263 | 264 | 265 | ### $ProductCode 266 | 267 | `[string]` Product code of the version being deployed 268 | 269 | #### Accessible in 270 | 271 | - Software Version Action 272 | 273 | ### $Software 274 | 275 | `[Software]` The software that is running the auto update script. 276 | 277 | #### Accessible in 278 | 279 | - Software Auto Update 280 | 281 | ### $SoftwareName 282 | 283 | `[string]` Name of the Software 284 | 285 | #### Accessible in 286 | 287 | - Software Detection 288 | - Software Auto Update 289 | 290 | ### $SoftwareVersions 291 | 292 | `[ICollection]` The software versions of the software. 293 | 294 | #### Accessible in 295 | 296 | - Software Auto Update 297 | 298 | ### $TenantName 299 | 300 | `[string]` Name of company the computer belongs to 301 | 302 | #### Accessible in 303 | 304 | - Software Detection 305 | - Software Auto Update 306 | - Software Version Action 307 | - Maintenance Task 308 | - Metascript Deployment Target 309 | 310 | ### $UpgradeCode 311 | 312 | `[string]` Upgrade code of the software 313 | 314 | #### Accessible in 315 | 316 | - Software Detection 317 | - Software Auto Update 318 | 319 | ## Scripting Frequently Asked Questions 320 | ### Can I use custom parameters in my scripts? 321 | Yes. Add parameters to the Task your script is associated to. If this is a software install script, associate the task to the software as a "Configuration Task", and all parameters are passed into the Install scripts 322 | 323 | ### Can I deploy files along with my scripts? 324 | Yes. Tasks have a “File” parameter type. Immy will download the file and provide the path to the file in variable. If a zip file is provided, the zip file will be extracted and the path to the extracted zip folder will have Folder appended to the provided parameter name and be available to the task script. Ex. Providing a file parameter name $ZipFile, there will be an additional parameter created call $ZipFileFolder. $ZipFile will contain the path to the original zip file and $ZipFileFolder will contain the file path to the extracted contents of the zip file. 325 | 326 | ### Can I deploy a script to all of my computers? 327 | Yes, you do this by creating a Task. We strongly recommend your task includes a ‘Test’ so Immy can check its work and provide reporting on the effectiveness of your script. 328 | 329 | ### Why do I have to create a Configuration Task to get custom parameters into my Software? 330 | - Some software can only be configured at install time by providing command line parameters to the installer, think Antivirus products. 331 | - Some software can only be configured after they are installed, think VPN Profiles 332 | - Some software can go either way (Generally by manipulating config files or registry values) 333 | 334 | Let’s say your Software package accepts command line parameters at install time. You would create a Configuration Task with those parameters without implementing the scripts on that Task. ImmyBot will pass the parameters into the install script. 335 | 336 | Later you need to reconfigure this software on lots of machines. You discover that the parameters you passed into the installer are ultimately held as registry values (Duo Logon Provider is like this). At this time you would implement the scripts on the Software’s Configuration Task. These scripts task will test the existing registry values against the desired ones, and set them to the desired value, and then re-test to verify. 337 | 338 | ### How does Immy get the latest version of software? 339 | This is done via “Dynamic Versions”. Rather than upload the latest installer for every version of a piece of software, create a dynamic versions script that returns the most current version number, and the URL to download it. Reader, Zoom, 7zip, Chrome, Edge, Firefox, Bluebeam, Citrix, Egnyte, and many more already have dynamic version scripts defined. This allows Immy to keep these items up to date on all your machines. 340 | 341 | ## Configuration Task Helper Functions 342 | We provide helper functions for common tasks like Registry and configuration file manipulation 343 | 344 | When used in the context of a Task, these functions honor the $method variable containing the mode the script should be run in (‘test’, ‘set’, or ‘get’) 345 | 346 | **These must be run from the Metascript context 347 | ### Get-WindowsRegistryValue | RegistryShould-Be 348 | #### Overview 349 | Get-WindowsRegistryValue fetches the value of the specified Path and Name, and RegistryShould-Be tests and sets the value, creating missing keys/values if required 350 | 351 | On average this saves 8-10 lines of PowerShell per registry value and makes your code significantly more readable 352 | 353 | #### Usage 354 | * Microsoft Edge 355 | 356 | #### Example 357 | This assumes you have a parameter called ServerAddress 358 | 359 | ```powershell 360 | Get-WindowsRegistryValue -Path "HKLM:\Software\MySoftware" -Name "ServerAddress" | RegistryShould-Be -Value $ServerAddress 361 | ``` 362 | ### FileShould-Be 363 | #### Overview 364 | This accepts the source file path as input and verifies the files exists in the destination path, overwriting if the hashes don't match 365 | 366 | #### Example 1 - Config File 367 | This assumes you have created a parameter called ConfigFile 368 | ```powershell 369 | $ConfigFile | FileShould-Be -in "C:\ProgramData\MySoftware" 370 | ``` 371 | 372 | #### Example 2 - Zip File 373 | This assumes you have a parameter called ZippedConfig 374 | 375 | The following script will iterate recursively over the extracted files and place them in the target directory. It will verify the hash matches when in test mode. 376 | 377 | ```powershell 378 | # ImmyBot will automatically extract the Zip file and put the path it extracted it to into a variable named $ZippedConfigFolder 379 | $ZippedConfigFolder = Invoke-ImmyCommand { Get-ChildItem $using:Folder -Recurse -File } 380 | $ZippedConfigFolder | select -Expand FullName | ForEach-Object { 381 | $FilePath = $_ 382 | $FilePath | FileShould-Be -in "C:\Program Files*\MySoftware" 383 | } 384 | ``` 385 | 386 | ### XMLShould-Be 387 | Let's say your software has an XML file you need to change settings in. 388 | 389 | This assumes you have a parameter called ServerAddress 390 | #### Usage 391 | * OpenDental 392 | * SmartBoard 393 | 394 | #### Example 395 | See the scripts for OpenDental and SmartBoard for usage of this 396 | 397 | ```powershell 398 | $ConfigFilePath = "C:\ProgramData\MySoftware\configuration.xml" 399 | $XML = Get-Content $ConfigFilePath 400 | $XML = $XML | XMLShould-Be -XPath "/ServerAddress" -Value $ServerAddress 401 | $XML | Set-Content $ConfigFilePath 402 | ``` 403 | 404 | ### HKCUShould-Be 405 | ```powershell 406 | Get-WindowsRegistryValue -Path "HKCU:\Software\Policies\OneDrive" -Name EnableADAL | HKCUShould-Be 1 407 | ``` 408 | 409 | ### ShouldHave-One 410 | 411 | One of the aggravating things about PowerShell is ensuring there is exactly one item in a variable 412 | 413 | Typically you would do something like this: 414 | 415 | ```powershell 416 | $MatchingUsers = Get-ADUser -Filter * | ?{$_.SAMAccountName -like "Admin*" } 417 | $MatchingUserCount = $MatchingUsers | measure | select -Expand Count 418 | if($MatchingUserCount -eq 0) 419 | { 420 | throw "No matching users found" 421 | } 422 | else if($MatchingUserCount -gt 1) 423 | { 424 | throw "Multiple users found: $($MatchingUsers | Out-String)" 425 | } 426 | ``` 427 | 428 | Is reduced to 429 | ```powershell 430 | $MatchingUsers = Get-ADUser -Filter * | ?{$_.SAMAccountName -like "Admin*" } 431 | $MatchingUsers | ShouldHave-One 432 | ``` 433 | 434 | If you simply want to take the first element but warn if there are multiple, use the -TakeFirst switch 435 | 436 | ```powershell 437 | $MatchingUsers = Get-ADUser -Filter * | ?{$_.SAMAccountName -like "Admin*" } 438 | $MatchingUser = $MatchingUsers | ShouldHave-One -TakeFirst 439 | ``` 440 | 441 | ## Parameters 442 | 443 | Dynamic parameters allow you to define which parameters should be visible to the technician, while hiding others or setting their defaults. 444 | 445 | ### New-OAuthConsentParameter 446 | 447 | The New-OAuthConsentParameter allows you to leverage OAuth2 to interact with third-party services/APIs. 448 | 449 | Note: If you want to pass a client_secret you have to use the dynamic param block 450 | #### Usage 451 | 452 | ```powershell 453 | New-OAuthConsentParameter [-Name] [-ResponseType ] [-Scope ] [-AuthorizationEndpoint ] [-TokenEndpoint ] [-Resource ] [-ClientId ] [-ClientSecret ] [-ExtraQueryParameters ] [-AllowNull] [-DefaultValue ] [-HelpMessage ] [-Hidden] [-Mandatory] [-Position ] [-Type ] [-ValidatePattern ] [-ValidatePatternErrorMessage ] [-ValidValues ] [-ValueFromPipeline] [-ValueFromPipelineByPropertyName] [-ValueFromRemainingArguments] [-ValidateScript ] [-ParameterSetName ] [] 454 | ``` 455 | 456 | #### Examples 457 | 458 | ##### Dynamic Param Block 459 | ```powershell 460 | dynamicparam 461 | { 462 | New-ParameterCollection @( 463 | # The variable $RefreshToken now contains the OAuth response 464 | New-OAuthConsentParameter -Name RefreshToken -ResponseType code -AuthorizationEndpoint "" -TokenEndpoint "" -ClientID '' -ClientSecret '' -Scope "" -Mandatory 465 | ) 466 | } 467 | ``` 468 | 469 | ##### Param Block 470 | ```powershell 471 | param( 472 | [Parameter(Mandatory)] 473 | [OAuthConsent( 474 | authorizationEndpoint = "", 475 | tokenEndpoint = "", 476 | responseType = "", 477 | resource = "", 478 | scope = "", 479 | ClientId = "", 480 | extraQueryParameters = $null)] 481 | $OAuthInfo 482 | ) 483 | ``` 484 | -------------------------------------------------------------------------------- /terminology.md: -------------------------------------------------------------------------------- 1 | # Terminology 2 | 3 | ## Tenants 4 | 5 | These are your Customers. We recommend syncing Tenants from CW Automate or Azure. 6 | 7 | ## User Computer Affinity 8 | ImmyBot periodically runs whoami /upn on all computers and keeps a rolling list of the last 10 UPNs. It assigns the Primary User of the computer to the "Person" (Synced from Azure) with the matching UPN. 9 | 10 | For environments without AzureAD, ImmyBot will lookup the UPN of the Person from a Domain Controller in the computer's Tenant 11 | 12 | ## Deployment 13 | 14 | Deployments were originally called "Assignments" and are still called Assignments under the hood. 15 | 16 | Note: You won't see the word "Assignment" in the user interface anywhere, but we plan to re-rename "Deployment" back to "Assignment" it in a future release. 17 | 18 | A deployment is a rule that assigns [Software](#software) or [Tasks](#task) (Collectively known as "Maintenance Items") to a [Target](#target). 19 | 20 | ![](./.vitepress/images/2021-03-01-08-42-41.png) 21 | 22 | Deployments are conceptually similar to Group Policies in that they assign settings to a group of users or computers. 23 | 24 | DO NOT BE AFRAID TO SAVE YOUR DEPLOYMENTS. THEY DO NOT APPLY AUTOMATICALLY. 25 | 26 | If you DO want your Deployments to be applied automatically, you need to create a [Schedule](#schedules). 27 | 28 | ## Deployment Resolution 29 | 30 | Also known as 31 | 32 | * Creating Exceptions 33 | * "Winning" Deployments 34 | * Dealing with Snowflakes 35 | 36 | 37 | Like Group Policies have a "Winning Policy", ImmyBot must have a "Winning Deployment" for a given Maintenance Item on a computer. 38 | 39 | Let's say you have a customer "Contoso" that uses Adobe Acrobat instead of Adobe Reader, and you would like that to be installed instead. 40 | 41 | First, create a Deployment that sets the desired state of Adobe Reader to Uninstalled for Contoso 42 | 43 | ![](./.vitepress/images/2021-03-01-08-44-19.png) 44 | 45 | Then, create a Deployment that Installs Adobe Acrobat for their computers 46 | 47 | ![](./.vitepress/images/2021-03-01-08-51-38.png) 48 | 49 | ## [Target](#target) 50 | A "[Target](#target)" is a grouping of computers (or Tenants in the case of "Cloud Tasks") 51 | 52 | ImmyBot's ability to resolve [Targets](#target) to a group of computers is perhaps its most powerful feature. 53 | 54 | For example, you can select a Group of users from AzureAD (which includes on-prem synced groups, and Teams) and ImmyBot will automatically resolve that to the list of computers in use by the people in that group. 55 | 56 | If you enable PSA integration, a [Target](#target) could be all computers covered under a certain type of Agreement, or computers covered by an Agreement that includes a certain product. 57 | 58 | This is particularly useful for security software, help desk portals, or anything else in your stack that you may only want to be installed for customers that are paying you for it. 59 | 60 | ### Offboarding 61 | 62 | Conversely, you could create Deployments that remove your stack for customers you are offboarding. 63 | - Create an "Offboarding" product in your PSA 64 | - Create a deployment for each of the pieces of software you would like removed setting the desired state to Uninstalled 65 | - Target all customers with the "Offboarding" product on their agreement 66 | 67 | Note: ImmyBot even honors the date range on additions, making scheduled offboarding easier if say the customer wants your software removed on the last day of the month. 68 | 69 | ## [Maintenance Session](#maintenance-session) 70 | 71 | A [Maintenance Session](#maintenance-session) is conceptually similar to running gpupdate /force 72 | 73 | In other systems, different types of maintenance happen on their own schedule. Windows Updates may run on Tuesday night, but Third Party updates may run on Wednesday night, and auto-fix tasks may run whenever an alert is fired for a failed monitor, which has its own polling interval. 74 | 75 | By forcing all automation to happen in a sequential set of actions we call a [Maintenance Session](#maintenance-session), we can deliver predictability not only as to _what_ changes will be made, but also _when_. 76 | 77 | This also provides a cohesive mechanism for setting up a new computer. At best in traditional RMMs you can assign Monitors that detect the absence of required software and run Install scripts when they are missing, but this doesn't scale as pre-requisites and exclusions are required. 78 | 79 | Imagine if Group Policy could reliably deploy any type of software, and gpupdate /force worked reliably off-net, and when you ran it, it gave you real-time feedback about exactly what it was doing. Also imagine that it could optionally notify the end user before and after with a branded email telling them exactly what is being done, that optionally lets them cancel. 80 | 81 | That's a [Maintenance Session](#maintenance-session). 82 | 83 | You can view [Maintenance Sessions](#maintenance-session) for all computers under Computers->Sessions 84 | 85 | ![](./.vitepress/images/2021-02-23-08-47-36.png) 86 | 87 | Or, you can view [Maintenance Sessions](#maintenance-session) for a specific Computer under the Sessions tab for that Computer 88 | 89 | ![](./.vitepress/images/2021-02-23-08-46-09.png) 90 | 91 | ## [Maintenance Session](#maintenance-session) Stages 92 | 93 | ### Detection Stage 94 | 95 | During the Detection Stage, ImmyBot "Detects" which Maintenance Actions are necessary to bring the computer into compliance. These Actions are added to the [Maintenance Session](#maintenance-session). 96 | 97 | This is a read-only process, and typically done while the user is active. This is so ImmyBot can notify the user of changes that will occur later during the Execution Stage. By doing this during the day, and scheduling Execution for later, we are giving the end user the best possible chance to be aware of the upcoming maintenance, Postponing if you allow. The Postpone feature is very popular among engineers that do may need to leave renderings and analysis tasks running overnight. 98 | 99 | ### Execution Stage 100 | 101 | ![](./.vitepress/images/2021-02-23-09-44-51.png) 102 | 103 | ## [Maintenance Action](#maintenance-action) 104 | 105 | ```mermaid 106 | flowchart TD 107 | SoftwareInstall --> Detect{Software Installed?} 108 | Detect --> |No| Install 109 | Detect --> |Yes| HasConfigurationTask{Has Configuration Task?} 110 | Install --> PostInstallDetect{Software Installed?} 111 | PostInstallDetect --> |Yes|HasConfigurationTask 112 | HasConfigurationTask --> |Yes| MaintenanceTaskTest{Run Test Script} 113 | MaintenanceTaskTest --> |return $true| Compliant 114 | MaintenanceTaskTest --> |return $false| RunSetScript(Run Set Script) 115 | RunSetScript --> PostMaintenanceTaskTest{Run Test Script} 116 | PostMaintenanceTaskTest --> |return $true| Compliant 117 | PostMaintenanceTaskTest --> |return $false| Non-Compliant 118 | PostInstallDetect --> |No| Non-Compliant 119 | ``` 120 | 121 | A *[Maintenance Session](#maintenance-session)* has one or more *[Maintenance Actions](#maintenance-action)*. A [Maintenance Action](#maintenance-action) could be to install software, apply a Windows Update, or run a [Task](#task). 122 | 123 | The image below depicts a typical [Maintenance Session](#maintenance-session) with many [Maintenance Actions](#maintenance-action) 124 | 125 | ![](./.vitepress/images/2021-02-23-06-14-05.png) 126 | 127 | ## Software 128 | Software, in the context of ImmyBot refers to Software objects in My Software or Global Software. 129 | 130 | My Software - Initially empty. When you upload your own software to ImmyBot, it goes into My Software 131 | 132 | Global Software - Read-Only, managed by the ImmyBot team. 133 | 134 | At the bare minimum, Software requires a [Detection Method](#detection-method). 135 | Software can have many [Software Versions](#software-version). 136 | 137 | ```mermaid 138 | graph TD 139 | C[Software] --> D[Custom Detection Script] 140 | C -->E[Default Uninstall Script] 141 | C --> F[Auto-Update Script] 142 | ``` 143 | 144 | 145 | ### Pre-Requisities 146 | This is a VERY powerful, and critically underrated feature in ImmyBot. ImmyBot resolves dependencies recursively, with built-in circular reference detection. 147 | 148 | Common uses for Pre-Requisites include 149 | * Ensuring a piece of software is installed before installing another 150 | * C++ Redistributables before 3CX Client 151 | * Office is installed before an Outlook Add-in 152 | * Ensuring a piece of software is _uninstalled_ before install another 153 | * Removing Adobe Acrobat Reader before installing Adobe Acrobat Professional 154 | 155 | ### Install required dependencies 156 | 157 | ![](./.vitepress/images/2021-02-23-09-18-04.png) 158 | 159 | ### Ordering [Maintenance Actions](#maintenance-action) 160 | ![](./.vitepress/images/2021-02-23-09-15-27.png) 161 | 162 | ## Detection Method 163 | A Detection Method is required in order to know whether or not a piece of Software is installed on a machine. 164 | 165 | For Software, the detection method must returns the version of the software installed on the machine, if any. 166 | 167 | For [Tasks](#task), the Detection Method is the "test" mechanism, which must return true or false to indicate whether or not the machine is in compliance. 168 | 169 | ## Software Version 170 | ```mermaid 171 | graph TD 172 | C[Software Version] --> Install 173 | C --> Uninstall 174 | C --> Upgrade 175 | C --> Repair 176 | C --> Test 177 | ``` 178 | 179 | ## Task 180 | A Task (aka Mainenance Task) is a catch-all for anything that isn't software. 181 | 182 | ```mermaid 183 | graph TD 184 | C[Task] 185 | C --> Get 186 | C --> Set 187 | C --> Test 188 | ``` 189 | 190 | or 191 | 192 | ```mermaid 193 | graph TD 194 | C[Task] 195 | C --> S[Combined Script with $method parameter containing 'get','set', or 'test'] 196 | ``` 197 | 198 | ## Task Modes 199 | 200 | ### Enforce 201 | Runs the "test" script, if the test returns false, runs "set", then runs "test" again to verify. 202 | 203 | ### Audit 204 | Runs the "test" script which should return true or false. It can output whatever it wants, but the last output should be boolean. 205 | 206 | ### Monitor 207 | Runs the "get" script, which can return anything. Useful for collecting data like Bitlocker Keys, Quickbooks Licenses, or any other piece of information you are interested in. 208 | 209 | ## Scripts 210 | From the above diagrams, you can see that scripts are the building blocks for higher level objects like Software and Tasks. 211 | 212 | ## Execution Context 213 | ### System 214 | Run as a service on the machine 215 | 216 | ### User 217 | Will attempt to run as the logged on user 218 | 219 | ### Metascript 220 | Runs in the ImmyBot backend, and can spawn code on the system by using Invoke-ImmyCommand 221 | 222 | ### Cloud Script 223 | Runs in the ImmyBot backend, but intended to be run against a Tenant (perhaps for the purpose of getting or setting some setting in 365/Azure or some other system with an API). These are used exclusively in [Tasks](#task) targetting "Tenants". 224 | 225 | ![](./.vitepress/images/2021-03-01-14-17-29.png) 226 | 227 | ## Schedules 228 | Used to run maintenance periodically on machines. Can optionally be limited to a single Maintenance Item. 229 | 230 | NOTE You must also have a Deployment for the Maintenance Item to set the desired state. Imagine a scenario where you need to ensure a single piece of software is up-to-date on all computers except for a CNC machine. Create 2 deployments, the first setting the desired state to Installed->Latest for all computers, then a second stating that the desired state is Ignored for the CNC machine. When you create the schedule, the software will be ignored for the CNC machine. 231 | 232 | ## Integrations 233 | 234 | To ImmyBot, an RMM is a system that provides a list of computers, and a mechanism to run PowerShell scripts on them. 235 | 236 | ![](./.vitepress/images/2021-02-23-06-18-23.png) 237 | 238 | To avoid having to deploy the ImmyAgent to existing machines, ImmyBot optionally integrates with RMMs like ConnectWise Automate and ConnectWise Control and uses their agents instead. These systems are not as performant as the ImmyAgent, but can suppliment ImmyBot functionality. 239 | 240 | For example, if you add an RMM Link for ConnectWise Control, you can open a remote session to the computer directly within ImmyBot: 241 | 242 | ![](./.vitepress/images/2021-02-23-06-34-22.png) 243 | 244 | If you add an RMM integration for ConnectWise Automate, Scheduled [Maintenance Sessions](#maintenance-session) will apply all Approved Windows Updates using the ConnectWise Automate API based on your Approval Policies in Automate Patch Manager. 245 | 246 | You can even add multiple RMMs of the same type, which is often useful in merger and acquisition scenarios. You may choose to use ImmyBot as your single pane of glass to manage both, or simply let ImmyBot be a neutral third party for facilitating the consolidation of RMM agents to the parent company's RMM. 247 | 248 | ## Identification 249 | 250 | Because the same computer often exists in multiple RMMs (Like how CW Automate typically installs CW Control Automatically), ImmyBot prevents duplicates by identifying the computer by a unique id. We DO NOT use MAC Address! This unique id persists even if you wipe and reload the machine. 251 | 252 | When a new machine is detected, it first goes to New Computers->Actively Identifying 253 | ![](./.vitepress/images/2021-02-23-06-44-25.png) 254 | 255 | It uses the following script to collect the UUID from the machine: 256 | ``` 257 | gwmi Win32_ComputerSystemProduct | select -expand UUID 258 | ``` 259 | 260 | This value is static even if you wipe and reload the machine, although we have **VERY** rarely seen this value change following a BIOS upgrade or due to a mainboard fault. We chose this value instead of Mac Address or Hard Drive serial number because of issues other systems have with USB Ethernet cables and hard drive replacement. We did not use serialnumber because we learned that many computers do not have serial numbers. 261 | 262 | In practice, this value works almost _too_ well. Machines you just wiped and expect to find in New Computers, are often associated to their pre-wiped computer objects. To find them, you often have to search for the serial number of the computer in the Computer List. In 0.40.1 we began using the Windows OfflineInstallationID value to identify when an existing computer has been wiped so we can set its status to "Needs Onboarding" which causes it to show up under New Computers as expected. 263 | 264 | If it is a machine ImmyBot has seen before, it will be associated to the existing Computer, and you will find a new entry under the Computer's Agents tab. Under the hood we call these entries "RmmComputers". 265 | 266 | Computers can have one or more RmmComputers(Agents). You can think of these as logical "pathways" to the computer. We only need one to be online to function. 267 | 268 | ![](./.vitepress/images/2021-02-23-06-45-47.png) 269 | 270 | ## Target Visibility 271 | 272 | The Target Visibility feature helps control where and how software deployments, task deployments, and other actions can be accessed in ImmyBot. There is currently one option: 273 | 274 | [Technician Tools](#technician-tools): When enabled, this makes the deployment visible and accessible through the technician tools interface. This is useful for actions that can assist IT staff when working on support tickets. 275 | 276 | This option is located at the bottom of the deployment details page. 277 | 278 | ![alt text](image-3.png) 279 | 280 | ## Technician Tools 281 | 282 | Technician Tools is a specialized interface designed for IT technicians working within PSA (Professional Services Automation) tickets. 283 | 284 | Think of it as a streamlined "command center" that gives technicians quick access to the tools and information they need while working on a support ticket, without having to switch between different systems or search for the relevant computers and software details. 285 | 286 | ### What it looks like 287 | 288 | When a technician opens a ticket from their PSA system (like HaloPSA), this page shows relevant deployments from ImmyBot that resolved to that ticket. 289 | 290 | ![alt text](image-7.png) 291 | 292 | ![alt text](image-6.png) 293 | 294 | ### Deciding which deployments show up 295 | 296 | Deployment [target visibility](#target-visibility) determines if it is enabled for a particular page. Technician Tools is one of the available visibility options. When this option is selected and the deployment resolves to a person, tenant, or computer associated with the opened PSA ticket, it will show up in the list. 297 | 298 | ### Supported Integrations 299 | 300 | - [HaloPSA](/halo-integration-setup.md#technician-tools) 301 | - [CW Manage](/connectwise-manage-integration-setup) -------------------------------------------------------------------------------- /troubleshooting.md: -------------------------------------------------------------------------------- 1 | 2 | > [!WARNING] *ImmyBot's EV code-signing certificate is changing on Feb. 11th, 2025* 3 | > Please see the [FAQ section for more details](https://docs.immy.bot/FAQ.html#what-should-i-do-about-immybot-s-upcoming-code-signing-certificate-change) on updating security exclusions. 4 | 5 | ::: danger *ImmyBot no longer supports Windows 7, Server 2008 (or Server 2012 w/o [ESUs](https://learn.microsoft.com/en-us/windows-server/get-started/extended-security-updates-overview)) machines.* 6 | Please see the [FAQ section for more details](https://docs.immy.bot/FAQ.html#what-windows-versions-does-immyagent-support) 7 | ::: 8 | 9 | # Troubleshooting 10 | 11 | ## Identification Failures 12 | 13 | ### Needs a Manual Decision 14 | 15 | Generally you will click "Agent Re-installed" 16 | 17 | Often when an RMM Agent gets re-installed, it will get a new id in the RMM (ComputerId in Automate, SessionID in Control). ImmyBot will recognize that it is the same computer, but due to the fact that virtualization technologies and hard drive cloning can lead to the same scenario, we require you to tell us whether we should overwrite the existing RmmComputer, or keep both. 99% of the time you will click "Overwrite Existing". If the machine was in fact cloned, you would click Keep Both, in which case Immy shims the duplicate UUID with its own to prevent collisions. 18 | 19 | ## Pending Computers 20 | 21 | Computers in the pending status have yet to be identified. 22 | 23 | Computers may get stuck here if we are unable to run our Ephemeral Agent 24 | 25 | ```mermaid 26 | graph TD 27 | CheckImmyAgentLogs[Check ImmyAgent Logs in C:\ProgramData\ImmyBot\Logs] --> DidEphemeralAgentStart[Immybot.Agent.Ephemeral.exe start?] 28 | DidEphemeralAgentStart --> |Yes|CheckEphemeralAgentLogs[Check Ephemeral Agent logs in C:\ProgramData\ImmyBot\Scripts\*\*.log] 29 | DidEphemeralAgentStart --> |No|BlockedBySecuritySoftware[Exclude Script Path from Security Software] 30 | CheckEphemeralAgentLogs --> EphemeralAgentConnect[Did Ephemeral Agent Websocket Connect?] 31 | EphemeralAgentConnect -->|Yes|DidSuccessfullyIdentifyAfterFix 32 | EphemeralAgentConnect --> |No|TryNoSSLInspect[Put on network without SSL Inspection] 33 | TryNoSSLInspect --> DidSuccessfullyIdentifyAfterFix[Ephemeral Agent Connect After Fix?] 34 | DidSuccessfullyIdentifyAfterFix[Machine Identify Successfully?] --> |No|EmailSupport 35 | DidSuccessfullyIdentifyAfterFix[Machine Identify Successfully?] --> |Yes|Done 36 | EmailSupport["Email logs from C:\ProgramData\ImmyBot\Logs and C:\ProgramData\ImmyBot\Scripts\*\*.logs to support@immy.bot"] 37 | ``` 38 | 39 | Top 3 reasons for Identification Failures 40 | 41 | 1. SSL Inspection blocking our websocket 42 | 1. Security Software blocking PowerShell 43 | 1. Incorrect time is preventing SSL/TLS connection 44 | 45 | To understand the various reasons identification can fail, it helps to understand how ImmyBot executions PowerShell 46 | 47 | 1. RMM or ImmyAgent runs Immybot.Agent.Ephemeral.exe 48 | 1. Immybot.Agent.Ephemeral.exe establishes a secure websocket to wss://subdomain.immy.bot and runs Invoke-PSPipeHost.ps1 49 | 1. Immybot.Agent.Ephemeral.exe feeds Invoke-PSPipeHost.ps1 PowerShell over a pipe from the websocket session 50 | 51 | ```mermaid 52 | graph LR 53 | ImmyBot --> |Parallel|Automate[Run script to download and run Ephemeral Agent via Automate] 54 | ImmyBot --> |Parallel|Control[Run script to download and run Ephemeral Agent via Control] 55 | ImmyBot --> |Parallel|ImmyAgent[Run script to download and run Ephemeral Agent via ImmyAgent] 56 | ImmyBot --> |Parallel|N-Central[Run script to download and run Ephemeral Agent via N-Central] 57 | Automate --> Immybot.Agent.Ephemeral.exe 58 | Control --> Immybot.Agent.Ephemeral.exe 59 | ImmyAgent --> Immybot.Agent.Ephemeral.exe 60 | N-Central --> Immybot.Agent.Ephemeral.exe 61 | Immybot.Agent.Ephemeral.exe --> cmd.exe --> powershell.exe --> Invoke-PSPipeHost.ps1 62 | ``` 63 | 64 | The most common cause of identification failure is security software. 65 | 66 | To know if this is the case, pull the logs from C:\ProgramData\ImmyBot\Logs and C:\ProgramData\ImmyBot\Scripts\*\*.logs 67 | 68 | Normal Immybot Agent logs look like this: 69 | 70 | ``` 71 | 2022-06-14 00:02:25.560 -05:00 [DBG] Hosting starting 72 | 2022-06-14 00:02:25.799 -05:00 [INF] Starting Immybot Agent 73 | 2022-06-14 00:02:25.943 -05:00 [INF] Using configuration file stored at: C:\ProgramData\ImmyBotAgentService\config.json 74 | 2022-06-14 00:02:26.875 -05:00 [DBG] Initializing IoT Hub connection 75 | 2022-06-14 00:02:35.023 -05:00 [INF] Application started. Hosting environment: Production; Content root path: C:\WINDOWS\TEMP\.net\Immybot.Agent.Service\lreaszzz.wwx\ 76 | 2022-06-14 00:02:35.024 -05:00 [DBG] Hosting started 77 | 2022-06-14 00:02:40.552 -05:00 [WRN] IoT Hub connection status Changed Status => [Connected] Reason => [Connection_Ok] 78 | 2022-06-14 02:06:32.159 -05:00 [DBG] Process started; ID: 12724 79 | 2022-06-14 02:06:37.358 -05:00 [DBG] Running C:\ProgramData\ImmyBot\Scripts\840290f2bd2142e2bd2c612542436763\Immybot.Agent.Ephemeral.exe --ImmyScriptPath C:\ProgramData\ImmyBot\Scripts\840290f2bd2142e2bd2c612542436763 --BackendAddress wss://immense.immy.bot/ --SessionID c946e1d1-f5fd-d36d-0489-d2a9ad9084e0 80 | 2022-06-14 02:06:38.335 -05:00 [DBG] PID 16184 <----- Indicates successful execution 81 | 2022-06-14 02:06:38.372 -05:00 [DBG] Process exited; Code: 0 82 | ``` 83 | 84 | Windows Defender will make the logs look like this: 85 | 86 | ``` 87 | 2022-11-17 13:13:36.604 +11:00 [DBG] Hosting starting 88 | 2022-11-17 13:13:36.817 +11:00 [INF] Starting Immybot Agent 89 | 2022-11-17 13:13:36.840 +11:00 [INF] Using configuration file stored at: C:\ProgramData\ImmyBotAgentService\config.json 90 | 2022-11-17 13:13:37.590 +11:00 [DBG] Initializing IoT Hub connection 91 | 2022-11-17 13:13:37.860 +11:00 [DBG] Hosting started 92 | 2022-11-17 13:13:38.598 +11:00 [WRN] IoT Hub connection status Changed Status => [Connected] Reason => [Connection_Ok] 93 | 2022-11-17 13:13:39.157 +11:00 [WRN] Dirty-Shutdown detected! Dirty-File created at: "2022-11-07T04:11:59.3975026Z" UTC 94 | 2022-11-17 13:13:41.686 +11:00 [DBG] Process started; ID: 5660 95 | 2022-11-17 13:13:44.674 +11:00 [DBG] Running C:\ProgramData\ImmyBot\Scripts\4303da9b790b41c6978b50b872fe17cb\Immybot.Agent.Ephemeral.exe --ImmyScriptPath C:\ProgramData\ImmyBot\Scripts\4303da9b790b41c6978b50b872fe17cb --BackendAddress wss://ericom.immy.bot/ --SessionID a92c0ed1-ea3b-7f8a-d9c6-946d9b44ccc5 96 | 2022-11-17 13:13:49.577 +11:00 [DBG] WMI Error 2 97 | ``` 98 | 99 | DNS Filtering/Issues make the logs look like this 100 | 101 | ``` 102 | 2022-09-20 20:39:59.712 +10:00 [INF] RESPONSE: { 103 | "Resource": "installer/challenge/request", 104 | "Method": "POST", 105 | "StatusCode": 0, 106 | "ErrorException": { 107 | "ClassName": "System.Net.WebException", 108 | "Message": "No such host is known. (XXXX.immy.bot:443)" 109 | ``` 110 | 111 | To correct it, you need to exclude DNS filtering for your instances hostnames, which are found under 112 | Show more > integrations > Fetch IP Address and Hostnames 113 | 114 | If Powershell is failing to start on the endpoint within 60 seconds a timeout will occur. 115 | 116 | Here is a suggestion on a cause and possible fix for that one 117 | 118 | ## Security Software Exclusions 119 | 120 | Ideally you would instruct your security software would support excluding code signed by 121 | 122 | ::: warning 123 | ImmyBot's current code-signing certificate is set to change on Feb. 11th, 2025. 124 | Please add both our upcoming and existing certificate exlusions to ensure no issues. 125 | 126 | Please see the [FAQ section for more details](https://docs.immy.bot/FAQ.html#what-should-i-do-about-immybot-s-upcoming-code-signing-certificate-change) 127 | ::: 128 | This certificate is used to sign our Agent binaries & installers delivered to machines. 129 | 130 | Unfortunately, our new certificate's `Organization(O)` and `Common Name(CN)` fields are changing from `Immense Networks` to `ImmyBot LLC`. 131 | 132 | New Certificate on Feb. 11th, 2025: 133 | ``` 134 | CN=ImmyBot LLC, O=ImmyBot LLC, L=Baton Rouge, S=Louisiana, C=US 135 | ``` 136 | 137 | Existing Certificate: 138 | ``` 139 | CN=Immense Networks, O=Immense Networks, L=Baton Rouge, S=Louisiana, C=US 140 | ``` 141 | 142 | Add ***both*** certificates to avoid issues if following before Feb. 11th, 2025 ***OR*** your instance has existing machines installed (which may have agents installed with older certificate)! 143 | 144 | Exclusions based on code signing certificate are an industry standard feature and should be a standard feature in any best-in-class security software. However, if your security software is unable to exclude based on code signing certificate, create an exclusion for your instance's Script Path. 145 | 146 | Your script path can be found under Settings->Preferences->Script Path 147 | 148 | ![image](https://user-images.githubusercontent.com/1424395/173610304-50bab775-c7c8-40b3-944e-fab1dde862ee.png) 149 | 150 | 151 | - [Troubleshooting](#troubleshooting) 152 | - [Identification Failures](#identification-failures) 153 | - [Needs a Manual Decision](#needs-a-manual-decision) 154 | - [Pending Computers](#pending-computers) 155 | - [Security Software Exclusions](#security-software-exclusions) 156 | - [ThreatLocker](#threatlocker) 157 | - [Sophos Central](#sophos-central) 158 | - [BitDefender](#bitdefender) 159 | - [CrowdStrike](#crowdstrike) 160 | - [Microsoft Defender for Endpoint](#microsoft-defender-for-endpoint) 161 | - [Cylance](#cylance) 162 | - [SentinelOne](#sentinelone) 163 | - [DNSFilter](#dnsfilter) 164 | - [Group Policy Objects](#group-policy-objects) 165 | - [Working With Support](#working-with-support) 166 | - [Gather an Endpoint Trace Log](#gather-an-endpoint-trace-log) 167 | - [MDMDiagnostics Logs](#mdmdiagnostics-logs) 168 | 169 | ### ThreatLocker 170 | 171 | 1. Application Control-> Applications 172 | 2. Create New Application 173 | 3. Put the following value into Certificate and click Add 174 | 175 | ::: warning 176 | ImmyBot's current code-signing certificate is set to change on Feb. 11th, 2025. 177 | Please add both our upcoming and existing certificate exlusions to ensure no issues. 178 | 179 | Please see the [FAQ section for more details](https://docs.immy.bot/FAQ.html#what-should-i-do-about-immybot-s-upcoming-code-signing-certificate-change) 180 | ::: 181 | This certificate is used to sign our Agent binaries & installers delivered to machines. 182 | 183 | Unfortunately, our new certificate's `Organization(O)` and `Common Name(CN)` fields are changing from `Immense Networks` to `ImmyBot LLC`. 184 | 185 | New Certificate on Feb. 11th, 2025: 186 | ``` 187 | CN=ImmyBot LLC, O=ImmyBot LLC, L=Baton Rouge, S=Louisiana, C=US 188 | ``` 189 | 190 | Existing Certificate: 191 | ``` 192 | CN=Immense Networks, O=Immense Networks, L=Baton Rouge, S=Louisiana, C=US 193 | ``` 194 | 195 | Add ***both*** certificates to avoid issues if following before Feb. 11th, 2025 ***OR*** your instance has existing machines installed (which may have agents installed with older certificate)! 196 | 197 | 1. Add your instance’s [script path](#script-path-exclusion) 198 | ![image](https://user-images.githubusercontent.com/1424395/173602708-b8e239f8-efaa-4e16-a29c-9fb66f72e616.png) 199 | Ultimately it should look like this: 200 | ![image](https://user-images.githubusercontent.com/1424395/173602739-2b60922f-5ac8-4d4c-bc93-d52a390e129e.png) 201 | 1. Create a New Application Policy 202 | ![image](https://user-images.githubusercontent.com/1424395/173602798-7042c0ea-1406-476c-a291-0deee6e843c5.png) 203 | 204 | ### Sophos Central 205 | 206 | **Tenant Specific** 207 | Manual Addition: 208 | 209 | 1. Launch Client Shell 210 | 2. Navigate to Global Settings - Allowed Applications 211 | 3. Select "Add apps" 212 | 4. In the "allow by:" dropdown, select certificate and add the following 213 | 214 | ``` 215 | CN=Immense Networks LLC, O=Immense Networks, L=Baton Rouge, S=Louisiana, C=US 216 | ``` 217 | 218 | Event Log Method: 219 | If Sophos reports that Immy Bot has been blocked, you have the option of going to the Event Log and and select the option to allow by Certificate. This will only work if Sophos has picked up an alert for a process signed by the Immy Bot code signing certificate 220 | 221 | **Partner Global Templates** 222 | 223 | 1. Navigate to Settings & Policies - Global Templates and select the template you would like to modify 224 | 2. Once in the template, navigate to Global Settings - Allowed Applications 225 | 3. Follow steps 3 and 4 listed in the **Tenant Specific** section above 226 | 227 | ### BitDefender 228 | 229 | BitDefender will intermittently block script execution unless you disable Aggressive scanning mode or add a your instance's [Script Path](#security-software-exclusions) to your policy's exclusion list. 230 | 231 | 1. Edit the policy->Antimalware->Settings->In-policy Exclusions 232 | 2. Add a folder exclusion for your [Script Path](#security-software-exclusions) 233 | 234 | ### CrowdStrike 235 | 236 | CrowdStrike uses AI to decide what to allow and disallow. Periodically this AI will mark the ImmyBot Agent or ImmyBot Ephemeral Agent as malicious. This usually happens after we update it. Marking it as a false positive in your CrowdStrike portal will train the global AI to not treat it as malicious. 237 | 238 | ### Microsoft Defender for Endpoint 239 | 240 | Add a your instance's [Script Path](#security-software-exclusions) to your policy's exclusion list. 241 | 242 | 243 | ### Cylance 244 | 245 | Cylance blocks our websocket making the ImmybotAgent log look like this: 246 | 247 | ``` 248 | 2022-09-21 12:24:26.562 -04:00 [INF] Process exiting. 249 | 2022-09-21 12:24:40.106 -04:00 [DBG] Closing Websocket... 250 | 2022-09-21 12:24:49.743 -04:00 [INF] Marked ConnectionState as disconnected. 251 | 2022-09-21 12:24:50.171 -04:00 [ERR] Application shutting down (App lifetime token cancelled) 252 | System.IO.IOException: Cannot access a closed stream. 253 | at System.Net.Http.HttpConnection.RawConnectionStream.WriteAsync(ReadOnlyMemory`1 buffer, CancellationToken cancellationToken) 254 | ``` 255 | 256 | To correct it, you need to bypass SSL Inspection for your instances hostnames/IPs, which are found under 257 | Show more > integrations > Fetch IP Address and Hostnames 258 | 259 | ### SentinelOne 260 | 261 | Sentinel requires BOTH your instance's Script path and the ImmyBot Agent process excluded. With only the script path excluded, devices will regularly have issues running the ImmyBot Agent to download the ephemeral agent. This is apparent in two cases: 262 | 1. Importing devices - The new agent can't download the ephemeral agent to start running inventory. 263 | 2. Updating ImmyBot Agents - The new agent can't download the corresponding new ephemeral agent when attempting to run deployments or scripts. 264 | 265 | You can also set your Exclusion Mode to "Interoperability - Extended". 266 | 267 | ### DNSFilter 268 | 269 | There have been reports indicating that DNSFilter, along with potentially other DNS filtering tools, is not directly blocking subdomain.immy.bot but has failed to resolve some DNS queries. 270 | 271 | Specifically, in the case of DNSFilter, it was confirmed that ImmyBot was not being blocked. However, the failure in DNS resolution meant that connection attempts to the backend were unsuccessful. 272 | 273 | Explicitly allowing the DNS for subdomain.immy.bot (replacing "subdomain" with your specific ImmyBot instance subdomain) was verified to resolve the issue of failed DNS resolutions. 274 | 275 | For guidance on managing allow and block lists, please refer to: https://help.dnsfilter.com/hc/en-us/articles/1500008111381-Allow-and-Block-Lists 276 | 277 | ### Group Policy Objects 278 | 279 | Computer Configuration | Policies | Administrative Templates | Windows Components | Windows PowerShell | Turn on Script Execution (Enabled) 280 | 281 | User Configuration | Policies | Administrative Templates | Windows Components | Windows PowerShell | Turn on Script Execution (Enabled) 282 | 283 | These GPOs have been known to cause issues with running scripts. 284 | 285 | 286 | 287 | ## Working With Support 288 | 289 | Support Email: 290 | 291 | `support@immy.bot` 292 | 293 | 294 | Sometimes things go wrong and you just need to send in a support ticket. Here is some of the information they may need to help you out. 295 | 296 | 297 | ### Gather an Endpoint Trace Log 298 | 299 | 300 | Windows Performance Recorder can generate a detailed log of an endpoint's activity, which can be used to see most environmental causes for issues running the Immybot Agent. 301 | 302 | 303 | > [!NOTE] 304 | > These can be resource intensive and can require 2-4 GB available RAM, depending on how active an endpoint is and how long a trace is running for. 305 | 306 | 1. From an elevated CMD prompt, run: 307 | ```bat 308 | wpr.exe -start CPU -start Minifilter -start FileIO -start Registry 309 | ``` 310 | 2. Recreate the issue. 311 | 3. Wait 3-5 minutes, depending on the available RAM, and run: 312 | ```bat 313 | wpr.exe -stop "C:\PerfLogs\examplefilename.etl" -compress 314 | ``` 315 | 316 | 317 | If the `wpr -stop` command fails, try running without "-compress" 318 | 319 | This ETL can be reviewed in Windows Performance Analyzer from the Windows Performance Toolkit SDK. 320 | 321 | ### MDMDiagnostics Logs 322 | 323 | 324 | Issues with device enrollment occur often, and the possible reasons behind them are numerous. Logs from the MDMDiagnostics tool can help identify the root cause. 325 | 326 | 1. From an elevated CMD Prompt, run: 327 | 328 | 329 | ```bat 330 | MDMdiagnosticstool.exe -area "DeviceProvisioning;DeviceEnrollment" -cab "C:\Temp\MDMDiag_Log.cab" 331 | ``` 332 | 333 | 2. The cab file may be too large to email, so you can create a cloud share and send the link to `support@immy.bot`. 334 | 335 | -------------------------------------------------------------------------------- /user-roles.md: -------------------------------------------------------------------------------- 1 | # User Roles 2 | 3 | ## MSP Admin 4 | 5 | * Full Access, no restrictions 6 | 7 | ## MSP Non-Admin 8 | 9 | * Cannot create/edit/delete Schedules 10 | * Cannot create/edit/delete Users 11 | * Cannot create/edit/delete Cross Tenant Deployments 12 | * _Can_ create/edit/delete Single-Tenant and Individual Deployments 13 | * NOTE: You can disable this in Settings->Preferences with the "Allow Non-Admin Users to Manage Deployments" setting 14 | * _Can_ access terminal on all machines and edit scripts 15 | * NOTE: You can disable this in Settings->Preferences with the "Allow Non-Admins and Non-MSP Users to Use Terminal and Edit Scripts" 16 | * Disabling this prevents these users from being able to run arbitrary code on devices 17 | 18 | ## Customer (Tenant) Admin 19 | 20 | * Can view/edit Computers, Licenses and Deployments for their Tenant 21 | * Can create users in their tenant 22 | * Software they upload is owned by their tenant and are not visible to other tenants 23 | * Licenses they create are owned by their tenant and are not visible to other tenants 24 | * Cannot View/Create/Edit Schedules 25 | 26 | ## Customer (Tenant) Non-Admin 27 | 28 | * Cannot View/Create/Edit Schedules 29 | * Cannot create Cross Tenant Deployments 30 | * Cannot create Users 31 | * Can create Deployments scoped to individual Computers and People 32 | 33 | -------------------------------------------------------------------------------- /windows-sandbox.md: -------------------------------------------------------------------------------- 1 | # Testing with Windows Sandbox 2 | 3 | Windows Sandbox is a fast loading disposable container in Windows that loses all settings when shutdown or restarted. It is very convenient for testing software deployments. It should be noted that not all software is compatible with Windows Sandbox, particular software that installs drivers or requires restarts. 4 | 5 | If you haven't used Windows Sandbox before, you can enable it by opening Windows PowerShell as Admin and running the following command: 6 | 7 | ```powershell 8 | Enable-WindowsOptionalFeature -FeatureName "Containers-DisposableClientVM" -All -Online -NoRestart 9 | ``` 10 | 11 | ## Download Windows Sandbox file (.wsb) 12 | 13 | ![](./.vitepress/images/2021-03-15-08-29-07.png) 14 | 15 | ![](./.vitepress/images/2021-03-15-08-29-35.png) 16 | 17 | Wait for ImmyBot Agent to install 18 | ![](./.vitepress/images/2021-03-15-08-29-41.png) 19 | 20 | 21 | [Onboard](#onboarding) the Sandbox 22 | ![](./.vitepress/images/2021-03-15-08-30-29.png) 23 | 24 | ![](./.vitepress/images/2021-03-15-08-47-28.png) 25 | 26 | ![](./.vitepress/images/2021-03-15-08-37-50.png) 27 | 28 | This will create an "Onboarding" Session (sessions are like running gpupdate) that will apply all applicable Deployments (deployments are like Group Policies) 29 | --------------------------------------------------------------------------------