diff --git a/.devcontainer.json b/.devcontainer.json deleted file mode 100644 index 14d70b4..0000000 --- a/.devcontainer.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "windows", - "service": "windows", - "forwardPorts": [8006], - "dockerComposeFile": "compose.yml" -} diff --git a/.devcontainer/010 - Windows 11 Enterprise/devcontainer.json b/.devcontainer/010 - Windows 11 Enterprise/devcontainer.json new file mode 100644 index 0000000..cc0e5ae --- /dev/null +++ b/.devcontainer/010 - Windows 11 Enterprise/devcontainer.json @@ -0,0 +1,20 @@ +{ + "name": "Windows 11 Enterprise", + "service": "windows", + "containerEnv": { + "VERSION": "11e" + }, + "forwardPorts": [8006], + "portsAttributes": { + "8006": { + "label": "Web", + "onAutoForward": "notify" + } + }, + "otherPortsAttributes": { + "onAutoForward": "ignore" + }, + "dockerComposeFile": "../codespaces.yml", + "workspaceFolder": "/workspaces/windows", + "initializeCommand": "docker system prune --all --force" +} diff --git a/.devcontainer/020 - Windows 11 LTSC/devcontainer.json b/.devcontainer/020 - Windows 11 LTSC/devcontainer.json new file mode 100644 index 0000000..23e54ff --- /dev/null +++ b/.devcontainer/020 - Windows 11 LTSC/devcontainer.json @@ -0,0 +1,20 @@ +{ + "name": "Windows 11 LTSC", + "service": "windows", + "containerEnv": { + "VERSION": "11l" + }, + "forwardPorts": [8006], + "portsAttributes": { + "8006": { + "label": "Web", + "onAutoForward": "notify" + } + }, + "otherPortsAttributes": { + "onAutoForward": "ignore" + }, + "dockerComposeFile": "../codespaces.yml", + "workspaceFolder": "/workspaces/windows", + "initializeCommand": "docker system prune --all --force" +} diff --git a/.devcontainer/030 - Windows 10 Pro/devcontainer.json b/.devcontainer/030 - Windows 10 Pro/devcontainer.json new file mode 100644 index 0000000..c5a647b --- /dev/null +++ b/.devcontainer/030 - Windows 10 Pro/devcontainer.json @@ -0,0 +1,20 @@ +{ + "name": "Windows 10 Pro", + "service": "windows", + "containerEnv": { + "VERSION": "10" + }, + "forwardPorts": [8006], + "portsAttributes": { + "8006": { + "label": "Web", + "onAutoForward": "notify" + } + }, + "otherPortsAttributes": { + "onAutoForward": "ignore" + }, + "dockerComposeFile": "../codespaces.yml", + "workspaceFolder": "/workspaces/windows", + "initializeCommand": "docker system prune --all --force" +} diff --git a/.devcontainer/040 - Windows 10 Enterprise/devcontainer.json b/.devcontainer/040 - Windows 10 Enterprise/devcontainer.json new file mode 100644 index 0000000..1466e11 --- /dev/null +++ b/.devcontainer/040 - Windows 10 Enterprise/devcontainer.json @@ -0,0 +1,20 @@ +{ + "name": "Windows 10 Enterprise", + "service": "windows", + "containerEnv": { + "VERSION": "10e" + }, + "forwardPorts": [8006], + "portsAttributes": { + "8006": { + "label": "Web", + "onAutoForward": "notify" + } + }, + "otherPortsAttributes": { + "onAutoForward": "ignore" + }, + "dockerComposeFile": "../codespaces.yml", + "workspaceFolder": "/workspaces/windows", + "initializeCommand": "docker system prune --all --force" +} diff --git a/.devcontainer/050 - Windows 10 LTSC/devcontainer.json b/.devcontainer/050 - Windows 10 LTSC/devcontainer.json new file mode 100644 index 0000000..dfc8f5c --- /dev/null +++ b/.devcontainer/050 - Windows 10 LTSC/devcontainer.json @@ -0,0 +1,20 @@ +{ + "name": "Windows 10 LTSC", + "service": "windows", + "containerEnv": { + "VERSION": "10l" + }, + "forwardPorts": [8006], + "portsAttributes": { + "8006": { + "label": "Web", + "onAutoForward": "notify" + } + }, + "otherPortsAttributes": { + "onAutoForward": "ignore" + }, + "dockerComposeFile": "../codespaces.yml", + "workspaceFolder": "/workspaces/windows", + "initializeCommand": "docker system prune --all --force" +} diff --git a/.devcontainer/060 - Windows 8.1 Enterprise/devcontainer.json b/.devcontainer/060 - Windows 8.1 Enterprise/devcontainer.json new file mode 100644 index 0000000..e58f7ad --- /dev/null +++ b/.devcontainer/060 - Windows 8.1 Enterprise/devcontainer.json @@ -0,0 +1,20 @@ +{ + "name": "Windows 8.1 Enterprise", + "service": "windows", + "containerEnv": { + "VERSION": "8e" + }, + "forwardPorts": [8006], + "portsAttributes": { + "8006": { + "label": "Web", + "onAutoForward": "notify" + } + }, + "otherPortsAttributes": { + "onAutoForward": "ignore" + }, + "dockerComposeFile": "../codespaces.yml", + "workspaceFolder": "/workspaces/windows", + "initializeCommand": "docker system prune --all --force" +} diff --git a/.devcontainer/070 - Windows 7 Ultimate/devcontainer.json b/.devcontainer/070 - Windows 7 Ultimate/devcontainer.json new file mode 100644 index 0000000..85878f0 --- /dev/null +++ b/.devcontainer/070 - Windows 7 Ultimate/devcontainer.json @@ -0,0 +1,20 @@ +{ + "name": "Windows 7 Ultimate", + "service": "windows", + "containerEnv": { + "VERSION": "7u" + }, + "forwardPorts": [8006], + "portsAttributes": { + "8006": { + "label": "Web", + "onAutoForward": "notify" + } + }, + "otherPortsAttributes": { + "onAutoForward": "ignore" + }, + "dockerComposeFile": "../codespaces.yml", + "workspaceFolder": "/workspaces/windows", + "initializeCommand": "docker system prune --all --force" +} diff --git a/.devcontainer/080 - Windows Vista Ultimate/devcontainer.json b/.devcontainer/080 - Windows Vista Ultimate/devcontainer.json new file mode 100644 index 0000000..b99c942 --- /dev/null +++ b/.devcontainer/080 - Windows Vista Ultimate/devcontainer.json @@ -0,0 +1,20 @@ +{ + "name": "Windows Vista Ultimate", + "service": "windows", + "containerEnv": { + "VERSION": "vu" + }, + "forwardPorts": [8006], + "portsAttributes": { + "8006": { + "label": "Web", + "onAutoForward": "notify" + } + }, + "otherPortsAttributes": { + "onAutoForward": "ignore" + }, + "dockerComposeFile": "../codespaces.yml", + "workspaceFolder": "/workspaces/windows", + "initializeCommand": "docker system prune --all --force" +} diff --git a/.devcontainer/090 - Windows XP Professional/devcontainer.json b/.devcontainer/090 - Windows XP Professional/devcontainer.json new file mode 100644 index 0000000..a2c51c4 --- /dev/null +++ b/.devcontainer/090 - Windows XP Professional/devcontainer.json @@ -0,0 +1,20 @@ +{ + "name": "Windows XP Professional", + "service": "windows", + "containerEnv": { + "VERSION": "xp" + }, + "forwardPorts": [8006], + "portsAttributes": { + "8006": { + "label": "Web", + "onAutoForward": "notify" + } + }, + "otherPortsAttributes": { + "onAutoForward": "ignore" + }, + "dockerComposeFile": "../codespaces.yml", + "workspaceFolder": "/workspaces/windows", + "initializeCommand": "docker system prune --all --force" +} diff --git a/.devcontainer/100 - Windows 2000 Professional/devcontainer.json b/.devcontainer/100 - Windows 2000 Professional/devcontainer.json new file mode 100644 index 0000000..e5fab13 --- /dev/null +++ b/.devcontainer/100 - Windows 2000 Professional/devcontainer.json @@ -0,0 +1,20 @@ +{ + "name": "Windows 2000 Professional", + "service": "windows", + "containerEnv": { + "VERSION": "2k" + }, + "forwardPorts": [8006], + "portsAttributes": { + "8006": { + "label": "Web", + "onAutoForward": "notify" + } + }, + "otherPortsAttributes": { + "onAutoForward": "ignore" + }, + "dockerComposeFile": "../codespaces.yml", + "workspaceFolder": "/workspaces/windows", + "initializeCommand": "docker system prune --all --force" +} diff --git a/.devcontainer/110 - Windows Server 2025/devcontainer.json b/.devcontainer/110 - Windows Server 2025/devcontainer.json new file mode 100644 index 0000000..96089cc --- /dev/null +++ b/.devcontainer/110 - Windows Server 2025/devcontainer.json @@ -0,0 +1,20 @@ +{ + "name": "Windows Server 2025", + "service": "windows", + "containerEnv": { + "VERSION": "2025" + }, + "forwardPorts": [8006], + "portsAttributes": { + "8006": { + "label": "Web", + "onAutoForward": "notify" + } + }, + "otherPortsAttributes": { + "onAutoForward": "ignore" + }, + "dockerComposeFile": "../codespaces.yml", + "workspaceFolder": "/workspaces/windows", + "initializeCommand": "docker system prune --all --force" +} diff --git a/.devcontainer/120 - Windows Server 2022/devcontainer.json b/.devcontainer/120 - Windows Server 2022/devcontainer.json new file mode 100644 index 0000000..9897a67 --- /dev/null +++ b/.devcontainer/120 - Windows Server 2022/devcontainer.json @@ -0,0 +1,20 @@ +{ + "name": "Windows Server 2022", + "service": "windows", + "containerEnv": { + "VERSION": "2022" + }, + "forwardPorts": [8006], + "portsAttributes": { + "8006": { + "label": "Web", + "onAutoForward": "notify" + } + }, + "otherPortsAttributes": { + "onAutoForward": "ignore" + }, + "dockerComposeFile": "../codespaces.yml", + "workspaceFolder": "/workspaces/windows", + "initializeCommand": "docker system prune --all --force" +} diff --git a/.devcontainer/130 - Windows Server 2019/devcontainer.json b/.devcontainer/130 - Windows Server 2019/devcontainer.json new file mode 100644 index 0000000..9903599 --- /dev/null +++ b/.devcontainer/130 - Windows Server 2019/devcontainer.json @@ -0,0 +1,20 @@ +{ + "name": "Windows Server 2019", + "service": "windows", + "containerEnv": { + "VERSION": "2019" + }, + "forwardPorts": [8006], + "portsAttributes": { + "8006": { + "label": "Web", + "onAutoForward": "notify" + } + }, + "otherPortsAttributes": { + "onAutoForward": "ignore" + }, + "dockerComposeFile": "../codespaces.yml", + "workspaceFolder": "/workspaces/windows", + "initializeCommand": "docker system prune --all --force" +} diff --git a/.devcontainer/140 - Windows Server 2016/devcontainer.json b/.devcontainer/140 - Windows Server 2016/devcontainer.json new file mode 100644 index 0000000..614b171 --- /dev/null +++ b/.devcontainer/140 - Windows Server 2016/devcontainer.json @@ -0,0 +1,20 @@ +{ + "name": "Windows Server 2016", + "service": "windows", + "containerEnv": { + "VERSION": "2016" + }, + "forwardPorts": [8006], + "portsAttributes": { + "8006": { + "label": "Web", + "onAutoForward": "notify" + } + }, + "otherPortsAttributes": { + "onAutoForward": "ignore" + }, + "dockerComposeFile": "../codespaces.yml", + "workspaceFolder": "/workspaces/windows", + "initializeCommand": "docker system prune --all --force" +} diff --git a/.devcontainer/150 - Windows Server 2012 R2/devcontainer.json b/.devcontainer/150 - Windows Server 2012 R2/devcontainer.json new file mode 100644 index 0000000..158036c --- /dev/null +++ b/.devcontainer/150 - Windows Server 2012 R2/devcontainer.json @@ -0,0 +1,20 @@ +{ + "name": "Windows Server 2012 R2", + "service": "windows", + "containerEnv": { + "VERSION": "2012" + }, + "forwardPorts": [8006], + "portsAttributes": { + "8006": { + "label": "Web", + "onAutoForward": "notify" + } + }, + "otherPortsAttributes": { + "onAutoForward": "ignore" + }, + "dockerComposeFile": "../codespaces.yml", + "workspaceFolder": "/workspaces/windows", + "initializeCommand": "docker system prune --all --force" +} diff --git a/.devcontainer/160 - Windows Server 2008 R2/devcontainer.json b/.devcontainer/160 - Windows Server 2008 R2/devcontainer.json new file mode 100644 index 0000000..5dc1af6 --- /dev/null +++ b/.devcontainer/160 - Windows Server 2008 R2/devcontainer.json @@ -0,0 +1,20 @@ +{ + "name": "Windows Server 2008 R2", + "service": "windows", + "containerEnv": { + "VERSION": "2008" + }, + "forwardPorts": [8006], + "portsAttributes": { + "8006": { + "label": "Web", + "onAutoForward": "notify" + } + }, + "otherPortsAttributes": { + "onAutoForward": "ignore" + }, + "dockerComposeFile": "../codespaces.yml", + "workspaceFolder": "/workspaces/windows", + "initializeCommand": "docker system prune --all --force" +} diff --git a/.devcontainer/170 - Windows Server 2003/devcontainer.json b/.devcontainer/170 - Windows Server 2003/devcontainer.json new file mode 100644 index 0000000..c47effb --- /dev/null +++ b/.devcontainer/170 - Windows Server 2003/devcontainer.json @@ -0,0 +1,20 @@ +{ + "name": "Windows Server 2003", + "service": "windows", + "containerEnv": { + "VERSION": "2003" + }, + "forwardPorts": [8006], + "portsAttributes": { + "8006": { + "label": "Web", + "onAutoForward": "notify" + } + }, + "otherPortsAttributes": { + "onAutoForward": "ignore" + }, + "dockerComposeFile": "../codespaces.yml", + "workspaceFolder": "/workspaces/windows", + "initializeCommand": "docker system prune --all --force" +} diff --git a/.devcontainer/180 - Tiny11/devcontainer.json b/.devcontainer/180 - Tiny11/devcontainer.json new file mode 100644 index 0000000..225a746 --- /dev/null +++ b/.devcontainer/180 - Tiny11/devcontainer.json @@ -0,0 +1,20 @@ +{ + "name": "Tiny11", + "service": "windows", + "containerEnv": { + "VERSION": "tiny11" + }, + "forwardPorts": [8006], + "portsAttributes": { + "8006": { + "label": "Web", + "onAutoForward": "notify" + } + }, + "otherPortsAttributes": { + "onAutoForward": "ignore" + }, + "dockerComposeFile": "../codespaces.yml", + "workspaceFolder": "/workspaces/windows", + "initializeCommand": "docker system prune --all --force" +} diff --git a/.devcontainer/190 - Tiny11 Core/devcontainer.json b/.devcontainer/190 - Tiny11 Core/devcontainer.json new file mode 100644 index 0000000..78da098 --- /dev/null +++ b/.devcontainer/190 - Tiny11 Core/devcontainer.json @@ -0,0 +1,20 @@ +{ + "name": "Tiny11 Core", + "service": "windows", + "containerEnv": { + "VERSION": "core11" + }, + "forwardPorts": [8006], + "portsAttributes": { + "8006": { + "label": "Web", + "onAutoForward": "notify" + } + }, + "otherPortsAttributes": { + "onAutoForward": "ignore" + }, + "dockerComposeFile": "../codespaces.yml", + "workspaceFolder": "/workspaces/windows", + "initializeCommand": "docker system prune --all --force" +} diff --git a/.devcontainer/200 - Tiny11 Nano/devcontainer.json b/.devcontainer/200 - Tiny11 Nano/devcontainer.json new file mode 100644 index 0000000..c7fdca9 --- /dev/null +++ b/.devcontainer/200 - Tiny11 Nano/devcontainer.json @@ -0,0 +1,20 @@ +{ + "name": "Tiny11 Nano", + "service": "windows", + "containerEnv": { + "VERSION": "nano11" + }, + "forwardPorts": [8006], + "portsAttributes": { + "8006": { + "label": "Web", + "onAutoForward": "notify" + } + }, + "otherPortsAttributes": { + "onAutoForward": "ignore" + }, + "dockerComposeFile": "../codespaces.yml", + "workspaceFolder": "/workspaces/windows", + "initializeCommand": "docker system prune --all --force" +} diff --git a/.devcontainer/210 - Tiny10/devcontainer.json b/.devcontainer/210 - Tiny10/devcontainer.json new file mode 100644 index 0000000..3df1b88 --- /dev/null +++ b/.devcontainer/210 - Tiny10/devcontainer.json @@ -0,0 +1,20 @@ +{ + "name": "Tiny10", + "service": "windows", + "containerEnv": { + "VERSION": "tiny10" + }, + "forwardPorts": [8006], + "portsAttributes": { + "8006": { + "label": "Web", + "onAutoForward": "notify" + } + }, + "otherPortsAttributes": { + "onAutoForward": "ignore" + }, + "dockerComposeFile": "../codespaces.yml", + "workspaceFolder": "/workspaces/windows", + "initializeCommand": "docker system prune --all --force" +} diff --git a/.devcontainer/codespaces.yml b/.devcontainer/codespaces.yml new file mode 100644 index 0000000..85e3f64 --- /dev/null +++ b/.devcontainer/codespaces.yml @@ -0,0 +1,21 @@ +services: + windows: + container_name: windows + image: ghcr.io/dockur/windows + environment: + RAM_SIZE: "half" + DISK_SIZE: "max" + CPU_CORES: "max" + devices: + - /dev/kvm + - /dev/net/tun + cap_add: + - NET_ADMIN + ports: + - 8006:8006 + - 3389:3389/tcp + - 3389:3389/udp + volumes: + - ./windows:/storage + restart: on-failure + stop_grace_period: 2m diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..d7c98a8 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,20 @@ +{ + "name": "Windows 11 Pro", + "service": "windows", + "containerEnv": { + "VERSION": "11" + }, + "forwardPorts": [8006], + "portsAttributes": { + "8006": { + "label": "Web", + "onAutoForward": "notify" + } + }, + "otherPortsAttributes": { + "onAutoForward": "ignore" + }, + "dockerComposeFile": "codespaces.yml", + "workspaceFolder": "/workspaces/windows", + "initializeCommand": "docker system prune --all --force" +} diff --git a/.dockerignore b/.dockerignore index 258778b..154d44a 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,4 +1,5 @@ .dockerignore +.devcontainer .git .github .gitignore diff --git a/.github/ISSUE_TEMPLATE/1-issue.yml b/.github/ISSUE_TEMPLATE/1-issue.yml index 68f19b7..87860c9 100644 --- a/.github/ISSUE_TEMPLATE/1-issue.yml +++ b/.github/ISSUE_TEMPLATE/1-issue.yml @@ -21,6 +21,7 @@ body: attributes: label: Docker compose description: The compose file (or otherwise the `docker run` command used). + render: yaml validations: required: true - type: textarea @@ -28,6 +29,7 @@ body: attributes: label: Docker log description: The logfile of the container (as shown by `docker logs windows`). + render: shell validations: required: true - type: textarea diff --git a/.github/ISSUE_TEMPLATE/3-bug.yml b/.github/ISSUE_TEMPLATE/3-bug.yml index 131742c..f614f27 100644 --- a/.github/ISSUE_TEMPLATE/3-bug.yml +++ b/.github/ISSUE_TEMPLATE/3-bug.yml @@ -23,6 +23,7 @@ body: attributes: label: Docker compose description: The compose file (or otherwise the `docker run` command used). + render: yaml validations: required: true - type: textarea @@ -30,6 +31,7 @@ body: attributes: label: Docker log description: The logfile of the container (as shown by `docker logs windows`). + render: shell validations: required: true - type: textarea diff --git a/.github/winboat.png b/.github/winboat.png new file mode 100644 index 0000000..2b5f6db Binary files /dev/null and b/.github/winboat.png differ diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8731ab4..27c6385 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -2,16 +2,6 @@ name: Build on: workflow_dispatch: - push: - branches: - - master - paths-ignore: - - '**/*.md' - - '**/*.yml' - - '.gitignore' - - '.dockerignore' - - '.github/**' - - '.github/workflows/**' concurrency: group: build @@ -32,7 +22,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: fetch-depth: 0 - diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index b132f31..9e9d278 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -7,19 +7,29 @@ jobs: name: shellcheck runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - name: Run ShellCheck + - + name: Checkout + uses: actions/checkout@v5 + - + name: Run ShellCheck uses: ludeeus/action-shellcheck@master env: SHELLCHECK_OPTS: -x --source-path=src -e SC1091 -e SC2001 -e SC2002 -e SC2034 -e SC2064 -e SC2153 -e SC2317 -e SC2028 - - name: Validate XML - uses: action-pack/valid-xml@v1 - with: - path: "assets" - file-endings: ".xml" - - name: Lint Dockerfile - uses: hadolint/hadolint-action@v3.1.0 + - + name: Lint Dockerfile + uses: hadolint/hadolint-action@v3.3.0 with: dockerfile: Dockerfile ignore: DL3006,DL3008 failure-threshold: warning + - + name: Validate XML + uses: action-pack/valid-xml@v1 + with: + path: "assets" + file-endings: ".xml" + - + name: Validate JSON and YML files + uses: GrantBirki/json-yaml-validate@v4 + with: + yaml_exclude_regex: ".*\\kubernetes\\.yml$" diff --git a/.github/workflows/hub.yml b/.github/workflows/hub.yml index 0e0bcd1..0b2c17e 100644 --- a/.github/workflows/hub.yml +++ b/.github/workflows/hub.yml @@ -12,10 +12,10 @@ jobs: dockerHubDescription: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Docker Hub Description - uses: peter-evans/dockerhub-description@v4 + uses: peter-evans/dockerhub-description@v5 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} diff --git a/.github/workflows/review.yml b/.github/workflows/review.yml new file mode 100644 index 0000000..51f8503 --- /dev/null +++ b/.github/workflows/review.yml @@ -0,0 +1,66 @@ +on: + pull_request: + +name: "Review" + +permissions: + contents: read + pull-requests: write + checks: write + +jobs: + review: + name: review + runs-on: ubuntu-latest + steps: + - + name: Checkout + uses: actions/checkout@v5 + - + name: Spelling + uses: reviewdog/action-misspell@v1 + with: + locale: "US" + level: warning + pattern: | + *.md + *.sh + reporter: github-pr-review + github_token: ${{ secrets.REPO_ACCESS_TOKEN }} + - + name: Hadolint + uses: reviewdog/action-hadolint@v1 + with: + level: warning + reporter: github-pr-review + hadolint_ignore: DL3006 DL3008 + github_token: ${{ secrets.REPO_ACCESS_TOKEN }} + - + name: YamlLint + uses: reviewdog/action-yamllint@v1 + with: + level: warning + reporter: github-pr-review + github_token: ${{ secrets.REPO_ACCESS_TOKEN }} + - + name: ActionLint + uses: reviewdog/action-actionlint@v1 + with: + level: warning + reporter: github-pr-review + github_token: ${{ secrets.REPO_ACCESS_TOKEN }} + - + name: Shellformat + uses: reviewdog/action-shfmt@v1 + with: + level: warning + shfmt_flags: "-i 2 -ci -bn" + github_token: ${{ secrets.REPO_ACCESS_TOKEN }} + - + name: Shellcheck + uses: reviewdog/action-shellcheck@v1 + with: + level: warning + reporter: github-pr-review + shellcheck_flags: -x -e SC1091 -e SC2001 -e SC2002 -e SC2034 -e SC2064 -e SC2153 -e SC2317 -e SC2028 + github_token: ${{ secrets.REPO_ACCESS_TOKEN }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 4903636..c275f1a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,12 +1,6 @@ on: workflow_dispatch: pull_request: - paths: - - '**/*.sh' - - '**/*.xml' - - '.github/workflows/test.yml' - - '.github/workflows/check.yml' - - 'Dockerfile' name: "Test" permissions: {} diff --git a/Dockerfile b/Dockerfile index 67f6139..bf6dab2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,8 +1,11 @@ +# syntax=docker/dockerfile:1 + ARG VERSION_ARG="latest" FROM scratch AS build-amd64 -COPY --from=qemux/qemu:7.08 / / +COPY --from=qemux/qemu:7.27 / / +ARG TARGETARCH ARG DEBCONF_NOWARNINGS="yes" ARG DEBIAN_FRONTEND="noninteractive" ARG DEBCONF_NONINTERACTIVE_SEEN="true" @@ -10,20 +13,21 @@ ARG DEBCONF_NONINTERACTIVE_SEEN="true" RUN set -eu && \ apt-get update && \ apt-get --no-install-recommends -y install \ - wsdd \ samba \ wimtools \ dos2unix \ cabextract \ libxml2-utils \ libarchive-tools && \ + wget "https://github.com/gershnik/wsdd-native/releases/download/v1.22/wsddn_1.22_${TARGETARCH}.deb" -O /tmp/wsddn.deb -q && \ + dpkg -i /tmp/wsddn.deb && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* COPY --chmod=755 ./src /run/ COPY --chmod=755 ./assets /run/assets -ADD --chmod=664 https://github.com/qemus/virtiso-whql/releases/download/v1.9.45-0/virtio-win-1.9.45.tar.xz /drivers.txz +ADD --chmod=664 https://github.com/qemus/virtiso-whql/releases/download/v1.9.48-0/virtio-win-1.9.48.tar.xz /var/drivers.txz FROM dockurr/windows-arm:${VERSION_ARG} AS build-arm64 FROM build-${TARGETARCH} diff --git a/assets/win10x64-enterprise-eval.xml b/assets/win10x64-enterprise-eval.xml index 15cf47e..ee75f27 100644 --- a/assets/win10x64-enterprise-eval.xml +++ b/assets/win10x64-enterprise-eval.xml @@ -323,11 +323,6 @@ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "AllowInsecureGuestAuth" /t REG_DWORD /d 1 /f Allow guest access to network shares - - 2 - reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f - Allow RDP login with blank password - 3 reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device" /v "DevicePasswordLessBuildVersion" /t REG_DWORD /d 0 /f @@ -360,66 +355,81 @@ 9 + reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "ShowCopilotButton" /t REG_DWORD /d 0 /f + Hide Copilot button + + + 10 reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Power" /v "HibernateFileSizePercent" /t REG_DWORD /d 0 /f Zero Hibernation File - 10 + 11 reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Power" /v "HibernateEnabled" /t REG_DWORD /d 0 /f Disable Hibernation - 11 + 12 cmd /C POWERCFG -X -standby-timeout-ac 0 Disable Sleep - 12 + 13 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v "fAllowUnlistedRemotePrograms" /t REG_DWORD /d 1 /f - Enable RemoteAPP to launch unlisted programs + Enable RemoteApp to launch unlisted programs - 13 + 14 + reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList" /v "fDisabledAllowList" /t REG_DWORD /d 1 /f + Disable RemoteApp allowlist + + + 15 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Search" /v "SearchboxTaskbarMode" /t REG_DWORD /d 0 /f Remove Search from the Taskbar - 14 + 16 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "ShowTaskViewButton" /t REG_DWORD /d 0 /f Remove Task View from the Taskbar - 15 + 17 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarDa" /t REG_DWORD /d 0 /f Remove Widgets from the Taskbar - 16 + 18 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarMn" /t REG_DWORD /d 0 /f Remove Chat from the Taskbar - 17 + 19 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v "NoAutoUpdate" /t REG_DWORD /d 1 /f Turn off Windows Update auto download - 18 + 20 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-32752" new enable=Yes Enable Network Discovery - 19 + 21 + reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Network\NewNetworkWindowOff" /f + Disable Network Discovery popup + + + 22 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-28502" new enable=Yes Enable File Sharing - 20 - cmd /C echo 20.20.20.1 host.lan >> %WINDIR%\system32\drivers\etc\hosts - Add entry in hosts file + 23 + cmd /C mklink /d %userprofile%\Desktop\Shared \\host.lan\Data + Create desktop shortcut to shared folder - 21 + 24 cmd /C if exist "C:\OEM\install.bat" start "Install" "cmd /C C:\OEM\install.bat" Execute custom script from the OEM folder if exists diff --git a/assets/win10x64-enterprise.xml b/assets/win10x64-enterprise.xml index 8523316..5e5eb8c 100644 --- a/assets/win10x64-enterprise.xml +++ b/assets/win10x64-enterprise.xml @@ -326,11 +326,6 @@ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "AllowInsecureGuestAuth" /t REG_DWORD /d 1 /f Allow guest access to network shares - - 2 - reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f - Allow RDP login with blank password - 3 reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device" /v "DevicePasswordLessBuildVersion" /t REG_DWORD /d 0 /f @@ -363,66 +358,81 @@ 9 + reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "ShowCopilotButton" /t REG_DWORD /d 0 /f + Hide Copilot button + + + 10 reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Power" /v "HibernateFileSizePercent" /t REG_DWORD /d 0 /f Zero Hibernation File - 10 + 11 reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Power" /v "HibernateEnabled" /t REG_DWORD /d 0 /f Disable Hibernation - 11 + 12 cmd /C POWERCFG -X -standby-timeout-ac 0 Disable Sleep - 12 + 13 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v "fAllowUnlistedRemotePrograms" /t REG_DWORD /d 1 /f - Enable RemoteAPP to launch unlisted programs + Enable RemoteApp to launch unlisted programs - 13 + 14 + reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList" /v "fDisabledAllowList" /t REG_DWORD /d 1 /f + Disable RemoteApp allowlist + + + 15 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Search" /v "SearchboxTaskbarMode" /t REG_DWORD /d 0 /f Remove Search from the Taskbar - 14 + 16 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "ShowTaskViewButton" /t REG_DWORD /d 0 /f Remove Task View from the Taskbar - 15 + 17 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarDa" /t REG_DWORD /d 0 /f Remove Widgets from the Taskbar - 16 + 18 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarMn" /t REG_DWORD /d 0 /f Remove Chat from the Taskbar - 17 + 19 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v "NoAutoUpdate" /t REG_DWORD /d 1 /f Turn off Windows Update auto download - 18 + 20 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-32752" new enable=Yes Enable Network Discovery - 19 + 21 + reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Network\NewNetworkWindowOff" /f + Disable Network Discovery popup + + + 22 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-28502" new enable=Yes Enable File Sharing - 20 - cmd /C echo 20.20.20.1 host.lan >> %WINDIR%\system32\drivers\etc\hosts - Add entry in hosts file + 23 + cmd /C mklink /d %userprofile%\Desktop\Shared \\host.lan\Data + Create desktop shortcut to shared folder - 21 + 24 cmd /C if exist "C:\OEM\install.bat" start "Install" "cmd /C C:\OEM\install.bat" Execute custom script from the OEM folder if exists diff --git a/assets/win10x64-iot.xml b/assets/win10x64-iot.xml index fc80dc5..00a049e 100644 --- a/assets/win10x64-iot.xml +++ b/assets/win10x64-iot.xml @@ -332,11 +332,6 @@ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "AllowInsecureGuestAuth" /t REG_DWORD /d 1 /f Allow guest access to network shares - - 2 - reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f - Allow RDP login with blank password - 3 reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device" /v "DevicePasswordLessBuildVersion" /t REG_DWORD /d 0 /f @@ -369,66 +364,81 @@ 9 + reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "ShowCopilotButton" /t REG_DWORD /d 0 /f + Hide Copilot button + + + 10 reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Power" /v "HibernateFileSizePercent" /t REG_DWORD /d 0 /f Zero Hibernation File - 10 + 11 reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Power" /v "HibernateEnabled" /t REG_DWORD /d 0 /f Disable Hibernation - 11 + 12 cmd /C POWERCFG -X -standby-timeout-ac 0 Disable Sleep - 12 + 13 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v "fAllowUnlistedRemotePrograms" /t REG_DWORD /d 1 /f - Enable RemoteAPP to launch unlisted programs + Enable RemoteApp to launch unlisted programs - 13 + 14 + reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList" /v "fDisabledAllowList" /t REG_DWORD /d 1 /f + Disable RemoteApp allowlist + + + 15 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Search" /v "SearchboxTaskbarMode" /t REG_DWORD /d 0 /f Remove Search from the Taskbar - 14 + 16 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "ShowTaskViewButton" /t REG_DWORD /d 0 /f Remove Task View from the Taskbar - 15 + 17 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarDa" /t REG_DWORD /d 0 /f Remove Widgets from the Taskbar - 16 + 18 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarMn" /t REG_DWORD /d 0 /f Remove Chat from the Taskbar - 17 + 19 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v "NoAutoUpdate" /t REG_DWORD /d 1 /f Turn off Windows Update auto download - 18 + 20 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-32752" new enable=Yes Enable Network Discovery - 19 + 21 + reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Network\NewNetworkWindowOff" /f + Disable Network Discovery popup + + + 22 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-28502" new enable=Yes Enable File Sharing - 20 - cmd /C echo 20.20.20.1 host.lan >> %WINDIR%\system32\drivers\etc\hosts - Add entry in hosts file + 23 + cmd /C mklink /d %userprofile%\Desktop\Shared \\host.lan\Data + Create desktop shortcut to shared folder - 21 + 24 cmd /C if exist "C:\OEM\install.bat" start "Install" "cmd /C C:\OEM\install.bat" Execute custom script from the OEM folder if exists diff --git a/assets/win10x64-ltsc.xml b/assets/win10x64-ltsc.xml index 8cdc2de..e77dd6a 100644 --- a/assets/win10x64-ltsc.xml +++ b/assets/win10x64-ltsc.xml @@ -329,11 +329,6 @@ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "AllowInsecureGuestAuth" /t REG_DWORD /d 1 /f Allow guest access to network shares - - 2 - reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f - Allow RDP login with blank password - 3 reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device" /v "DevicePasswordLessBuildVersion" /t REG_DWORD /d 0 /f @@ -366,66 +361,81 @@ 9 + reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "ShowCopilotButton" /t REG_DWORD /d 0 /f + Hide Copilot button + + + 10 reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Power" /v "HibernateFileSizePercent" /t REG_DWORD /d 0 /f Zero Hibernation File - 10 + 11 reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Power" /v "HibernateEnabled" /t REG_DWORD /d 0 /f Disable Hibernation - 11 + 12 cmd /C POWERCFG -X -standby-timeout-ac 0 Disable Sleep - 12 + 13 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v "fAllowUnlistedRemotePrograms" /t REG_DWORD /d 1 /f - Enable RemoteAPP to launch unlisted programs + Enable RemoteApp to launch unlisted programs - 13 + 14 + reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList" /v "fDisabledAllowList" /t REG_DWORD /d 1 /f + Disable RemoteApp allowlist + + + 15 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Search" /v "SearchboxTaskbarMode" /t REG_DWORD /d 0 /f Remove Search from the Taskbar - 14 + 16 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "ShowTaskViewButton" /t REG_DWORD /d 0 /f Remove Task View from the Taskbar - 15 + 17 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarDa" /t REG_DWORD /d 0 /f Remove Widgets from the Taskbar - 16 + 18 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarMn" /t REG_DWORD /d 0 /f Remove Chat from the Taskbar - 17 + 19 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v "NoAutoUpdate" /t REG_DWORD /d 1 /f Turn off Windows Update auto download - 18 + 20 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-32752" new enable=Yes Enable Network Discovery - 19 + 21 + reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Network\NewNetworkWindowOff" /f + Disable Network Discovery popup + + + 22 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-28502" new enable=Yes Enable File Sharing - 20 - cmd /C echo 20.20.20.1 host.lan >> %WINDIR%\system32\drivers\etc\hosts - Add entry in hosts file + 23 + cmd /C mklink /d %userprofile%\Desktop\Shared \\host.lan\Data + Create desktop shortcut to shared folder - 21 + 24 cmd /C if exist "C:\OEM\install.bat" start "Install" "cmd /C C:\OEM\install.bat" Execute custom script from the OEM folder if exists diff --git a/assets/win10x64.xml b/assets/win10x64.xml index dbcbb51..7c21359 100644 --- a/assets/win10x64.xml +++ b/assets/win10x64.xml @@ -326,11 +326,6 @@ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "AllowInsecureGuestAuth" /t REG_DWORD /d 1 /f Allow guest access to network shares - - 2 - reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f - Allow RDP login with blank password - 3 reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device" /v "DevicePasswordLessBuildVersion" /t REG_DWORD /d 0 /f @@ -363,66 +358,81 @@ 9 + reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "ShowCopilotButton" /t REG_DWORD /d 0 /f + Hide Copilot button + + + 10 reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Power" /v "HibernateFileSizePercent" /t REG_DWORD /d 0 /f Zero Hibernation File - 10 + 11 reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Power" /v "HibernateEnabled" /t REG_DWORD /d 0 /f Disable Hibernation - 11 + 12 cmd /C POWERCFG -X -standby-timeout-ac 0 Disable Sleep - 12 + 13 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v "fAllowUnlistedRemotePrograms" /t REG_DWORD /d 1 /f - Enable RemoteAPP to launch unlisted programs + Enable RemoteApp to launch unlisted programs - 13 + 14 + reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList" /v "fDisabledAllowList" /t REG_DWORD /d 1 /f + Disable RemoteApp allowlist + + + 15 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Search" /v "SearchboxTaskbarMode" /t REG_DWORD /d 0 /f Remove Search from the Taskbar - 14 + 16 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "ShowTaskViewButton" /t REG_DWORD /d 0 /f Remove Task View from the Taskbar - 15 + 17 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarDa" /t REG_DWORD /d 0 /f Remove Widgets from the Taskbar - 16 + 18 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarMn" /t REG_DWORD /d 0 /f Remove Chat from the Taskbar - 17 + 19 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v "NoAutoUpdate" /t REG_DWORD /d 1 /f Turn off Windows Update auto download - 18 + 20 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-32752" new enable=Yes Enable Network Discovery - 19 + 21 + reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Network\NewNetworkWindowOff" /f + Disable Network Discovery popup + + + 22 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-28502" new enable=Yes Enable File Sharing - 20 - cmd /C echo 20.20.20.1 host.lan >> %WINDIR%\system32\drivers\etc\hosts - Add entry in hosts file + 23 + cmd /C mklink /d %userprofile%\Desktop\Shared \\host.lan\Data + Create desktop shortcut to shared folder - 21 + 24 cmd /C if exist "C:\OEM\install.bat" start "Install" "cmd /C C:\OEM\install.bat" Execute custom script from the OEM folder if exists diff --git a/assets/win11x64-enterprise-eval.xml b/assets/win11x64-enterprise-eval.xml index fcfa7b4..39c3f02 100644 --- a/assets/win11x64-enterprise-eval.xml +++ b/assets/win11x64-enterprise-eval.xml @@ -351,11 +351,6 @@ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "RequireSecuritySignature" /t REG_DWORD /d 0 /f Disable SMB signing requirement - - 3 - reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f - Allow RDP login with blank password - 4 reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device" /v "DevicePasswordLessBuildVersion" /t REG_DWORD /d 0 /f @@ -363,7 +358,7 @@ 5 - cmd /C wmic useraccount where name="Docker" set PasswordExpires=false + powershell.exe -ExecutionPolicy Unrestricted -NoLogo -NoProfile -NonInteractive set-localuser -name "Docker" -passwordneverexpires 1 Password Never Expires @@ -383,81 +378,91 @@ 9 + reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "ShowCopilotButton" /t REG_DWORD /d 0 /f + Hide Copilot button + + + 10 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "HideFileExt" /t REG_DWORD /d 0 /f Show file extensions in Explorer - 10 + 11 reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Power" /v "HibernateFileSizePercent" /t REG_DWORD /d 0 /f Zero Hibernation File - 11 + 12 reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Power" /v "HibernateEnabled" /t REG_DWORD /d 0 /f Disable Hibernation - 12 + 13 cmd /C POWERCFG -X -standby-timeout-ac 0 Disable Sleep - 13 + 14 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v "fAllowUnlistedRemotePrograms" /t REG_DWORD /d 1 /f Enable RemoteAPP to launch unlisted programs - 14 + 15 + reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList" /v "fDisabledAllowList" /t REG_DWORD /d 1 /f + Disable RemoteApp allowlist + + + 16 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "ShowTaskViewButton" /t REG_DWORD /d 0 /f Remove Task View from the Taskbar - 15 + 17 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarDa" /t REG_DWORD /d 0 /f Remove Widgets from the Taskbar - 16 + 18 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarMn" /t REG_DWORD /d 0 /f Remove Chat from the Taskbar - 17 + 19 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v "NoAutoUpdate" /t REG_DWORD /d 1 /f Turn off Windows Update auto download - 18 + 20 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-32752" new enable=Yes Enable Network Discovery - 19 + 21 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-28502" new enable=Yes Enable File Sharing - 20 + 22 reg.exe add "HKCU\Control Panel\UnsupportedHardwareNotificationCache" /v SV1 /d 0 /t REG_DWORD /f Disable unsupported hardware notifications - 21 + 23 reg.exe add "HKCU\Control Panel\UnsupportedHardwareNotificationCache" /v SV2 /d 0 /t REG_DWORD /f Disable unsupported hardware notifications - 22 + 24 cmd /C rd /q C:\Windows.old Remove empty Windows.old folder - 23 - cmd /C echo 20.20.20.1 host.lan >> %WINDIR%\system32\drivers\etc\hosts - Add entry in hosts file + 25 + cmd /C mklink /d %userprofile%\Desktop\Shared \\host.lan\Data + Create desktop shortcut to shared folder - 24 + 26 cmd /C if exist "C:\OEM\install.bat" start "Install" "cmd /C C:\OEM\install.bat" Execute custom script from the OEM folder if exists diff --git a/assets/win11x64-enterprise.xml b/assets/win11x64-enterprise.xml index 173e091..bafed49 100644 --- a/assets/win11x64-enterprise.xml +++ b/assets/win11x64-enterprise.xml @@ -354,11 +354,6 @@ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "RequireSecuritySignature" /t REG_DWORD /d 0 /f Disable SMB signing requirement - - 3 - reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f - Allow RDP login with blank password - 4 reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device" /v "DevicePasswordLessBuildVersion" /t REG_DWORD /d 0 /f @@ -366,7 +361,7 @@ 5 - cmd /C wmic useraccount where name="Docker" set PasswordExpires=false + powershell.exe -ExecutionPolicy Unrestricted -NoLogo -NoProfile -NonInteractive set-localuser -name "Docker" -passwordneverexpires 1 Password Never Expires @@ -386,81 +381,91 @@ 9 + reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "ShowCopilotButton" /t REG_DWORD /d 0 /f + Hide Copilot button + + + 10 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "HideFileExt" /t REG_DWORD /d 0 /f Show file extensions in Explorer - 10 + 11 reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Power" /v "HibernateFileSizePercent" /t REG_DWORD /d 0 /f Zero Hibernation File - 11 + 12 reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Power" /v "HibernateEnabled" /t REG_DWORD /d 0 /f Disable Hibernation - 12 + 13 cmd /C POWERCFG -X -standby-timeout-ac 0 Disable Sleep - 13 + 14 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v "fAllowUnlistedRemotePrograms" /t REG_DWORD /d 1 /f Enable RemoteAPP to launch unlisted programs - 14 + 15 + reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList" /v "fDisabledAllowList" /t REG_DWORD /d 1 /f + Disable RemoteApp allowlist + + + 16 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "ShowTaskViewButton" /t REG_DWORD /d 0 /f Remove Task View from the Taskbar - 15 + 17 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarDa" /t REG_DWORD /d 0 /f Remove Widgets from the Taskbar - 16 + 18 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarMn" /t REG_DWORD /d 0 /f Remove Chat from the Taskbar - 17 + 19 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v "NoAutoUpdate" /t REG_DWORD /d 1 /f Turn off Windows Update auto download - 18 + 20 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-32752" new enable=Yes Enable Network Discovery - 19 + 21 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-28502" new enable=Yes Enable File Sharing - 20 + 22 reg.exe add "HKCU\Control Panel\UnsupportedHardwareNotificationCache" /v SV1 /d 0 /t REG_DWORD /f Disable unsupported hardware notifications - 21 + 23 reg.exe add "HKCU\Control Panel\UnsupportedHardwareNotificationCache" /v SV2 /d 0 /t REG_DWORD /f Disable unsupported hardware notifications - 22 + 24 cmd /C rd /q C:\Windows.old Remove empty Windows.old folder - 23 - cmd /C echo 20.20.20.1 host.lan >> %WINDIR%\system32\drivers\etc\hosts - Add entry in hosts file + 25 + cmd /C mklink /d %userprofile%\Desktop\Shared \\host.lan\Data + Create desktop shortcut to shared folder - 24 + 26 cmd /C if exist "C:\OEM\install.bat" start "Install" "cmd /C C:\OEM\install.bat" Execute custom script from the OEM folder if exists diff --git a/assets/win11x64-iot.xml b/assets/win11x64-iot.xml index 1c35d05..d6825d0 100644 --- a/assets/win11x64-iot.xml +++ b/assets/win11x64-iot.xml @@ -354,11 +354,6 @@ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "RequireSecuritySignature" /t REG_DWORD /d 0 /f Disable SMB signing requirement - - 3 - reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f - Allow RDP login with blank password - 4 reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device" /v "DevicePasswordLessBuildVersion" /t REG_DWORD /d 0 /f @@ -366,7 +361,7 @@ 5 - cmd /C wmic useraccount where name="Docker" set PasswordExpires=false + powershell.exe -ExecutionPolicy Unrestricted -NoLogo -NoProfile -NonInteractive set-localuser -name "Docker" -passwordneverexpires 1 Password Never Expires @@ -386,81 +381,91 @@ 9 + reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "ShowCopilotButton" /t REG_DWORD /d 0 /f + Hide Copilot button + + + 10 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "HideFileExt" /t REG_DWORD /d 0 /f Show file extensions in Explorer - 10 + 11 reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Power" /v "HibernateFileSizePercent" /t REG_DWORD /d 0 /f Zero Hibernation File - 11 + 12 reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Power" /v "HibernateEnabled" /t REG_DWORD /d 0 /f Disable Hibernation - 12 + 13 cmd /C POWERCFG -X -standby-timeout-ac 0 Disable Sleep - 13 + 14 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v "fAllowUnlistedRemotePrograms" /t REG_DWORD /d 1 /f Enable RemoteAPP to launch unlisted programs - 14 + 15 + reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList" /v "fDisabledAllowList" /t REG_DWORD /d 1 /f + Disable RemoteApp allowlist + + + 16 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "ShowTaskViewButton" /t REG_DWORD /d 0 /f Remove Task View from the Taskbar - 15 + 17 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarDa" /t REG_DWORD /d 0 /f Remove Widgets from the Taskbar - 16 + 18 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarMn" /t REG_DWORD /d 0 /f Remove Chat from the Taskbar - 17 + 19 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v "NoAutoUpdate" /t REG_DWORD /d 1 /f Turn off Windows Update auto download - 18 + 20 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-32752" new enable=Yes Enable Network Discovery - 19 + 21 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-28502" new enable=Yes Enable File Sharing - 20 + 22 reg.exe add "HKCU\Control Panel\UnsupportedHardwareNotificationCache" /v SV1 /d 0 /t REG_DWORD /f Disable unsupported hardware notifications - 21 + 23 reg.exe add "HKCU\Control Panel\UnsupportedHardwareNotificationCache" /v SV2 /d 0 /t REG_DWORD /f Disable unsupported hardware notifications - 22 + 24 cmd /C rd /q C:\Windows.old Remove empty Windows.old folder - 23 - cmd /C echo 20.20.20.1 host.lan >> %WINDIR%\system32\drivers\etc\hosts - Add entry in hosts file + 25 + cmd /C mklink /d %userprofile%\Desktop\Shared \\host.lan\Data + Create desktop shortcut to shared folder - 24 + 26 cmd /C if exist "C:\OEM\install.bat" start "Install" "cmd /C C:\OEM\install.bat" Execute custom script from the OEM folder if exists diff --git a/assets/win11x64-ltsc.xml b/assets/win11x64-ltsc.xml index e52ccc9..a9a6ce7 100644 --- a/assets/win11x64-ltsc.xml +++ b/assets/win11x64-ltsc.xml @@ -354,11 +354,6 @@ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "RequireSecuritySignature" /t REG_DWORD /d 0 /f Disable SMB signing requirement - - 3 - reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f - Allow RDP login with blank password - 4 reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device" /v "DevicePasswordLessBuildVersion" /t REG_DWORD /d 0 /f @@ -366,7 +361,7 @@ 5 - cmd /C wmic useraccount where name="Docker" set PasswordExpires=false + powershell.exe -ExecutionPolicy Unrestricted -NoLogo -NoProfile -NonInteractive set-localuser -name "Docker" -passwordneverexpires 1 Password Never Expires @@ -386,81 +381,91 @@ 9 + reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "ShowCopilotButton" /t REG_DWORD /d 0 /f + Hide Copilot button + + + 10 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "HideFileExt" /t REG_DWORD /d 0 /f Show file extensions in Explorer - 10 + 11 reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Power" /v "HibernateFileSizePercent" /t REG_DWORD /d 0 /f Zero Hibernation File - 11 + 12 reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Power" /v "HibernateEnabled" /t REG_DWORD /d 0 /f Disable Hibernation - 12 + 13 cmd /C POWERCFG -X -standby-timeout-ac 0 Disable Sleep - 13 + 14 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v "fAllowUnlistedRemotePrograms" /t REG_DWORD /d 1 /f Enable RemoteAPP to launch unlisted programs - 14 + 15 + reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList" /v "fDisabledAllowList" /t REG_DWORD /d 1 /f + Disable RemoteApp allowlist + + + 16 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "ShowTaskViewButton" /t REG_DWORD /d 0 /f Remove Task View from the Taskbar - 15 + 17 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarDa" /t REG_DWORD /d 0 /f Remove Widgets from the Taskbar - 16 + 18 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarMn" /t REG_DWORD /d 0 /f Remove Chat from the Taskbar - 17 + 19 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v "NoAutoUpdate" /t REG_DWORD /d 1 /f Turn off Windows Update auto download - 18 + 20 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-32752" new enable=Yes Enable Network Discovery - 19 + 21 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-28502" new enable=Yes Enable File Sharing - 20 + 22 reg.exe add "HKCU\Control Panel\UnsupportedHardwareNotificationCache" /v SV1 /d 0 /t REG_DWORD /f Disable unsupported hardware notifications - 21 + 23 reg.exe add "HKCU\Control Panel\UnsupportedHardwareNotificationCache" /v SV2 /d 0 /t REG_DWORD /f Disable unsupported hardware notifications - 22 + 24 cmd /C rd /q C:\Windows.old Remove empty Windows.old folder - 23 - cmd /C echo 20.20.20.1 host.lan >> %WINDIR%\system32\drivers\etc\hosts - Add entry in hosts file + 25 + cmd /C mklink /d %userprofile%\Desktop\Shared \\host.lan\Data + Create desktop shortcut to shared folder - 24 + 26 cmd /C if exist "C:\OEM\install.bat" start "Install" "cmd /C C:\OEM\install.bat" Execute custom script from the OEM folder if exists diff --git a/assets/win11x64.xml b/assets/win11x64.xml index e5442ef..8082c7c 100644 --- a/assets/win11x64.xml +++ b/assets/win11x64.xml @@ -354,11 +354,6 @@ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "RequireSecuritySignature" /t REG_DWORD /d 0 /f Disable SMB signing requirement - - 3 - reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f - Allow RDP login with blank password - 4 reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device" /v "DevicePasswordLessBuildVersion" /t REG_DWORD /d 0 /f @@ -366,7 +361,7 @@ 5 - cmd /C wmic useraccount where name="Docker" set PasswordExpires=false + powershell.exe -ExecutionPolicy Unrestricted -NoLogo -NoProfile -NonInteractive set-localuser -name "Docker" -passwordneverexpires 1 Password Never Expires @@ -386,81 +381,91 @@ 9 + reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "ShowCopilotButton" /t REG_DWORD /d 0 /f + Hide Copilot button + + + 10 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "HideFileExt" /t REG_DWORD /d 0 /f Show file extensions in Explorer - 10 + 11 reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Power" /v "HibernateFileSizePercent" /t REG_DWORD /d 0 /f Zero Hibernation File - 11 + 12 reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Power" /v "HibernateEnabled" /t REG_DWORD /d 0 /f Disable Hibernation - 12 + 13 cmd /C POWERCFG -X -standby-timeout-ac 0 Disable Sleep - 13 + 14 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v "fAllowUnlistedRemotePrograms" /t REG_DWORD /d 1 /f Enable RemoteAPP to launch unlisted programs - 14 + 15 + reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList" /v "fDisabledAllowList" /t REG_DWORD /d 1 /f + Disable RemoteApp allowlist + + + 16 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "ShowTaskViewButton" /t REG_DWORD /d 0 /f Remove Task View from the Taskbar - 15 + 17 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarDa" /t REG_DWORD /d 0 /f Remove Widgets from the Taskbar - 16 + 18 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarMn" /t REG_DWORD /d 0 /f Remove Chat from the Taskbar - 17 + 19 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v "NoAutoUpdate" /t REG_DWORD /d 1 /f Turn off Windows Update auto download - 18 + 20 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-32752" new enable=Yes Enable Network Discovery - 19 + 21 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-28502" new enable=Yes Enable File Sharing - 20 + 22 reg.exe add "HKCU\Control Panel\UnsupportedHardwareNotificationCache" /v SV1 /d 0 /t REG_DWORD /f Disable unsupported hardware notifications - 21 + 23 reg.exe add "HKCU\Control Panel\UnsupportedHardwareNotificationCache" /v SV2 /d 0 /t REG_DWORD /f Disable unsupported hardware notifications - 22 + 24 cmd /C rd /q C:\Windows.old Remove empty Windows.old folder - 23 - cmd /C echo 20.20.20.1 host.lan >> %WINDIR%\system32\drivers\etc\hosts - Add entry in hosts file + 25 + cmd /C mklink /d %userprofile%\Desktop\Shared \\host.lan\Data + Create desktop shortcut to shared folder - 24 + 26 cmd /C if exist "C:\OEM\install.bat" start "Install" "cmd /C C:\OEM\install.bat" Execute custom script from the OEM folder if exists diff --git a/assets/win2008r2-eval.xml b/assets/win2008r2-eval.xml index bd3d074..09a23ce 100644 --- a/assets/win2008r2-eval.xml +++ b/assets/win2008r2-eval.xml @@ -203,11 +203,6 @@ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "AllowInsecureGuestAuth" /t REG_DWORD /d 1 /f Allow guest access to network shares - - 2 - reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f - Allow RDP login with blank password - 3 reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device" /v "DevicePasswordLessBuildVersion" /t REG_DWORD /d 0 /f @@ -271,30 +266,35 @@ 15 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v "fAllowUnlistedRemotePrograms" /t REG_DWORD /d 1 /f - Enable RemoteAPP to launch unlisted programs + Enable RemoteApp to launch unlisted programs 16 + reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList" /v "fDisabledAllowList" /t REG_DWORD /d 1 /f + Disable RemoteApp allowlist + + + 17 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v "NoAutoUpdate" /t REG_DWORD /d 1 /f Turn off Windows Update auto download - 17 + 18 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-32752" new enable=Yes Enable Network Discovery - 18 + 19 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-28502" new enable=Yes Enable File Sharing - 19 - cmd /C echo 20.20.20.1 host.lan >> %WINDIR%\system32\drivers\etc\hosts - Add entry in hosts file + 20 + cmd /C mklink /d %userprofile%\Desktop\Shared \\host.lan\Data + Create desktop shortcut to shared folder - 20 + 21 cmd /C if exist "C:\OEM\install.bat" start "Install" "cmd /C C:\OEM\install.bat" Execute custom script from the OEM folder if exists diff --git a/assets/win2008r2.xml b/assets/win2008r2.xml index f1e87d6..5dee0a5 100644 --- a/assets/win2008r2.xml +++ b/assets/win2008r2.xml @@ -206,11 +206,6 @@ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "AllowInsecureGuestAuth" /t REG_DWORD /d 1 /f Allow guest access to network shares - - 2 - reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f - Allow RDP login with blank password - 3 reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device" /v "DevicePasswordLessBuildVersion" /t REG_DWORD /d 0 /f @@ -274,30 +269,35 @@ 15 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v "fAllowUnlistedRemotePrograms" /t REG_DWORD /d 1 /f - Enable RemoteAPP to launch unlisted programs + Enable RemoteApp to launch unlisted programs 16 + reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList" /v "fDisabledAllowList" /t REG_DWORD /d 1 /f + Disable RemoteApp allowlist + + + 17 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v "NoAutoUpdate" /t REG_DWORD /d 1 /f Turn off Windows Update auto download - 17 + 18 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-32752" new enable=Yes Enable Network Discovery - 18 + 19 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-28502" new enable=Yes Enable File Sharing - 19 - cmd /C echo 20.20.20.1 host.lan >> %WINDIR%\system32\drivers\etc\hosts - Add entry in hosts file + 20 + cmd /C mklink /d %userprofile%\Desktop\Shared \\host.lan\Data + Create desktop shortcut to shared folder - 20 + 21 cmd /C if exist "C:\OEM\install.bat" start "Install" "cmd /C C:\OEM\install.bat" Execute custom script from the OEM folder if exists diff --git a/assets/win2012r2-eval.xml b/assets/win2012r2-eval.xml index b454f2a..6351559 100644 --- a/assets/win2012r2-eval.xml +++ b/assets/win2012r2-eval.xml @@ -236,11 +236,6 @@ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "AllowInsecureGuestAuth" /t REG_DWORD /d 1 /f Allow guest access to network shares - - 2 - reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f - Allow RDP login with blank password - 3 reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device" /v "DevicePasswordLessBuildVersion" /t REG_DWORD /d 0 /f @@ -289,30 +284,40 @@ 12 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v "fAllowUnlistedRemotePrograms" /t REG_DWORD /d 1 /f - Enable RemoteAPP to launch unlisted programs + Enable RemoteApp to launch unlisted programs 13 + reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList" /v "fDisabledAllowList" /t REG_DWORD /d 1 /f + Disable RemoteApp allowlist + + + 14 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v "NoAutoUpdate" /t REG_DWORD /d 1 /f Turn off Windows Update auto download - 14 + 15 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-32752" new enable=Yes Enable Network Discovery - 15 + 16 + reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Network\NewNetworkWindowOff" /f + Disable Network Discovery popup + + + 17 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-28502" new enable=Yes Enable File Sharing - 16 - cmd /C echo 20.20.20.1 host.lan >> %WINDIR%\system32\drivers\etc\hosts - Add entry in hosts file + 18 + cmd /C mklink /d %userprofile%\Desktop\Shared \\host.lan\Data + Create desktop shortcut to shared folder - 17 + 19 cmd /C if exist "C:\OEM\install.bat" start "Install" "cmd /C C:\OEM\install.bat" Execute custom script from the OEM folder if exists diff --git a/assets/win2012r2.xml b/assets/win2012r2.xml index 06c8030..bb3dd70 100644 --- a/assets/win2012r2.xml +++ b/assets/win2012r2.xml @@ -239,11 +239,6 @@ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "AllowInsecureGuestAuth" /t REG_DWORD /d 1 /f Allow guest access to network shares - - 2 - reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f - Allow RDP login with blank password - 3 reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device" /v "DevicePasswordLessBuildVersion" /t REG_DWORD /d 0 /f @@ -292,30 +287,40 @@ 12 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v "fAllowUnlistedRemotePrograms" /t REG_DWORD /d 1 /f - Enable RemoteAPP to launch unlisted programs + Enable RemoteApp to launch unlisted programs 13 + reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList" /v "fDisabledAllowList" /t REG_DWORD /d 1 /f + Disable RemoteApp allowlist + + + 14 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v "NoAutoUpdate" /t REG_DWORD /d 1 /f Turn off Windows Update auto download - 14 + 15 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-32752" new enable=Yes Enable Network Discovery - 15 + 16 + reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Network\NewNetworkWindowOff" /f + Disable Network Discovery popup + + + 17 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-28502" new enable=Yes Enable File Sharing - 16 - cmd /C echo 20.20.20.1 host.lan >> %WINDIR%\system32\drivers\etc\hosts - Add entry in hosts file + 18 + cmd /C mklink /d %userprofile%\Desktop\Shared \\host.lan\Data + Create desktop shortcut to shared folder - 17 + 19 cmd /C if exist "C:\OEM\install.bat" start "Install" "cmd /C C:\OEM\install.bat" Execute custom script from the OEM folder if exists diff --git a/assets/win2016-eval.xml b/assets/win2016-eval.xml index 5a3f668..d788960 100644 --- a/assets/win2016-eval.xml +++ b/assets/win2016-eval.xml @@ -236,11 +236,6 @@ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "AllowInsecureGuestAuth" /t REG_DWORD /d 1 /f Allow guest access to network shares - - 2 - reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f - Allow RDP login with blank password - 3 reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device" /v "DevicePasswordLessBuildVersion" /t REG_DWORD /d 0 /f @@ -289,50 +284,60 @@ 12 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v "fAllowUnlistedRemotePrograms" /t REG_DWORD /d 1 /f - Enable RemoteAPP to launch unlisted programs + Enable RemoteApp to launch unlisted programs 13 + reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList" /v "fDisabledAllowList" /t REG_DWORD /d 1 /f + Disable RemoteApp allowlist + + + 14 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Search" /v "SearchboxTaskbarMode" /t REG_DWORD /d 0 /f Remove Search from the Taskbar - 14 + 15 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "ShowTaskViewButton" /t REG_DWORD /d 0 /f Remove Task View from the Taskbar - 15 + 16 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarDa" /t REG_DWORD /d 0 /f Remove Widgets from the Taskbar - 16 + 17 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarMn" /t REG_DWORD /d 0 /f Remove Chat from the Taskbar - 17 + 18 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v "NoAutoUpdate" /t REG_DWORD /d 1 /f Turn off Windows Update auto download - 18 + 19 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-32752" new enable=Yes Enable Network Discovery - 19 + 20 + reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Network\NewNetworkWindowOff" /f + Disable Network Discovery popup + + + 21 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-28502" new enable=Yes Enable File Sharing - 20 - cmd /C echo 20.20.20.1 host.lan >> %WINDIR%\system32\drivers\etc\hosts - Add entry in hosts file + 22 + cmd /C mklink /d %userprofile%\Desktop\Shared \\host.lan\Data + Create desktop shortcut to shared folder - 21 + 23 cmd /C if exist "C:\OEM\install.bat" start "Install" "cmd /C C:\OEM\install.bat" Execute custom script from the OEM folder if exists diff --git a/assets/win2016.xml b/assets/win2016.xml index 7300fed..e055e00 100644 --- a/assets/win2016.xml +++ b/assets/win2016.xml @@ -239,11 +239,6 @@ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "AllowInsecureGuestAuth" /t REG_DWORD /d 1 /f Allow guest access to network shares - - 2 - reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f - Allow RDP login with blank password - 3 reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device" /v "DevicePasswordLessBuildVersion" /t REG_DWORD /d 0 /f @@ -292,50 +287,60 @@ 12 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v "fAllowUnlistedRemotePrograms" /t REG_DWORD /d 1 /f - Enable RemoteAPP to launch unlisted programs + Enable RemoteApp to launch unlisted programs 13 + reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList" /v "fDisabledAllowList" /t REG_DWORD /d 1 /f + Disable RemoteApp allowlist + + + 14 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Search" /v "SearchboxTaskbarMode" /t REG_DWORD /d 0 /f Remove Search from the Taskbar - 14 + 15 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "ShowTaskViewButton" /t REG_DWORD /d 0 /f Remove Task View from the Taskbar - 15 + 16 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarDa" /t REG_DWORD /d 0 /f Remove Widgets from the Taskbar - 16 + 17 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarMn" /t REG_DWORD /d 0 /f Remove Chat from the Taskbar - 17 + 18 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v "NoAutoUpdate" /t REG_DWORD /d 1 /f Turn off Windows Update auto download - 18 + 19 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-32752" new enable=Yes Enable Network Discovery - 19 + 20 + reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Network\NewNetworkWindowOff" /f + Disable Network Discovery popup + + + 21 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-28502" new enable=Yes Enable File Sharing - 20 - cmd /C echo 20.20.20.1 host.lan >> %WINDIR%\system32\drivers\etc\hosts - Add entry in hosts file + 22 + cmd /C mklink /d %userprofile%\Desktop\Shared \\host.lan\Data + Create desktop shortcut to shared folder - 21 + 23 cmd /C if exist "C:\OEM\install.bat" start "Install" "cmd /C C:\OEM\install.bat" Execute custom script from the OEM folder if exists diff --git a/assets/win2019-eval.xml b/assets/win2019-eval.xml index 6de9fd1..332d974 100644 --- a/assets/win2019-eval.xml +++ b/assets/win2019-eval.xml @@ -240,11 +240,6 @@ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "AllowInsecureGuestAuth" /t REG_DWORD /d 1 /f Allow guest access to network shares - - 2 - reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f - Allow RDP login with blank password - 3 reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device" /v "DevicePasswordLessBuildVersion" /t REG_DWORD /d 0 /f @@ -293,50 +288,60 @@ 12 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v "fAllowUnlistedRemotePrograms" /t REG_DWORD /d 1 /f - Enable RemoteAPP to launch unlisted programs + Enable RemoteApp to launch unlisted programs 13 + reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList" /v "fDisabledAllowList" /t REG_DWORD /d 1 /f + Disable RemoteApp allowlist + + + 14 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Search" /v "SearchboxTaskbarMode" /t REG_DWORD /d 0 /f Remove Search from the Taskbar - 14 + 15 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "ShowTaskViewButton" /t REG_DWORD /d 0 /f Remove Task View from the Taskbar - 15 + 16 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarDa" /t REG_DWORD /d 0 /f Remove Widgets from the Taskbar - 16 + 17 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarMn" /t REG_DWORD /d 0 /f Remove Chat from the Taskbar - 17 + 18 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v "NoAutoUpdate" /t REG_DWORD /d 1 /f Turn off Windows Update auto download - 18 + 19 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-32752" new enable=Yes Enable Network Discovery - 19 + 20 + reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Network\NewNetworkWindowOff" /f + Disable Network Discovery popup + + + 21 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-28502" new enable=Yes Enable File Sharing - 20 - cmd /C echo 20.20.20.1 host.lan >> %WINDIR%\system32\drivers\etc\hosts - Add entry in hosts file + 22 + cmd /C mklink /d %userprofile%\Desktop\Shared \\host.lan\Data + Create desktop shortcut to shared folder - 21 + 23 cmd /C if exist "C:\OEM\install.bat" start "Install" "cmd /C C:\OEM\install.bat" Execute custom script from the OEM folder if exists diff --git a/assets/win2019-hv.xml b/assets/win2019-hv.xml index d07259d..2fb6e32 100644 --- a/assets/win2019-hv.xml +++ b/assets/win2019-hv.xml @@ -245,11 +245,6 @@ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "AllowInsecureGuestAuth" /t REG_DWORD /d 1 /f Allow guest access to network shares - - 2 - reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f - Allow RDP login with blank password - 3 reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device" /v "DevicePasswordLessBuildVersion" /t REG_DWORD /d 0 /f @@ -298,50 +293,60 @@ 12 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v "fAllowUnlistedRemotePrograms" /t REG_DWORD /d 1 /f - Enable RemoteAPP to launch unlisted programs + Enable RemoteApp to launch unlisted programs 13 + reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList" /v "fDisabledAllowList" /t REG_DWORD /d 1 /f + Disable RemoteApp allowlist + + + 14 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Search" /v "SearchboxTaskbarMode" /t REG_DWORD /d 0 /f Remove Search from the Taskbar - 14 + 15 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "ShowTaskViewButton" /t REG_DWORD /d 0 /f Remove Task View from the Taskbar - 15 + 16 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarDa" /t REG_DWORD /d 0 /f Remove Widgets from the Taskbar - 16 + 17 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarMn" /t REG_DWORD /d 0 /f Remove Chat from the Taskbar - 17 + 18 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v "NoAutoUpdate" /t REG_DWORD /d 1 /f Turn off Windows Update auto download - 18 + 19 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-32752" new enable=Yes Enable Network Discovery - 19 + 20 + reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Network\NewNetworkWindowOff" /f + Disable Network Discovery popup + + + 21 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-28502" new enable=Yes Enable File Sharing - 20 - cmd /C echo 20.20.20.1 host.lan >> %WINDIR%\system32\drivers\etc\hosts - Add entry in hosts file + 22 + cmd /C mklink /d %userprofile%\Desktop\Shared \\host.lan\Data + Create desktop shortcut to shared folder - 21 + 23 cmd /C if exist "C:\OEM\install.bat" start "Install" "cmd /C C:\OEM\install.bat" Execute custom script from the OEM folder if exists diff --git a/assets/win2019.xml b/assets/win2019.xml index e07ef29..b5d8235 100644 --- a/assets/win2019.xml +++ b/assets/win2019.xml @@ -243,11 +243,6 @@ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "AllowInsecureGuestAuth" /t REG_DWORD /d 1 /f Allow guest access to network shares - - 2 - reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f - Allow RDP login with blank password - 3 reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device" /v "DevicePasswordLessBuildVersion" /t REG_DWORD /d 0 /f @@ -296,50 +291,60 @@ 12 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v "fAllowUnlistedRemotePrograms" /t REG_DWORD /d 1 /f - Enable RemoteAPP to launch unlisted programs + Enable RemoteApp to launch unlisted programs 13 + reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList" /v "fDisabledAllowList" /t REG_DWORD /d 1 /f + Disable RemoteApp allowlist + + + 14 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Search" /v "SearchboxTaskbarMode" /t REG_DWORD /d 0 /f Remove Search from the Taskbar - 14 + 15 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "ShowTaskViewButton" /t REG_DWORD /d 0 /f Remove Task View from the Taskbar - 15 + 16 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarDa" /t REG_DWORD /d 0 /f Remove Widgets from the Taskbar - 16 + 17 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarMn" /t REG_DWORD /d 0 /f Remove Chat from the Taskbar - 17 + 18 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v "NoAutoUpdate" /t REG_DWORD /d 1 /f Turn off Windows Update auto download - 18 + 19 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-32752" new enable=Yes Enable Network Discovery - 19 + 20 + reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Network\NewNetworkWindowOff" /f + Disable Network Discovery popup + + + 21 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-28502" new enable=Yes Enable File Sharing - 20 - cmd /C echo 20.20.20.1 host.lan >> %WINDIR%\system32\drivers\etc\hosts - Add entry in hosts file + 22 + cmd /C mklink /d %userprofile%\Desktop\Shared \\host.lan\Data + Create desktop shortcut to shared folder - 21 + 23 cmd /C if exist "C:\OEM\install.bat" start "Install" "cmd /C C:\OEM\install.bat" Execute custom script from the OEM folder if exists diff --git a/assets/win2022-eval.xml b/assets/win2022-eval.xml index 9059ab5..5748cb4 100644 --- a/assets/win2022-eval.xml +++ b/assets/win2022-eval.xml @@ -240,11 +240,6 @@ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "AllowInsecureGuestAuth" /t REG_DWORD /d 1 /f Allow guest access to network shares - - 2 - reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f - Allow RDP login with blank password - 3 reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device" /v "DevicePasswordLessBuildVersion" /t REG_DWORD /d 0 /f @@ -293,50 +288,60 @@ 12 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v "fAllowUnlistedRemotePrograms" /t REG_DWORD /d 1 /f - Enable RemoteAPP to launch unlisted programs + Enable RemoteApp to launch unlisted programs 13 + reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList" /v "fDisabledAllowList" /t REG_DWORD /d 1 /f + Disable RemoteApp allowlist + + + 14 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Search" /v "SearchboxTaskbarMode" /t REG_DWORD /d 0 /f Remove Search from the Taskbar - 14 + 15 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "ShowTaskViewButton" /t REG_DWORD /d 0 /f Remove Task View from the Taskbar - 15 + 16 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarDa" /t REG_DWORD /d 0 /f Remove Widgets from the Taskbar - 16 + 17 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarMn" /t REG_DWORD /d 0 /f Remove Chat from the Taskbar - 17 + 18 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v "NoAutoUpdate" /t REG_DWORD /d 1 /f Turn off Windows Update auto download - 18 + 19 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-32752" new enable=Yes Enable Network Discovery - 19 + 20 + reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Network\NewNetworkWindowOff" /f + Disable Network Discovery popup + + + 21 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-28502" new enable=Yes Enable File Sharing - 20 - cmd /C echo 20.20.20.1 host.lan >> %WINDIR%\system32\drivers\etc\hosts - Add entry in hosts file + 22 + cmd /C mklink /d %userprofile%\Desktop\Shared \\host.lan\Data + Create desktop shortcut to shared folder - 21 + 23 cmd /C if exist "C:\OEM\install.bat" start "Install" "cmd /C C:\OEM\install.bat" Execute custom script from the OEM folder if exists diff --git a/assets/win2022.xml b/assets/win2022.xml index 2cdfb86..eac9414 100644 --- a/assets/win2022.xml +++ b/assets/win2022.xml @@ -243,11 +243,6 @@ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "AllowInsecureGuestAuth" /t REG_DWORD /d 1 /f Allow guest access to network shares - - 2 - reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f - Allow RDP login with blank password - 3 reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device" /v "DevicePasswordLessBuildVersion" /t REG_DWORD /d 0 /f @@ -296,50 +291,60 @@ 12 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v "fAllowUnlistedRemotePrograms" /t REG_DWORD /d 1 /f - Enable RemoteAPP to launch unlisted programs + Enable RemoteApp to launch unlisted programs 13 + reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList" /v "fDisabledAllowList" /t REG_DWORD /d 1 /f + Disable RemoteApp allowlist + + + 14 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Search" /v "SearchboxTaskbarMode" /t REG_DWORD /d 0 /f Remove Search from the Taskbar - 14 + 15 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "ShowTaskViewButton" /t REG_DWORD /d 0 /f Remove Task View from the Taskbar - 15 + 16 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarDa" /t REG_DWORD /d 0 /f Remove Widgets from the Taskbar - 16 + 17 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarMn" /t REG_DWORD /d 0 /f Remove Chat from the Taskbar - 17 + 18 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v "NoAutoUpdate" /t REG_DWORD /d 1 /f Turn off Windows Update auto download - 18 + 19 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-32752" new enable=Yes Enable Network Discovery - 19 + 20 + reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Network\NewNetworkWindowOff" /f + Disable Network Discovery popup + + + 21 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-28502" new enable=Yes Enable File Sharing - 20 - cmd /C echo 20.20.20.1 host.lan >> %WINDIR%\system32\drivers\etc\hosts - Add entry in hosts file + 22 + cmd /C mklink /d %userprofile%\Desktop\Shared \\host.lan\Data + Create desktop shortcut to shared folder - 21 + 23 cmd /C if exist "C:\OEM\install.bat" start "Install" "cmd /C C:\OEM\install.bat" Execute custom script from the OEM folder if exists diff --git a/assets/win2025-eval.xml b/assets/win2025-eval.xml index 52303b5..5b92f00 100644 --- a/assets/win2025-eval.xml +++ b/assets/win2025-eval.xml @@ -250,11 +250,6 @@ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "RequireSecuritySignature" /t REG_DWORD /d 0 /f Disable SMB signing requirement - - 3 - reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f - Allow RDP login with blank password - 4 reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device" /v "DevicePasswordLessBuildVersion" /t REG_DWORD /d 0 /f @@ -262,7 +257,7 @@ 5 - cmd /C wmic useraccount where name="Docker" set PasswordExpires=false + powershell.exe -ExecutionPolicy Unrestricted -NoLogo -NoProfile -NonInteractive set-localuser -name "Docker" -passwordneverexpires 1 Password Never Expires @@ -282,76 +277,81 @@ 9 + reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "ShowCopilotButton" /t REG_DWORD /d 0 /f + Hide Copilot button + + + 10 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "HideFileExt" /t REG_DWORD /d 0 /f Show file extensions in Explorer - 10 + 11 reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Power" /v "HibernateFileSizePercent" /t REG_DWORD /d 0 /f Zero Hibernation File - 11 + 12 reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Power" /v "HibernateEnabled" /t REG_DWORD /d 0 /f Disable Hibernation - 12 + 13 cmd /C POWERCFG -X -standby-timeout-ac 0 Disable Sleep - 13 + 14 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v "fAllowUnlistedRemotePrograms" /t REG_DWORD /d 1 /f Enable RemoteAPP to launch unlisted programs - 14 - reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Search" /v "SearchboxTaskbarMode" /t REG_DWORD /d 0 /f - Remove Search from the Taskbar + 15 + reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList" /v "fDisabledAllowList" /t REG_DWORD /d 1 /f + Disable RemoteApp allowlist - 15 + 16 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "ShowTaskViewButton" /t REG_DWORD /d 0 /f Remove Task View from the Taskbar - 16 + 17 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarDa" /t REG_DWORD /d 0 /f Remove Widgets from the Taskbar - 17 + 18 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarMn" /t REG_DWORD /d 0 /f Remove Chat from the Taskbar - 18 + 19 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v "NoAutoUpdate" /t REG_DWORD /d 1 /f Turn off Windows Update auto download - 19 + 20 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-32752" new enable=Yes Enable Network Discovery - 20 + 21 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-28502" new enable=Yes Enable File Sharing - 21 + 22 cmd /C rd /q C:\Windows.old Remove empty Windows.old folder - 22 - cmd /C echo 20.20.20.1 host.lan >> %WINDIR%\system32\drivers\etc\hosts - Add entry in hosts file + 23 + cmd /C mklink /d %userprofile%\Desktop\Shared \\host.lan\Data + Create desktop shortcut to shared folder - 23 + 24 cmd /C if exist "C:\OEM\install.bat" start "Install" "cmd /C C:\OEM\install.bat" Execute custom script from the OEM folder if exists diff --git a/assets/win2025.xml b/assets/win2025.xml index bef8e3f..2796db6 100644 --- a/assets/win2025.xml +++ b/assets/win2025.xml @@ -253,11 +253,6 @@ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "RequireSecuritySignature" /t REG_DWORD /d 0 /f Disable SMB signing requirement - - 3 - reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f - Allow RDP login with blank password - 4 reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device" /v "DevicePasswordLessBuildVersion" /t REG_DWORD /d 0 /f @@ -265,7 +260,7 @@ 5 - cmd /C wmic useraccount where name="Docker" set PasswordExpires=false + powershell.exe -ExecutionPolicy Unrestricted -NoLogo -NoProfile -NonInteractive set-localuser -name "Docker" -passwordneverexpires 1 Password Never Expires @@ -285,76 +280,81 @@ 9 + reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "ShowCopilotButton" /t REG_DWORD /d 0 /f + Hide Copilot button + + + 10 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "HideFileExt" /t REG_DWORD /d 0 /f Show file extensions in Explorer - 10 + 11 reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Power" /v "HibernateFileSizePercent" /t REG_DWORD /d 0 /f Zero Hibernation File - 11 + 12 reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Power" /v "HibernateEnabled" /t REG_DWORD /d 0 /f Disable Hibernation - 12 + 13 cmd /C POWERCFG -X -standby-timeout-ac 0 Disable Sleep - 13 + 14 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v "fAllowUnlistedRemotePrograms" /t REG_DWORD /d 1 /f Enable RemoteAPP to launch unlisted programs - 14 - reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Search" /v "SearchboxTaskbarMode" /t REG_DWORD /d 0 /f - Remove Search from the Taskbar + 15 + reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList" /v "fDisabledAllowList" /t REG_DWORD /d 1 /f + Disable RemoteApp allowlist - 15 + 16 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "ShowTaskViewButton" /t REG_DWORD /d 0 /f Remove Task View from the Taskbar - 16 + 17 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarDa" /t REG_DWORD /d 0 /f Remove Widgets from the Taskbar - 17 + 18 reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarMn" /t REG_DWORD /d 0 /f Remove Chat from the Taskbar - 18 + 19 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v "NoAutoUpdate" /t REG_DWORD /d 1 /f Turn off Windows Update auto download - 19 + 20 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-32752" new enable=Yes Enable Network Discovery - 20 + 21 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-28502" new enable=Yes Enable File Sharing - 21 + 22 cmd /C rd /q C:\Windows.old Remove empty Windows.old folder - 22 - cmd /C echo 20.20.20.1 host.lan >> %WINDIR%\system32\drivers\etc\hosts - Add entry in hosts file + 23 + cmd /C mklink /d %userprofile%\Desktop\Shared \\host.lan\Data + Create desktop shortcut to shared folder - 23 + 24 cmd /C if exist "C:\OEM\install.bat" start "Install" "cmd /C C:\OEM\install.bat" Execute custom script from the OEM folder if exists diff --git a/assets/win7x64-enterprise-eval.xml b/assets/win7x64-enterprise-eval.xml index 4b7ce48..c3cc15b 100644 --- a/assets/win7x64-enterprise-eval.xml +++ b/assets/win7x64-enterprise-eval.xml @@ -197,11 +197,6 @@ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "AllowInsecureGuestAuth" /t REG_DWORD /d 1 /f Allow guest access to network shares - - 2 - reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f - Allow RDP login with blank password - 3 cmd /C wmic useraccount where name="Docker" set PasswordExpires=false @@ -274,9 +269,9 @@ 17 - cmd /C echo 20.20.20.1 host.lan >> %WINDIR%\system32\drivers\etc\hosts - Add entry in hosts file - + cmd /C mklink /d %userprofile%\Desktop\Shared \\host.lan\Data + Create desktop shortcut to shared folder + 18 cmd /C if exist "C:\OEM\install.bat" start "Install" "cmd /C C:\OEM\install.bat" diff --git a/assets/win7x64-enterprise.xml b/assets/win7x64-enterprise.xml index f64a076..b362a9f 100644 --- a/assets/win7x64-enterprise.xml +++ b/assets/win7x64-enterprise.xml @@ -201,11 +201,6 @@ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "AllowInsecureGuestAuth" /t REG_DWORD /d 1 /f Allow guest access to network shares - - 2 - reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f - Allow RDP login with blank password - 3 cmd /C wmic useraccount where name="Docker" set PasswordExpires=false @@ -278,9 +273,9 @@ 17 - cmd /C echo 20.20.20.1 host.lan >> %WINDIR%\system32\drivers\etc\hosts - Add entry in hosts file - + cmd /C mklink /d %userprofile%\Desktop\Shared \\host.lan\Data + Create desktop shortcut to shared folder + 18 cmd /C if exist "C:\OEM\install.bat" start "Install" "cmd /C C:\OEM\install.bat" diff --git a/assets/win7x64-ultimate.xml b/assets/win7x64-ultimate.xml index aa8117d..2ee085a 100644 --- a/assets/win7x64-ultimate.xml +++ b/assets/win7x64-ultimate.xml @@ -201,11 +201,6 @@ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "AllowInsecureGuestAuth" /t REG_DWORD /d 1 /f Allow guest access to network shares - - 2 - reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f - Allow RDP login with blank password - 3 cmd /C wmic useraccount where name="Docker" set PasswordExpires=false @@ -278,9 +273,9 @@ 17 - cmd /C echo 20.20.20.1 host.lan >> %WINDIR%\system32\drivers\etc\hosts - Add entry in hosts file - + cmd /C mklink /d %userprofile%\Desktop\Shared \\host.lan\Data + Create desktop shortcut to shared folder + 18 cmd /C if exist "C:\OEM\install.bat" start "Install" "cmd /C C:\OEM\install.bat" diff --git a/assets/win7x64.xml b/assets/win7x64.xml index f0056e2..3769dfd 100644 --- a/assets/win7x64.xml +++ b/assets/win7x64.xml @@ -201,11 +201,6 @@ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "AllowInsecureGuestAuth" /t REG_DWORD /d 1 /f Allow guest access to network shares - - 2 - reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f - Allow RDP login with blank password - 3 cmd /C wmic useraccount where name="Docker" set PasswordExpires=false @@ -278,9 +273,9 @@ 17 - cmd /C echo 20.20.20.1 host.lan >> %WINDIR%\system32\drivers\etc\hosts - Add entry in hosts file - + cmd /C mklink /d %userprofile%\Desktop\Shared \\host.lan\Data + Create desktop shortcut to shared folder + 18 cmd /C if exist "C:\OEM\install.bat" start "Install" "cmd /C C:\OEM\install.bat" diff --git a/assets/win7x86-enterprise.xml b/assets/win7x86-enterprise.xml index acf676f..7ac8ef0 100644 --- a/assets/win7x86-enterprise.xml +++ b/assets/win7x86-enterprise.xml @@ -201,11 +201,6 @@ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "AllowInsecureGuestAuth" /t REG_DWORD /d 1 /f Allow guest access to network shares - - 2 - reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f - Allow RDP login with blank password - 3 cmd /C wmic useraccount where name="Docker" set PasswordExpires=false @@ -278,9 +273,9 @@ 17 - cmd /C echo 20.20.20.1 host.lan >> %WINDIR%\system32\drivers\etc\hosts - Add entry in hosts file - + cmd /C mklink /d %userprofile%\Desktop\Shared \\host.lan\Data + Create desktop shortcut to shared folder + 18 cmd /C if exist "C:\OEM\install.bat" start "Install" "cmd /C C:\OEM\install.bat" diff --git a/assets/win7x86-ultimate.xml b/assets/win7x86-ultimate.xml index c6beb01..419a508 100644 --- a/assets/win7x86-ultimate.xml +++ b/assets/win7x86-ultimate.xml @@ -201,11 +201,6 @@ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "AllowInsecureGuestAuth" /t REG_DWORD /d 1 /f Allow guest access to network shares - - 2 - reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f - Allow RDP login with blank password - 3 cmd /C wmic useraccount where name="Docker" set PasswordExpires=false @@ -278,9 +273,9 @@ 17 - cmd /C echo 20.20.20.1 host.lan >> %WINDIR%\system32\drivers\etc\hosts - Add entry in hosts file - + cmd /C mklink /d %userprofile%\Desktop\Shared \\host.lan\Data + Create desktop shortcut to shared folder + 18 cmd /C if exist "C:\OEM\install.bat" start "Install" "cmd /C C:\OEM\install.bat" diff --git a/assets/win7x86.xml b/assets/win7x86.xml index 74a9064..bae5a8f 100644 --- a/assets/win7x86.xml +++ b/assets/win7x86.xml @@ -201,11 +201,6 @@ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "AllowInsecureGuestAuth" /t REG_DWORD /d 1 /f Allow guest access to network shares - - 2 - reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f - Allow RDP login with blank password - 3 cmd /C wmic useraccount where name="Docker" set PasswordExpires=false @@ -278,9 +273,9 @@ 17 - cmd /C echo 20.20.20.1 host.lan >> %WINDIR%\system32\drivers\etc\hosts - Add entry in hosts file - + cmd /C mklink /d %userprofile%\Desktop\Shared \\host.lan\Data + Create desktop shortcut to shared folder + 18 cmd /C if exist "C:\OEM\install.bat" start "Install" "cmd /C C:\OEM\install.bat" diff --git a/assets/win81x64-enterprise-eval.xml b/assets/win81x64-enterprise-eval.xml index 7aee42a..745fd9d 100644 --- a/assets/win81x64-enterprise-eval.xml +++ b/assets/win81x64-enterprise-eval.xml @@ -221,11 +221,6 @@ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "AllowInsecureGuestAuth" /t REG_DWORD /d 1 /f Allow guest access to network shares - - 2 - reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f - Allow RDP login with blank password - 3 reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device" /v "DevicePasswordLessBuildVersion" /t REG_DWORD /d 0 /f @@ -274,30 +269,40 @@ 12 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v "fAllowUnlistedRemotePrograms" /t REG_DWORD /d 1 /f - Enable RemoteAPP to launch unlisted programs + Enable RemoteApp to launch unlisted programs 13 + reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList" /v "fDisabledAllowList" /t REG_DWORD /d 1 /f + Disable RemoteApp allowlist + + + 14 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v "NoAutoUpdate" /t REG_DWORD /d 1 /f Turn off Windows Update auto download - 14 + 15 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-32752" new enable=Yes Enable Network Discovery - 15 + 16 + reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Network\NewNetworkWindowOff" /f + Disable Network Discovery popup + + + 17 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-28502" new enable=Yes Enable File Sharing - 16 - cmd /C echo 20.20.20.1 host.lan >> %WINDIR%\system32\drivers\etc\hosts - Add entry in hosts file + 18 + cmd /C mklink /d %userprofile%\Desktop\Shared \\host.lan\Data + Create desktop shortcut to shared folder - 17 + 19 cmd /C if exist "C:\OEM\install.bat" start "Install" "cmd /C C:\OEM\install.bat" Execute custom script from the OEM folder if exists diff --git a/assets/win81x64-enterprise.xml b/assets/win81x64-enterprise.xml index d2d49fc..a073c38 100644 --- a/assets/win81x64-enterprise.xml +++ b/assets/win81x64-enterprise.xml @@ -224,11 +224,6 @@ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "AllowInsecureGuestAuth" /t REG_DWORD /d 1 /f Allow guest access to network shares - - 2 - reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f - Allow RDP login with blank password - 3 reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device" /v "DevicePasswordLessBuildVersion" /t REG_DWORD /d 0 /f @@ -277,30 +272,40 @@ 12 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v "fAllowUnlistedRemotePrograms" /t REG_DWORD /d 1 /f - Enable RemoteAPP to launch unlisted programs + Enable RemoteApp to launch unlisted programs 13 + reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList" /v "fDisabledAllowList" /t REG_DWORD /d 1 /f + Disable RemoteApp allowlist + + + 14 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v "NoAutoUpdate" /t REG_DWORD /d 1 /f Turn off Windows Update auto download - 14 + 15 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-32752" new enable=Yes Enable Network Discovery - 15 + 16 + reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Network\NewNetworkWindowOff" /f + Disable Network Discovery popup + + + 17 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-28502" new enable=Yes Enable File Sharing - 16 - cmd /C echo 20.20.20.1 host.lan >> %WINDIR%\system32\drivers\etc\hosts - Add entry in hosts file + 18 + cmd /C mklink /d %userprofile%\Desktop\Shared \\host.lan\Data + Create desktop shortcut to shared folder - 17 + 19 cmd /C if exist "C:\OEM\install.bat" start "Install" "cmd /C C:\OEM\install.bat" Execute custom script from the OEM folder if exists diff --git a/assets/win81x64.xml b/assets/win81x64.xml index d4b9d5c..6b45785 100644 --- a/assets/win81x64.xml +++ b/assets/win81x64.xml @@ -231,11 +231,6 @@ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "AllowInsecureGuestAuth" /t REG_DWORD /d 1 /f Allow guest access to network shares - - 2 - reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f - Allow RDP login with blank password - 3 reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device" /v "DevicePasswordLessBuildVersion" /t REG_DWORD /d 0 /f @@ -284,30 +279,40 @@ 12 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v "fAllowUnlistedRemotePrograms" /t REG_DWORD /d 1 /f - Enable RemoteAPP to launch unlisted programs + Enable RemoteApp to launch unlisted programs 13 + reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList" /v "fDisabledAllowList" /t REG_DWORD /d 1 /f + Disable RemoteApp allowlist + + + 14 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v "NoAutoUpdate" /t REG_DWORD /d 1 /f Turn off Windows Update auto download - 14 + 15 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-32752" new enable=Yes Enable Network Discovery - 15 + 16 + reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Network\NewNetworkWindowOff" /f + Disable Network Discovery popup + + + 17 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-28502" new enable=Yes Enable File Sharing - 16 - cmd /C echo 20.20.20.1 host.lan >> %WINDIR%\system32\drivers\etc\hosts - Add entry in hosts file + 18 + cmd /C mklink /d %userprofile%\Desktop\Shared \\host.lan\Data + Create desktop shortcut to shared folder - 17 + 19 cmd /C if exist "C:\OEM\install.bat" start "Install" "cmd /C C:\OEM\install.bat" Execute custom script from the OEM folder if exists diff --git a/assets/winvistax64-enterprise.xml b/assets/winvistax64-enterprise.xml index 04a3f5b..a3dac19 100644 --- a/assets/winvistax64-enterprise.xml +++ b/assets/winvistax64-enterprise.xml @@ -150,11 +150,6 @@ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "AllowInsecureGuestAuth" /t REG_DWORD /d 1 /f Allow guest access to network shares - - 2 - reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f - Allow RDP login with blank password - 3 cmd /C wmic useraccount where name="Docker" set PasswordExpires=false @@ -238,25 +233,30 @@ 19 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v "fAllowUnlistedRemotePrograms" /t REG_DWORD /d 1 /f - Enable RemoteAPP to launch unlisted programs + Enable RemoteApp to launch unlisted programs 20 + reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList" /v "fDisabledAllowList" /t REG_DWORD /d 1 /f + Disable RemoteApp allowlist + + + 21 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-32752" new enable=Yes Enable Network Discovery - 21 + 22 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-28502" new enable=Yes Enable File Sharing - 22 - cmd /C echo 20.20.20.1 host.lan >> %WINDIR%\system32\drivers\etc\hosts - Add entry in hosts file + 23 + cmd /C mklink /d %userprofile%\Desktop\Shared \\host.lan\Data + Create desktop shortcut to shared folder - 23 + 24 cmd /C if exist "C:\OEM\install.bat" start "Install" "cmd /C C:\OEM\install.bat" Execute custom script from the OEM folder if exists diff --git a/assets/winvistax64-ultimate.xml b/assets/winvistax64-ultimate.xml index a391a96..eb12e60 100644 --- a/assets/winvistax64-ultimate.xml +++ b/assets/winvistax64-ultimate.xml @@ -150,11 +150,6 @@ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "AllowInsecureGuestAuth" /t REG_DWORD /d 1 /f Allow guest access to network shares - - 2 - reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f - Allow RDP login with blank password - 3 cmd /C wmic useraccount where name="Docker" set PasswordExpires=false @@ -238,25 +233,30 @@ 19 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v "fAllowUnlistedRemotePrograms" /t REG_DWORD /d 1 /f - Enable RemoteAPP to launch unlisted programs + Enable RemoteApp to launch unlisted programs 20 + reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList" /v "fDisabledAllowList" /t REG_DWORD /d 1 /f + Disable RemoteApp allowlist + + + 21 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-32752" new enable=Yes Enable Network Discovery - 21 + 22 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-28502" new enable=Yes Enable File Sharing - 22 - cmd /C echo 20.20.20.1 host.lan >> %WINDIR%\system32\drivers\etc\hosts - Add entry in hosts file + 23 + cmd /C mklink /d %userprofile%\Desktop\Shared \\host.lan\Data + Create desktop shortcut to shared folder - 23 + 24 cmd /C if exist "C:\OEM\install.bat" start "Install" "cmd /C C:\OEM\install.bat" Execute custom script from the OEM folder if exists diff --git a/assets/winvistax64.xml b/assets/winvistax64.xml index a2fda33..ad2ac70 100644 --- a/assets/winvistax64.xml +++ b/assets/winvistax64.xml @@ -150,11 +150,6 @@ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "AllowInsecureGuestAuth" /t REG_DWORD /d 1 /f Allow guest access to network shares - - 2 - reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f - Allow RDP login with blank password - 3 cmd /C wmic useraccount where name="Docker" set PasswordExpires=false @@ -238,25 +233,30 @@ 19 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v "fAllowUnlistedRemotePrograms" /t REG_DWORD /d 1 /f - Enable RemoteAPP to launch unlisted programs + Enable RemoteApp to launch unlisted programs 20 + reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList" /v "fDisabledAllowList" /t REG_DWORD /d 1 /f + Disable RemoteApp allowlist + + + 21 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-32752" new enable=Yes Enable Network Discovery - 21 + 22 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-28502" new enable=Yes Enable File Sharing - 22 - cmd /C echo 20.20.20.1 host.lan >> %WINDIR%\system32\drivers\etc\hosts - Add entry in hosts file + 23 + cmd /C mklink /d %userprofile%\Desktop\Shared \\host.lan\Data + Create desktop shortcut to shared folder - 23 + 24 cmd /C if exist "C:\OEM\install.bat" start "Install" "cmd /C C:\OEM\install.bat" Execute custom script from the OEM folder if exists diff --git a/assets/winvistax86-enterprise.xml b/assets/winvistax86-enterprise.xml index 2dc58fa..5092331 100644 --- a/assets/winvistax86-enterprise.xml +++ b/assets/winvistax86-enterprise.xml @@ -150,11 +150,6 @@ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "AllowInsecureGuestAuth" /t REG_DWORD /d 1 /f Allow guest access to network shares - - 2 - reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f - Allow RDP login with blank password - 3 cmd /C wmic useraccount where name="Docker" set PasswordExpires=false @@ -238,25 +233,30 @@ 19 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v "fAllowUnlistedRemotePrograms" /t REG_DWORD /d 1 /f - Enable RemoteAPP to launch unlisted programs + Enable RemoteApp to launch unlisted programs 20 + reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList" /v "fDisabledAllowList" /t REG_DWORD /d 1 /f + Disable RemoteApp allowlist + + + 21 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-32752" new enable=Yes Enable Network Discovery - 21 + 22 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-28502" new enable=Yes Enable File Sharing - 22 - cmd /C echo 20.20.20.1 host.lan >> %WINDIR%\system32\drivers\etc\hosts - Add entry in hosts file + 23 + cmd /C mklink /d %userprofile%\Desktop\Shared \\host.lan\Data + Create desktop shortcut to shared folder - 23 + 24 cmd /C if exist "C:\OEM\install.bat" start "Install" "cmd /C C:\OEM\install.bat" Execute custom script from the OEM folder if exists diff --git a/assets/winvistax86-ultimate.xml b/assets/winvistax86-ultimate.xml index b7d35cc..97ad23e 100644 --- a/assets/winvistax86-ultimate.xml +++ b/assets/winvistax86-ultimate.xml @@ -150,11 +150,6 @@ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "AllowInsecureGuestAuth" /t REG_DWORD /d 1 /f Allow guest access to network shares - - 2 - reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f - Allow RDP login with blank password - 3 cmd /C wmic useraccount where name="Docker" set PasswordExpires=false @@ -238,25 +233,30 @@ 19 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v "fAllowUnlistedRemotePrograms" /t REG_DWORD /d 1 /f - Enable RemoteAPP to launch unlisted programs + Enable RemoteApp to launch unlisted programs 20 + reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList" /v "fDisabledAllowList" /t REG_DWORD /d 1 /f + Disable RemoteApp allowlist + + + 21 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-32752" new enable=Yes Enable Network Discovery - 21 + 22 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-28502" new enable=Yes Enable File Sharing - 22 - cmd /C echo 20.20.20.1 host.lan >> %WINDIR%\system32\drivers\etc\hosts - Add entry in hosts file + 23 + cmd /C mklink /d %userprofile%\Desktop\Shared \\host.lan\Data + Create desktop shortcut to shared folder - 23 + 24 cmd /C if exist "C:\OEM\install.bat" start "Install" "cmd /C C:\OEM\install.bat" Execute custom script from the OEM folder if exists diff --git a/assets/winvistax86.xml b/assets/winvistax86.xml index 3bec2e6..ade1942 100644 --- a/assets/winvistax86.xml +++ b/assets/winvistax86.xml @@ -150,11 +150,6 @@ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "AllowInsecureGuestAuth" /t REG_DWORD /d 1 /f Allow guest access to network shares - - 2 - reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f - Allow RDP login with blank password - 3 cmd /C wmic useraccount where name="Docker" set PasswordExpires=false @@ -238,25 +233,30 @@ 19 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v "fAllowUnlistedRemotePrograms" /t REG_DWORD /d 1 /f - Enable RemoteAPP to launch unlisted programs + Enable RemoteApp to launch unlisted programs 20 + reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList" /v "fDisabledAllowList" /t REG_DWORD /d 1 /f + Disable RemoteApp allowlist + + + 21 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-32752" new enable=Yes Enable Network Discovery - 21 + 22 netsh advfirewall firewall set rule group="@FirewallAPI.dll,-28502" new enable=Yes Enable File Sharing - 22 - cmd /C echo 20.20.20.1 host.lan >> %WINDIR%\system32\drivers\etc\hosts - Add entry in hosts file + 23 + cmd /C mklink /d %userprofile%\Desktop\Shared \\host.lan\Data + Create desktop shortcut to shared folder - 23 + 24 cmd /C if exist "C:\OEM\install.bat" start "Install" "cmd /C C:\OEM\install.bat" Execute custom script from the OEM folder if exists diff --git a/readme.md b/readme.md index f3ce933..adbb6bf 100644 --- a/readme.md +++ b/readme.md @@ -53,7 +53,7 @@ services: ##### Via Docker CLI: ```bash -docker run -it --rm --name windows -p 8006:8006 --device=/dev/kvm --device=/dev/net/tun --cap-add NET_ADMIN -v ${PWD:-.}/windows:/storage --stop-timeout 120 dockurr/windows +docker run -it --rm --name windows -e "VERSION=11" -p 8006:8006 --device=/dev/kvm --device=/dev/net/tun --cap-add NET_ADMIN -v "${PWD:-.}/windows:/storage" --stop-timeout 120 docker.io/dockurr/windows ``` ##### Via Kubernetes: @@ -66,6 +66,10 @@ kubectl apply -f https://raw.githubusercontent.com/dockur/windows/refs/heads/mas [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/dockur/windows) +##### Via a graphical installer: + +[![Download WinBoat](https://github.com/dockur/windows/raw/master/.github/winboat.png)](https://winboat.app) + ## FAQ 💬 ### How do I use it? @@ -91,28 +95,29 @@ kubectl apply -f https://raw.githubusercontent.com/dockur/windows/refs/heads/mas Select from the values below: - | **Value** | **Version** | **Size** | + | **Value** | **Version** | **Size** | |---|---|---| - | `11` | Windows 11 Pro | 5.4 GB | - | `11l` | Windows 11 LTSC | 4.7 GB | - | `11e` | Windows 11 Enterprise | 4.0 GB | + | `11` | Windows 11 Pro | 7.2 GB | + | `11l` | Windows 11 LTSC | 4.7 GB | + | `11e` | Windows 11 Enterprise | 6.6 GB | |||| - | `10` | Windows 10 Pro | 5.7 GB | - | `10l` | Windows 10 LTSC | 4.6 GB | - | `10e` | Windows 10 Enterprise | 5.2 GB | + | `10` | Windows 10 Pro | 5.7 GB | + | `10l` | Windows 10 LTSC | 4.6 GB | + | `10e` | Windows 10 Enterprise | 5.2 GB | |||| - | `8e` | Windows 8.1 Enterprise | 3.7 GB | - | `7e` | Windows 7 Enterprise | 3.0 GB | - | `ve` | Windows Vista Enterprise | 3.0 GB | - | `xp` | Windows XP Professional | 0.6 GB | - |||| - | `2025` | Windows Server 2025 | 5.6 GB | - | `2022` | Windows Server 2022 | 4.7 GB | - | `2019` | Windows Server 2019 | 5.3 GB | - | `2016` | Windows Server 2016 | 6.5 GB | - | `2012` | Windows Server 2012 | 4.3 GB | - | `2008` | Windows Server 2008 | 3.0 GB | - | `2003` | Windows Server 2003 | 0.6 GB | + | `8e` | Windows 8.1 Enterprise | 3.7 GB | + | `7u` | Windows 7 Ultimate | 3.1 GB | + | `vu` | Windows Vista Ultimate | 3.0 GB | + | `xp` | Windows XP Professional | 0.6 GB | + | `2k` | Windows 2000 Professional | 0.4 GB | + |||| + | `2025` | Windows Server 2025 | 6.7 GB | + | `2022` | Windows Server 2022 | 6.0 GB | + | `2019` | Windows Server 2019 | 5.3 GB | + | `2016` | Windows Server 2016 | 6.5 GB | + | `2012` | Windows Server 2012 | 4.3 GB | + | `2008` | Windows Server 2008 | 3.0 GB | + | `2003` | Windows Server 2003 | 0.6 GB | > [!TIP] > To install ARM64 versions of Windows use [dockur/windows-arm](https://github.com/dockur/windows-arm/). @@ -138,27 +143,24 @@ kubectl apply -f https://raw.githubusercontent.com/dockur/windows/refs/heads/mas ``` > [!TIP] -> This can also be used to resize the existing disk to a larger capacity without any data loss. +> This can also be used to resize the existing disk to a larger capacity without any data loss. However you will need to [manually extend the disk partition](https://learn.microsoft.com/en-us/windows-server/storage/disk-management/extend-a-basic-volume?tabs=disk-management) since the added disk space will appear as unallocated. ### How do I share files with the host? - Open 'File Explorer' and click on the 'Network' section, you will see a computer called `host.lan`. + After installation there will be a folder called `Shared` on your desktop, which can be used to exchange files with the host machine. - Double-click it and it will show a folder called `Data`, which can be bound to any folder on your host via the compose file: + To select a folder on the host for this purpose, include the following bind mount in your compose file: ```yaml volumes: - - ./example:/data + - ./example:/shared ``` - The example folder `./example` will be available as ` \\host.lan\Data`. - -> [!TIP] -> You can map this path to a drive letter in Windows, for easier access. + Replace the example path `./example` with your desired shared folder, which then will become visible as `Shared`. ### How do I change the amount of CPU or RAM? - By default, the container will be allowed to use a maximum of 2 CPU cores and 4 GB of RAM. + By default, Windows will be allowed to use 2 CPU cores and 4 GB of RAM. If you want to adjust this, you can specify the desired amount using the following environment variables: @@ -170,9 +172,9 @@ kubectl apply -f https://raw.githubusercontent.com/dockur/windows/refs/heads/mas ### How do I configure the username and password? - By default, a user called `Docker` (with an empty password) is created during installation. + By default, a user called `Docker` is created and its password is `admin`. - If you want to use different credentials, you can configure them in your compose file (only before installation): + If you want to use different credentials during installation, you can configure them in your compose file: ```yaml environment: @@ -184,7 +186,7 @@ kubectl apply -f https://raw.githubusercontent.com/dockur/windows/refs/heads/mas By default, the English version of Windows will be downloaded. - But before installation you can add the `LANGUAGE` environment variable to your compose file, in order to specify an alternative language: + But you can add the `LANGUAGE` environment variable to your compose file, in order to specify an alternative language to be downloaded: ```yaml environment: @@ -195,7 +197,7 @@ kubectl apply -f https://raw.githubusercontent.com/dockur/windows/refs/heads/mas ### How do I select the keyboard layout? - If you want to use a keyboard layout or locale that is not the default for your selected language, you can add `KEYBOARD` and `REGION` variables like this (before installation): + If you want to use a keyboard layout or locale that is not the default for your selected language, you can add `KEYBOARD` and `REGION` variables like this: ```yaml environment: @@ -203,15 +205,6 @@ kubectl apply -f https://raw.githubusercontent.com/dockur/windows/refs/heads/mas KEYBOARD: "en-US" ``` -### How do I select the edition? - - Windows Server offers a minimalistic Core edition without a GUI. To select those non-standard editions, you can add a `EDITION` variable like this (before installation): - - ```yaml - environment: - EDITION: "core" - ``` - ### How do I install a custom image? In order to download an unsupported ISO image, specify its URL in the `VERSION` environment variable: @@ -225,7 +218,7 @@ kubectl apply -f https://raw.githubusercontent.com/dockur/windows/refs/heads/mas ```yaml volumes: - - ./example.iso:/custom.iso + - ./example.iso:/boot.iso ``` Replace the example path `./example.iso` with the filename of your desired ISO file. The value of `VERSION` will be ignored in this case. @@ -258,7 +251,7 @@ kubectl apply -f https://raw.githubusercontent.com/dockur/windows/refs/heads/mas The web-viewer is mainly meant to be used during installation, as its picture quality is low, and it has no audio or clipboard for example. - So for a better experience you can connect using any Microsoft Remote Desktop client to the IP of the container, using the username `Docker` and by leaving the password empty. + So for a better experience you can connect using any Microsoft Remote Desktop client to the IP of the container, using the username `Docker` and password `admin`. There is a RDP client for [Android](https://play.google.com/store/apps/details?id=com.microsoft.rdc.androidx) available from the Play Store and one for [iOS](https://apps.apple.com/nl/app/microsoft-remote-desktop/id714464092?l=en-GB) in the Apple Store. For Linux you can use [FreeRDP](https://www.freerdp.com/) and on Windows just type `mstsc` in the search box. @@ -392,9 +385,6 @@ kubectl apply -f https://raw.githubusercontent.com/dockur/windows/refs/heads/mas Yes, this project contains only open-source code and does not distribute any copyrighted material. Any product keys found in the code are just generic placeholders provided by Microsoft for trial purposes. So under all applicable laws, this project will be considered legal. -## Stars 🌟 -[![Stars](https://starchart.cc/dockur/windows.svg?variant=adaptive)](https://starchart.cc/dockur/windows) - ## Disclaimer ⚖️ *The product names, logos, brands, and other trademarks referred to within this project are the property of their respective trademark holders. This project is not affiliated, sponsored, or endorsed by Microsoft Corporation.* diff --git a/src/define.sh b/src/define.sh index 33dabe7..3db2069 100644 --- a/src/define.sh +++ b/src/define.sh @@ -16,7 +16,7 @@ set -Eeuo pipefail : "${USERNAME:=""}" : "${PASSWORD:=""}" -MIRRORS=3 +MIRRORS=4 parseVersion() { @@ -24,6 +24,7 @@ parseVersion() { VERSION="${VERSION:1:-1}" fi + VERSION=$(expr "$VERSION" : "^\ *\(.*[^ ]\)\ *$") [ -z "$VERSION" ] && VERSION="win11" case "${VERSION,,}" in @@ -33,11 +34,11 @@ parseVersion() { "11e" | "win11e" | "windows11e" | "windows 11e" ) VERSION="win11x64-enterprise-eval" ;; - "11i" | "11iot" | "iot11" | "win11i" | "win11-iot" | "win11x64-iot" | "win11x64-enterprise-iot-eval" ) + "11i" | "11iot" | "iot11" | "win11i" | "win11-iot" | "win11x64-iot" ) VERSION="win11x64-enterprise-iot-eval" [ -z "$DETECTED" ] && DETECTED="win11x64-iot" ;; - "11l" | "11ltsc" | "ltsc11" | "win11l" | "win11-ltsc" | "win11x64-ltsc" | "win11x64-enterprise-ltsc-eval" ) + "11l" | "11ltsc" | "ltsc11" | "win11l" | "win11-ltsc" | "win11x64-ltsc" ) VERSION="win11x64-enterprise-ltsc-eval" [ -z "$DETECTED" ] && DETECTED="win11x64-ltsc" ;; @@ -47,11 +48,11 @@ parseVersion() { "10e" | "win10e" | "windows10e" | "windows 10e" ) VERSION="win10x64-enterprise-eval" ;; - "10i" | "10iot" | "iot10" | "win10i" | "win10-iot" | "win10x64-iot" | "win10x64-enterprise-iot-eval" ) + "10i" | "10iot" | "iot10" | "win10i" | "win10-iot" | "win10x64-iot" ) VERSION="win10x64-enterprise-iot-eval" [ -z "$DETECTED" ] && DETECTED="win10x64-iot" ;; - "10l" | "10ltsc" | "ltsc10" | "win10l" | "win10-ltsc" | "win10x64-ltsc" | "win10x64-enterprise-ltsc-eval" ) + "10l" | "10ltsc" | "ltsc10" | "win10l" | "win10-ltsc" | "win10x64-ltsc" ) VERSION="win10x64-enterprise-ltsc-eval" [ -z "$DETECTED" ] && DETECTED="win10x64-ltsc" ;; @@ -61,27 +62,45 @@ parseVersion() { "8e" | "81e" | "8.1e" | "win8e" | "win81e" | "windows 8e" ) VERSION="win81x64-enterprise-eval" ;; - "7" | "7e" | "win7" | "win7e" | "windows7" | "windows 7" ) + "7" | "win7" | "windows7" | "windows 7" ) VERSION="win7x64" - [ -z "$DETECTED" ] && DETECTED="win7x64-enterprise-eval" + [ -z "$DETECTED" ] && DETECTED="win7x64-ultimate" ;; "7u" | "win7u" | "windows7u" | "windows 7u" ) VERSION="win7x64-ultimate" ;; - "7x86" | "win7x86" | "windows7x86" | "win7x86-enterprise" ) + "7e" | "win7e" | "windows7e" | "windows 7e" ) + VERSION="win7x64-enterprise" + ;; + "7x86" | "win7x86" | "win732" | "windows7x86" ) VERSION="win7x86" - [ -z "$DETECTED" ] && DETECTED="win7x86-enterprise" + [ -z "$DETECTED" ] && DETECTED="win7x86-ultimate" ;; - "vista" | "ve" | "6" | "winvista" | "windowsvista" | "windows vista" ) + "7ux86" | "7u32" | "win7x86-ultimate" ) + VERSION="win7x86-ultimate" + ;; + "7ex86" | "7e32" | "win7x86-enterprise" ) + VERSION="win7x86-enterprise" + ;; + "vista" | "vs" | "6" | "winvista" | "windowsvista" | "windows vista" ) VERSION="winvistax64" - [ -z "$DETECTED" ] && DETECTED="winvistax64-enterprise" + [ -z "$DETECTED" ] && DETECTED="winvistax64-ultimate" ;; - "vistu" | "vu" | "6u" | "winvistu" | "windowsvistu" | "windows vistu" ) + "vistu" | "vu" | "6u" | "winvistu" ) VERSION="winvistax64-ultimate" ;; - "vistax86" | "vex86" | "6x86" | "winvistax86" | "windowsvistax86" | "winvistax86-enterprise" ) + "viste" | "ve" | "6e" | "winviste" ) + VERSION="winvistax64-enterprise" + ;; + "vistax86" | "vista32" | "6x86" | "winvistax86" | "windowsvistax86" ) VERSION="winvistax86" - [ -z "$DETECTED" ] && DETECTED="winvistax86-enterprise" + [ -z "$DETECTED" ] && DETECTED="winvistax86-ultimate" + ;; + "vux86" | "vu32" | "winvistax86-ultimate" ) + VERSION="winvistax86-ultimate" + ;; + "vex86" | "ve32" | "winvistax86-enterprise" ) + VERSION="winvistax86-enterprise" ;; "xp" | "xp32" | "xpx86" | "5" | "5x86" | "winxp" | "winxp86" | "windowsxp" | "windows xp" ) VERSION="winxpx86" @@ -89,6 +108,9 @@ parseVersion() { "xp64" | "xpx64" | "5x64" | "winxp64" | "winxpx64" | "windowsxp64" | "windowsxpx64" ) VERSION="winxpx64" ;; + "2k" | "2000" | "win2k" | "win2000" | "windows2k" | "windows2000" ) + VERSION="win2kx86" + ;; "25" | "2025" | "win25" | "win2025" | "windows2025" | "windows 2025" ) VERSION="win2025-eval" ;; @@ -101,7 +123,7 @@ parseVersion() { "16" | "2016" | "win16" | "win2016" | "windows2016" | "windows 2016" ) VERSION="win2016-eval" ;; - "hv" | "hyperv" | "hyper v" | "hyper-v" | "19hv" | "2019hv" | "win2019hv") + "hv" | "hyperv" | "hyper v" | "hyper-v" | "19hv" | "2019hv" | "win2019hv" ) VERSION="win2019-hv" ;; "2012" | "2012r2" | "win2012" | "win2012r2" | "windows2012" | "windows 2012" ) @@ -113,6 +135,10 @@ parseVersion() { "2003" | "2003r2" | "win2003" | "win2003r2" | "windows2003" | "windows 2003" ) VERSION="win2003r2" ;; + "nano11" | "nano 11" ) + VERSION="nano11" + [ -z "$DETECTED" ] && DETECTED="win11x64" + ;; "core11" | "core 11" ) VERSION="core11" [ -z "$DETECTED" ] && DETECTED="win11x64" @@ -410,6 +436,7 @@ printVersion() { "tiny11"* ) desc="Tiny 11" ;; "tiny10"* ) desc="Tiny 10" ;; "core11"* ) desc="Core 11" ;; + "nano11"* ) desc="Nano 11" ;; "win7"* ) desc="Windows 7" ;; "win8"* ) desc="Windows 8" ;; "win10"* ) desc="Windows 10" ;; @@ -548,6 +575,9 @@ fromFile() { *"winvista"* | *"win_vista"* | *"windowsvista"* | *"windows_vista"* ) id="winvista${arch}" ;; + "nano11"* | "nano_11"* ) + id="nano11" + ;; "tiny11core"* | "tiny11_core"* | "tiny_11_core"* ) id="core11" ;; @@ -672,26 +702,9 @@ switchEdition() { local id="$1" - case "${id,,}" in - "win11${PLATFORM,,}-enterprise-eval" ) - DETECTED="win11${PLATFORM,,}-enterprise" - ;; - "win10${PLATFORM,,}-enterprise-eval" ) - DETECTED="win10${PLATFORM,,}-enterprise" - ;; - "win81${PLATFORM,,}-enterprise-eval" ) - DETECTED="win81${PLATFORM,,}-enterprise" - ;; - "win7${PLATFORM,,}" | "win7${PLATFORM,,}-enterprise-eval" ) - DETECTED="win7${PLATFORM,,}-enterprise" - ;; - "win2025-eval" ) DETECTED="win2025" ;; - "win2022-eval" ) DETECTED="win2022" ;; - "win2019-eval" ) DETECTED="win2019" ;; - "win2016-eval" ) DETECTED="win2016" ;; - "win2012r2-eval" ) DETECTED="win2012r2" ;; - "win2008r2-eval" ) DETECTED="win2008r2" ;; - esac + if [[ "${id,,}" == *"-eval" ]]; then + [ -z "$DETECTED" ] && DETECTED="${id::-5}" + fi return 0 } @@ -705,17 +718,18 @@ getMido() { local sum="" local size="" - [[ "${lang,,}" != "en" ]] && [[ "${lang,,}" != "en-us" ]] && return 0 + [[ "${lang,,}" != "en" && "${lang,,}" != "en-us" ]] && return 0 case "${id,,}" in "win11x64" ) - size=5819484160 - sum="b56b911bf18a2ceaeb3904d87e7c770bdf92d3099599d61ac2497b91bf190b11" + size=7736125440 + sum="d141f6030fed50f75e2b03e1eb2e53646c4b21e5386047cb860af5223f102a32" + url="https://software-static.download.prss.microsoft.com/dbazure/888969d5-f34g-4e03-ac9d-1f9786c66749/26200.6584.250915-1905.25h2_ge_release_svc_refresh_CLIENT_CONSUMER_x64FRE_en-us.iso" ;; "win11x64-enterprise-eval" ) - size=4295096320 - sum="dad633276073f14f3e0373ef7e787569e216d54942ce522b39451c8f2d38ad43" - url="https://software-static.download.prss.microsoft.com/dbazure/888969d5-f34g-4e03-ac9d-1f9786c66749/26100.1.240331-1435.ge_release_CLIENTENTERPRISEEVAL_OEMRET_A64FRE_en-us.iso" + size=7092807680 + sum="a61adeab895ef5a4db436e0a7011c92a2ff17bb0357f58b13bbc4062e535e7b9" + url="https://software-static.download.prss.microsoft.com/dbazure/888969d5-f34g-4e03-ac9d-1f9786c66749/26200.6584.250915-1905.25h2_ge_release_svc_refresh_CLIENTENTERPRISEEVAL_OEMRET_x64FRE_en-us.iso" ;; "win11x64-enterprise-iot-eval" | "win11x64-enterprise-ltsc-eval" ) size=5060020224 @@ -799,7 +813,7 @@ getLink1() { local size="" local host="https://dl.bobpony.com/windows" - [[ "${lang,,}" != "en" ]] && [[ "${lang,,}" != "en-us" ]] && return 0 + [[ "${lang,,}" != "en" && "${lang,,}" != "en-us" ]] && return 0 case "${id,,}" in "win11x64" | "win11x64-enterprise" | "win11x64-enterprise-eval" ) @@ -807,12 +821,12 @@ getLink1() { sum="aa1ad990f930d907b7a34ea897abbb0dfbe47552ca8acc146f92e40381839e05" url="11/en-us_windows_11_24h2_x64.iso" ;; - "win11x64-iot" | "win11x64-enterprise-iot-eval" ) + "win11x64-iot" | "win11x64-enterprise-iot" | "win11x64-enterprise-iot-eval" ) size=5144817664 sum="4f59662a96fc1da48c1b415d6c369d08af55ddd64e8f1c84e0166d9e50405d7a" url="11/X23-81951_26100.1742.240906-0331.ge_release_svc_refresh_CLIENT_ENTERPRISES_OEM_x64FRE_en-us.iso" ;; - "win11x64-ltsc" | "win11x64-enterprise-ltsc-eval" ) + "win11x64-ltsc" | "win11x64-enterprise-ltsc" | "win11x64-enterprise-ltsc-eval" ) size=5144817664 sum="4f59662a96fc1da48c1b415d6c369d08af55ddd64e8f1c84e0166d9e50405d7a" url="11/X23-81951_26100.1742.240906-0331.ge_release_svc_refresh_CLIENT_ENTERPRISES_OEM_x64FRE_en-us.iso" @@ -822,12 +836,12 @@ getLink1() { sum="557871965263d0fd0a1ea50b5d0d0d7cb04a279148ca905c1c675c9bc0d5486c" url="10/en-us_windows_10_22h2_x64.iso" ;; - "win10x64-iot" | "win10x64-enterprise-iot-eval" ) + "win10x64-iot" | "win10x64-enterprise-iot" | "win10x64-enterprise-iot-eval" ) size=4851668992 sum="a0334f31ea7a3e6932b9ad7206608248f0bd40698bfb8fc65f14fc5e4976c160" url="10/en-us_windows_10_iot_enterprise_ltsc_2021_x64_dvd_257ad90f.iso" ;; - "win10x64-ltsc" | "win10x64-enterprise-ltsc-eval" ) + "win10x64-ltsc" | "win10x64-enterprise-ltsc" | "win10x64-enterprise-ltsc-eval" ) size=4899461120 sum="c90a6df8997bf49e56b9673982f3e80745058723a707aef8f22998ae6479597d" url="10/en-us_windows_10_enterprise_ltsc_2021_x64_dvd_d289cf96.iso" @@ -843,14 +857,14 @@ getLink1() { url="8.x/8.1/en_windows_8.1_enterprise_with_update_x64_dvd_6054382.iso" ;; "win2025" | "win2025-eval" ) - size=5307176960 - sum="2293897341febdcea599f5412300b470b5288c6fd2b89666a7b27d283e8d3cf3" - url="server/2025/en-us_windows_server_2025_preview_x64_dvd_ce9eb1a5.iso" + size=6786627584 + sum="bf3ef0849c7cb5e818e1035b7466d206af5aa227ace1a3f4b0de2bf00d2e2144" + url="server/2025/en-us_windows_server_2025_updated_april_2025_x64_dvd_ea86301d.iso" ;; "win2022" | "win2022-eval" ) - size=5365624832 - sum="c3c57bb2cf723973a7dcfb1a21e97dfa035753a7f111e348ad918bb64b3114db" - url="server/2022/en-us_windows_server_2022_updated_jan_2024_x64_dvd_2b7a0c9f.iso" + size=6005706752 + sum="cea2cb2c09de9910c236e64eae3a801c55e9c77ec25e8d81585e3a4581d24bfb" + url="server/2022/en-us_windows_server_2022_updated_april_2025_x64_dvd_3f755ec1.iso" ;; "win2019" | "win2019-eval" ) size=5575774208 @@ -872,36 +886,41 @@ getLink1() { sum="dfd9890881b7e832a927c38310fb415b7ea62ac5a896671f2ce2a111998f0df8" url="server/2008r2/en_windows_server_2008_r2_with_sp1_x64_dvd_617601-018.iso" ;; - "win7x64" | "win7x64-enterprise" | "win7x64-enterprise-eval" ) - size=3182604288 - sum="ee69f3e9b86ff973f632db8e01700c5724ef78420b175d25bae6ead90f6805a7" - url="7/en_windows_7_enterprise_with_sp1_x64_dvd_u_677651.iso" - ;; - "win7x64-ultimate" ) + "win7x64" | "win7x64-ultimate" ) size=3320836096 sum="0b738b55a5ea388ad016535a5c8234daf2e5715a0638488ddd8a228a836055a1" url="7/en_windows_7_with_sp1_x64.iso" ;; - "win7x86" | "win7x86-enterprise" | "win7x86-enterprise-eval" ) - size=2434502656 - sum="8bdd46ff8cb8b8de9c4aba02706629c8983c45e87da110e64e13be17c8434dad" - url="7/en_windows_7_enterprise_with_sp1_x86_dvd_u_677710.iso" + "win7x64-enterprise" | "win7x64-enterprise-eval" ) + size=3182604288 + sum="ee69f3e9b86ff973f632db8e01700c5724ef78420b175d25bae6ead90f6805a7" + url="7/en_windows_7_enterprise_with_sp1_x64_dvd_u_677651.iso" ;; - "win7x86-ultimate" ) + "win7x86" | "win7x86-ultimate" ) size=2564411392 sum="99f3369c90160816be07093dbb0ac053e0a84e52d6ed1395c92ae208ccdf67e5" url="7/en_windows_7_with_sp1_x86.iso" ;; - "winvistax64-ultimate" ) + "win7x86-enterprise" | "win7x86-enterprise-eval" ) + size=2434502656 + sum="8bdd46ff8cb8b8de9c4aba02706629c8983c45e87da110e64e13be17c8434dad" + url="7/en_windows_7_enterprise_with_sp1_x86_dvd_u_677710.iso" + ;; + "winvistax64" | "winvistax64-ultimate" ) size=3861460992 sum="edf9f947c5791469fd7d2d40a5dcce663efa754f91847aa1d28ed7f585675b78" url="vista/en_windows_vista_sp2_x64_dvd_342267.iso" ;; - "winvistax86-ultimate" ) + "winvistax86" | "winvistax86-ultimate" ) size=3243413504 sum="9c36fed4255bd05a8506b2da88f9aad73643395e155e609398aacd2b5276289c" url="vista/en_windows_vista_with_sp2_x86_dvd_342266.iso" ;; + "win2003r2" ) + size=731650535 + sum="6b64bbae7eb00fd000cc887ffdc9f224d00c557daad7f756cfa373950b880dc8" + url="server/2003r2/en_win_srv_2003_r2_standard_x64_with_sp2_cd1_cd2.zip" + ;; "winxpx86" ) size=617756672 sum="62b6c91563bad6cd12a352aa018627c314cfc5162d8e9f8af0756a642e602a46" @@ -912,6 +931,11 @@ getLink1() { sum="8fac68e1e56c64ad9a2aa0ad464560282e67fa4f4dd51d09a66f4e548eb0f2d6" url="xp/professional/en_win_xp_pro_x64_vl.iso" ;; + "win2kx86" ) + size=331701982 + sum="a93251b31f92316411bb48458a695d9051b13cdeba714c46f105012fdda45bf3" + url="2000/5.00.2195.6717_x86fre_client-professional_retail_en-us.7z" + ;; esac case "${ret,,}" in @@ -933,7 +957,7 @@ getLink2() { local size="" local host="https://files.dog/MSDN" - [[ "${lang,,}" != "en" ]] && [[ "${lang,,}" != "en-us" ]] && return 0 + [[ "${lang,,}" != "en" && "${lang,,}" != "en-us" ]] && return 0 case "${id,,}" in "win81x64" ) @@ -956,46 +980,46 @@ getLink2() { sum="dfd9890881b7e832a927c38310fb415b7ea62ac5a896671f2ce2a111998f0df8" url="Windows%20Server%202008%20R2/en_windows_server_2008_r2_with_sp1_x64_dvd_617601.iso" ;; - "win7x64" | "win7x64-enterprise" | "win7x64-enterprise-eval" ) - size=3182604288 - sum="ee69f3e9b86ff973f632db8e01700c5724ef78420b175d25bae6ead90f6805a7" - url="Windows%207/en_windows_7_enterprise_with_sp1_x64_dvd_u_677651.iso" - ;; - "win7x64-ultimate" ) + "win7x64" | "win7x64-ultimate" ) size=3320903680 sum="36f4fa2416d0982697ab106e3a72d2e120dbcdb6cc54fd3906d06120d0653808" url="Windows%207/en_windows_7_ultimate_with_sp1_x64_dvd_u_677332.iso" ;; - "win7x86" | "win7x86-enterprise" | "win7x86-enterprise-eval" ) - size=2434502656 - sum="8bdd46ff8cb8b8de9c4aba02706629c8983c45e87da110e64e13be17c8434dad" - url="Windows%207/en_windows_7_enterprise_with_sp1_x86_dvd_u_677710.iso" + "win7x64-enterprise" | "win7x64-enterprise-eval" ) + size=3182604288 + sum="ee69f3e9b86ff973f632db8e01700c5724ef78420b175d25bae6ead90f6805a7" + url="Windows%207/en_windows_7_enterprise_with_sp1_x64_dvd_u_677651.iso" ;; - "win7x86-ultimate" ) + "win7x86" | "win7x86-ultimate" ) size=2564476928 sum="e2c009a66d63a742941f5087acae1aa438dcbe87010bddd53884b1af6b22c940" url="Windows%207/en_windows_7_ultimate_with_sp1_x86_dvd_u_677460.iso" ;; - "winvistax64" | "winvistax64-enterprise" ) - size=3205953536 - sum="0a0cd511b3eac95c6f081419c9c65b12317b9d6a8d9707f89d646c910e788016" - url="Windows%20Vista/en_windows_vista_enterprise_sp2_x64_dvd_342332.iso" + "win7x86-enterprise" | "win7x86-enterprise-eval" ) + size=2434502656 + sum="8bdd46ff8cb8b8de9c4aba02706629c8983c45e87da110e64e13be17c8434dad" + url="Windows%207/en_windows_7_enterprise_with_sp1_x86_dvd_u_677710.iso" ;; - "winvistax64-ultimate" ) + "winvistax64" | "winvistax64-ultimate" ) size=3861460992 sum="edf9f947c5791469fd7d2d40a5dcce663efa754f91847aa1d28ed7f585675b78" url="Windows%20Vista/en_windows_vista_sp2_x64_dvd_342267.iso" ;; - "winvistax86" | "winvistax86-enterprise" ) - size=2420981760 - sum="54e2720004041e7db988a391543ea5228b0affc28efcf9303d2d0ff9402067f5" - url="Windows%20Vista/en_windows_vista_enterprise_sp2_x86_dvd_342329.iso" + "winvistax64-enterprise" ) + size=3205953536 + sum="0a0cd511b3eac95c6f081419c9c65b12317b9d6a8d9707f89d646c910e788016" + url="Windows%20Vista/en_windows_vista_enterprise_sp2_x64_dvd_342332.iso" ;; - "winvistax86-ultimate" ) + "winvistax86" | "winvistax86-ultimate" ) size=3243413504 sum="9c36fed4255bd05a8506b2da88f9aad73643395e155e609398aacd2b5276289c" url="Windows%20Vista/en_windows_vista_with_sp2_x86_dvd_342266.iso" ;; + "winvistax86-enterprise" ) + size=2420981760 + sum="54e2720004041e7db988a391543ea5228b0affc28efcf9303d2d0ff9402067f5" + url="Windows%20Vista/en_windows_vista_enterprise_sp2_x86_dvd_342329.iso" + ;; "win2003r2" ) size=652367872 sum="74245cba888f935b138b106c2744bec7f392925b472358960a0b5643cd6abb32" @@ -1030,45 +1054,188 @@ getLink3() { local url="" local sum="" local size="" - local host="https://archive.org/download" + local host="https://nixsys.com/drivers" - [[ "${lang,,}" != "en" ]] && [[ "${lang,,}" != "en-us" ]] && return 0 + [[ "${lang,,}" != "en" && "${lang,,}" != "en-us" ]] && return 0 case "${id,,}" in + "win7x64" | "win7x64-ultimate" ) + size=3319478272 + sum="3286963e1476082ba882a5058c205c264772bead9e99e15cd1cb255f04b72900" + url="WINDOWS764_EN_DVD.iso" + ;; + "win7x86" | "win7x86-ultimate" ) + size=2564784128 + sum="bd4c03c917d00a40222d92a6fab04981a7bd46140bda1888eb961a322e3c5d89" + url="WINDOWS732_EN_DVD.iso" + ;; + "winxpx86" ) + size=618065920 + sum="8177d0137dfe4e8296a85793f140806c9250a5992c8e0e50158c742767ad1182" + url="WinXPsp3.iso" + ;; + "win2kx86" ) + size=387424256 + sum="08b11c3897eb38d1e6566a17cec5cdf2b3c620444e160e3db200a7e223aabbd8" + url="Windows_2000_SP4.iso" + esac + + case "${ret,,}" in + "sum" ) echo "$sum" ;; + "size" ) echo "$size" ;; + *) [ -n "$url" ] && echo "$host/$url";; + esac + + return 0 +} + +getLink4() { + + local id="$1" + local lang="$2" + local ret="$3" + local url="" + local sum="" + local size="" + local host="https://archive.org/download" + + [[ "${lang,,}" != "en" && "${lang,,}" != "en-us" ]] && return 0 + + case "${id,,}" in + "nano11" ) + size=2463565824 + sum="a1e0614372768cbe2d24de74b78a4a97bc1017ea5080dfed1d2125e4a527eb1a" + url="nano11_25h2/nano11%2025h2.iso" + ;; "core11" ) - size=2159738880 - sum="78f0f44444ff95b97125b43e560a72e0d6ce0a665cf9f5573bf268191e5510c1" - url="tiny-11-core-x-64-beta-1/tiny11%20core%20x64%20beta%201.iso" + size=3176654848 + sum="29c055fcfb7b089abd9e007e7abe4bb82c70a03aac9d65e56a38b87ab32d04d2" + url="tiny11_25H2/tiny11core_25H2_Oct25.iso" ;; "tiny11" ) - size=3788177408 - sum="a028800a91addc35d8ae22dce7459b67330f7d69d2f11c70f53c0fdffa5b4280" - url="tiny11-2311/tiny11%202311%20x64.iso" + size=5514559488 + sum="92484f2b7f707e42383294402a9eabbadeaa5ede80ac633390ae7f3537e36275" + url="tiny11_25H2/tiny11_25H2_Oct25.iso" ;; "tiny10" ) size=3839819776 sum="a11116c0645d892d6a5a7c585ecc1fa13aa66f8c7cc6b03bf1f27bd16860cc35" url="tiny-10-23-h2/tiny10%20x64%2023h2.iso" ;; - "win7x64" | "win7x64-enterprise" | "win7x64-enterprise-eval" ) - size=3182604288 - sum="ee69f3e9b86ff973f632db8e01700c5724ef78420b175d25bae6ead90f6805a7" - url="en_windows_7_enterprise_with_sp1_x64_dvd_u_677651_202006/en_windows_7_enterprise_with_sp1_x64_dvd_u_677651.iso" + "win11x64" ) + size=7736125440 + sum="d141f6030fed50f75e2b03e1eb2e53646c4b21e5386047cb860af5223f102a32" + url="W11x64_26200.6584/26200.6584.250915-1905.25h2_ge_release_svc_refresh_CLIENT_CONSUMER_x64FRE_en-us.iso" ;; - "win7x64-ultimate" ) + "win11x64-enterprise" | "win11x64-enterprise-eval" ) + size=6209064960 + sum="c8dbc96b61d04c8b01faf6ce0794fdf33965c7b350eaa3eb1e6697019902945c" + url="Windows11Enterprise23H2x64/22631.2428.231001-0608.23H2_NI_RELEASE_SVC_REFRESH_CLIENTENTERPRISEEVAL_OEMRET_x64FRE_en-us.iso" + ;; + "win11x64-iot" | "win11x64-enterprise-iot" | "win11x64-enterprise-iot-eval" ) + size=5144817664 + sum="4f59662a96fc1da48c1b415d6c369d08af55ddd64e8f1c84e0166d9e50405d7a" + url="Windows11LTSC/X23-81951_26100.1742.240906-0331.ge_release_svc_refresh_CLIENT_ENTERPRISES_OEM_x64FRE_en-us.iso" + ;; + "win11x64-ltsc" | "win11x64-enterprise-ltsc" | "win11x64-enterprise-ltsc-eval" ) + size=5144817664 + sum="4f59662a96fc1da48c1b415d6c369d08af55ddd64e8f1c84e0166d9e50405d7a" + url="Windows11LTSC/X23-81951_26100.1742.240906-0331.ge_release_svc_refresh_CLIENT_ENTERPRISES_OEM_x64FRE_en-us.iso" + ;; + "win10x64" | "win10x64-enterprise" | "win10x64-enterprise-eval" ) + size=6978310144 + sum="7847abd6f39abd02dc8089c4177d354f9eb66fa0ee2fe8ae20e596e675d1ab67" + url="Windows-10-22H2-July-2024-64-bit-DVD-English/en-us_windows_10_business_editions_version_22h2_updated_july_2024_x64_dvd_c004521a.iso" + ;; + "win10x64-iot" | "win10x64-enterprise-iot" | "win10x64-enterprise-iot-eval" ) + size=4851668992 + sum="a0334f31ea7a3e6932b9ad7206608248f0bd40698bfb8fc65f14fc5e4976c160" + url="en-us_windows_10_iot_enterprise_ltsc_2021_x64_dvd_257ad90f_202411/en-us_windows_10_iot_enterprise_ltsc_2021_x64_dvd_257ad90f.iso" + ;; + "win10x64-ltsc" | "win10x64-enterprise-ltsc" | "win10x64-enterprise-ltsc-eval" ) + size=4899461120 + sum="c90a6df8997bf49e56b9673982f3e80745058723a707aef8f22998ae6479597d" + url="en-us_windows_10_enterprise_ltsc_2021_x64_dvd_d289cf96_202302/en-us_windows_10_enterprise_ltsc_2021_x64_dvd_d289cf96.iso" + ;; + "win81x64" ) + size=4320526336 + sum="d8333cf427eb3318ff6ab755eb1dd9d433f0e2ae43745312c1cd23e83ca1ce51" + url="en_windows_8.1_with_update_x64_dvd_6051480/en_windows_8.1_with_update_x64_dvd_6051480.iso" + ;; + "win81x64-enterprise" | "win81x64-enterprise-eval" ) + size=4139163648 + sum="c3c604c03677504e8905090a8ce5bb1dde76b6fd58e10f32e3a25bef21b2abe1" + url="en_windows_8.1_enterprise_with_update_x64_dvd/en_windows_8.1_enterprise_with_update_x64_dvd_6054382.iso" + ;; + "win2022" | "win2022-eval" ) + size=5365624832 + sum="c3c57bb2cf723973a7dcfb1a21e97dfa035753a7f111e348ad918bb64b3114db" + url="win-server-2022/2227-January_2024/en-us_windows_server_2022_updated_jan_2024_x64_dvd_2b7a0c9f.iso" + ;; + "win2019" | "win2019-eval" ) + size=5575774208 + sum="0067afe7fdc4e61f677bd8c35a209082aa917df9c117527fc4b2b52a447e89bb" + url="sw-dvd-9-win-server-std-core-2019-1809.18-64-bit-english-dc-std-mlf-x-22-74330/SW_DVD9_Win_Server_STD_CORE_2019_1809.18_64Bit_English_DC_STD_MLF_X22-74330.ISO" + ;; + "win2016" | "win2016-eval" ) + size=6006587392 + sum="af06e5483c786c023123e325cea4775050324d9e1366f46850b515ae43f764be" + url="en_windows_server_2016_updated_feb_2018_x64_dvd_11636692/en_windows_server_2016_updated_feb_2018_x64_dvd_11636692.iso" + ;; + "win2012r2" | "win2012r2-eval" ) + size=5397889024 + sum="f351e89eb88a96af4626ceb3450248b8573e3ed5924a4e19ea891e6003b62e4e" + url="en_windows_server_2012_r2_with_update_x64_dvd_6052708_202006/en_windows_server_2012_r2_with_update_x64_dvd_6052708.iso" + ;; + "win2008r2" | "win2008r2-eval" ) + size=3166584832 + sum="dfd9890881b7e832a927c38310fb415b7ea62ac5a896671f2ce2a111998f0df8" + url="en_windows_server_2008_r2_with_sp1_x64_dvd_617601_202006/en_windows_server_2008_r2_with_sp1_x64_dvd_617601.iso" + ;; + "win7x64" | "win7x64-ultimate" ) size=3320903680 sum="36f4fa2416d0982697ab106e3a72d2e120dbcdb6cc54fd3906d06120d0653808" url="win7-ult-sp1-english/Win7_Ult_SP1_English_x64.iso" ;; - "win7x86" | "win7x86-enterprise" | "win7x86-enterprise-eval" ) + "win7x64-enterprise" | "win7x64-enterprise-eval" ) + size=3182604288 + sum="ee69f3e9b86ff973f632db8e01700c5724ef78420b175d25bae6ead90f6805a7" + url="en_windows_7_enterprise_with_sp1_x64_dvd_u_677651_202006/en_windows_7_enterprise_with_sp1_x64_dvd_u_677651.iso" + ;; + "win7x86" | "win7x86-ultimate" ) + size=2564476928 + sum="e2c009a66d63a742941f5087acae1aa438dcbe87010bddd53884b1af6b22c940" + url="win7-ult-sp1-english/Win7_Ult_SP1_English_x32.iso" + ;; + "win7x86-enterprise" | "win7x86-enterprise-eval" ) size=2434502656 sum="8bdd46ff8cb8b8de9c4aba02706629c8983c45e87da110e64e13be17c8434dad" url="en_windows_7_enterprise_with_sp1_x86_dvd_u_677710_202006/en_windows_7_enterprise_with_sp1_x86_dvd_u_677710.iso" ;; - "win7x86-ultimate" ) - size=2564476928 - sum="e2c009a66d63a742941f5087acae1aa438dcbe87010bddd53884b1af6b22c940" - url="win7-ult-sp1-english/Win7_Ult_SP1_English_x32.iso" + "winvistax64" | "winvistax64-ultimate" ) + size=3861460992 + sum="edf9f947c5791469fd7d2d40a5dcce663efa754f91847aa1d28ed7f585675b78" + url="en_windows_vista_sp2_x64_dvd_342267_202010/en_windows_vista_sp2_x64_dvd_342267.iso" + ;; + "winvistax64-enterprise" ) + size=3205953536 + sum="0a0cd511b3eac95c6f081419c9c65b12317b9d6a8d9707f89d646c910e788016" + url="en_windows_vista_enterprise_sp2_x64_dvd_342332_202007/en_windows_vista_enterprise_sp2_x64_dvd_342332.iso" + ;; + "winvistax86" | "winvistax86-ultimate" ) + size=3243413504 + sum="9c36fed4255bd05a8506b2da88f9aad73643395e155e609398aacd2b5276289c" + url="en_windows_vista_sp2_x86_dvd_342266/en_windows_vista_sp2_x86_dvd_342266.iso" + ;; + "winvistax86-enterprise" ) + size=2420981760 + sum="54e2720004041e7db988a391543ea5228b0affc28efcf9303d2d0ff9402067f5" + url="en_windows_vista_enterprise_sp2_x86_dvd_342329_202007/en_windows_vista_enterprise_sp2_x86_dvd_342329.iso" + ;; + "win2003r2" ) + size=652367872 + sum="74245cba888f935b138b106c2744bec7f392925b472358960a0b5643cd6abb32" + url="en_win_srv_2003_r2_standard_x64_with_sp2_cd1_x13-05757/en_win_srv_2003_r2_standard_x64_with_sp2_cd1_x13-05757.iso" ;; "winxpx86" ) size=617756672 @@ -1080,6 +1247,10 @@ getLink3() { sum="8fac68e1e56c64ad9a2aa0ad464560282e67fa4f4dd51d09a66f4e548eb0f2d6" url="windows-xp-all-sp-msdn-iso-files-en-de-ru-tr-x86-x64/en_win_xp_sp1_pro_x64_vl.iso" ;; + "win2kx86" ) + size=386859008 + sum="e3816f6e80b66ff686ead03eeafffe9daf020a5e4717b8bd4736b7c51733ba22" + url="MicrosoftWindows2000BuildCollection/5.00.2195.6717_x86fre_client-professional_retail_en-us-ZRMPFPP_EN.iso" esac case "${ret,,}" in @@ -1140,6 +1311,8 @@ isMido() { local lang="$2" local sum + [[ "${MIDO:-}" == [Nn]* ]] && return 1 + sum=$(getMido "$id" "en" "sum") [ -n "$sum" ] && return 0 @@ -1151,6 +1324,8 @@ isESD() { local id="$1" local lang="$2" + [[ "${ESD:-}" == [Nn]* ]] && return 1 + case "${id,,}" in "win11${PLATFORM,,}" | "win10${PLATFORM,,}" ) return 0 @@ -1203,7 +1378,7 @@ addFolder() { cp -Lr "$folder/." "$dest" || return 1 local file - file=$(find "$dest" -maxdepth 1 -type f -iname install.bat | head -n 1) + file=$(find "$dest" -maxdepth 1 -type f -iname install.bat -print -quit) [ -f "$file" ] && unix2dos -q "$file" return 0 @@ -1211,93 +1386,180 @@ addFolder() { prepareInstall() { + local pid="" + local file="" local dir="$2" local desc="$3" local driver="$4" local drivers="/tmp/drivers" - rm -rf "$drivers" - mkdir -p "$drivers" - ETFS="[BOOT]/Boot-NoEmul.img" if [ ! -f "$dir/$ETFS" ] || [ ! -s "$dir/$ETFS" ]; then error "Failed to locate file \"$ETFS\" in $desc ISO image!" && return 1 fi - local msg="Adding drivers to image..." - info "$msg" && html "$msg" - - if ! bsdtar -xf /drivers.txz -C "$drivers"; then - error "Failed to extract drivers!" && return 1 - fi - local arch target [ -d "$dir/AMD64" ] && arch="amd64" || arch="x86" [[ "${arch,,}" == "x86" ]] && target="$dir/I386" || target="$dir/AMD64" - if [ ! -f "$drivers/viostor/$driver/$arch/viostor.sys" ]; then - error "Failed to locate required storage drivers!" && return 1 + if [ ! -d "$target" ]; then + error "Failed to locate directory \"$target\" in $desc ISO image!" && return 1 fi - cp -L "$drivers/viostor/$driver/$arch/viostor.sys" "$target" || return 1 + if [[ "${driver,,}" == "xp" || "${driver,,}" == "2k3" ]]; then - mkdir -p "$dir/\$OEM\$/\$1/Drivers/viostor" || return 1 - cp -L "$drivers/viostor/$driver/$arch/viostor.cat" "$dir/\$OEM\$/\$1/Drivers/viostor" || return 1 - cp -L "$drivers/viostor/$driver/$arch/viostor.inf" "$dir/\$OEM\$/\$1/Drivers/viostor" || return 1 - cp -L "$drivers/viostor/$driver/$arch/viostor.sys" "$dir/\$OEM\$/\$1/Drivers/viostor" || return 1 + local msg="Adding drivers to image..." + info "$msg" && html "$msg" + + rm -rf "$drivers" + mkdir -p "$drivers" + + if ! bsdtar -xf /var/drivers.txz -C "$drivers"; then + error "Failed to extract drivers!" && return 1 + fi + + if [ ! -f "$drivers/viostor/$driver/$arch/viostor.sys" ]; then + error "Failed to locate required storage drivers!" && return 1 + fi + + cp -L "$drivers/viostor/$driver/$arch/viostor.sys" "$target" || return 1 + + mkdir -p "$dir/\$OEM\$/\$1/Drivers/viostor" || return 1 + cp -L "$drivers/viostor/$driver/$arch/viostor.cat" "$dir/\$OEM\$/\$1/Drivers/viostor" || return 1 + cp -L "$drivers/viostor/$driver/$arch/viostor.inf" "$dir/\$OEM\$/\$1/Drivers/viostor" || return 1 + cp -L "$drivers/viostor/$driver/$arch/viostor.sys" "$dir/\$OEM\$/\$1/Drivers/viostor" || return 1 + + if [ ! -f "$drivers/NetKVM/$driver/$arch/netkvm.sys" ]; then + error "Failed to locate required network drivers!" && return 1 + fi + + mkdir -p "$dir/\$OEM\$/\$1/Drivers/NetKVM" || return 1 + cp -L "$drivers/NetKVM/$driver/$arch/netkvm.cat" "$dir/\$OEM\$/\$1/Drivers/NetKVM" || return 1 + cp -L "$drivers/NetKVM/$driver/$arch/netkvm.inf" "$dir/\$OEM\$/\$1/Drivers/NetKVM" || return 1 + cp -L "$drivers/NetKVM/$driver/$arch/netkvm.sys" "$dir/\$OEM\$/\$1/Drivers/NetKVM" || return 1 + + file=$(find "$target" -maxdepth 1 -type f -iname TXTSETUP.SIF -print -quit) + + if [ -z "$file" ]; then + error "The file TXTSETUP.SIF could not be found!" && return 1 + fi + + sed -i '/^\[SCSI.Load\]/s/$/\nviostor=viostor.sys,4/' "$file" + sed -i '/^\[SourceDisksFiles.'"$arch"'\]/s/$/\nviostor.sys=1,,,,,,4_,4,1,,,1,4/' "$file" + sed -i '/^\[SCSI\]/s/$/\nviostor=\"Red Hat VirtIO SCSI Disk Device\"/' "$file" + sed -i '/^\[HardwareIdsDatabase\]/s/$/\nPCI\\VEN_1AF4\&DEV_1001\&SUBSYS_00000000=\"viostor\"/' "$file" + sed -i '/^\[HardwareIdsDatabase\]/s/$/\nPCI\\VEN_1AF4\&DEV_1001\&SUBSYS_00020000=\"viostor\"/' "$file" + sed -i '/^\[HardwareIdsDatabase\]/s/$/\nPCI\\VEN_1AF4\&DEV_1001\&SUBSYS_00021AF4=\"viostor\"/' "$file" + sed -i '/^\[HardwareIdsDatabase\]/s/$/\nPCI\\VEN_1AF4\&DEV_1001\&SUBSYS_00000000=\"viostor\"/' "$file" + + if [ ! -d "$drivers/sata/xp/$arch" ]; then + error "Failed to locate required SATA drivers!" && return 1 + fi + + mkdir -p "$dir/\$OEM\$/\$1/Drivers/sata" || return 1 + cp -Lr "$drivers/sata/xp/$arch/." "$dir/\$OEM\$/\$1/Drivers/sata" || return 1 + cp -Lr "$drivers/sata/xp/$arch/." "$target" || return 1 + + sed -i '/^\[SCSI.Load\]/s/$/\niaStor=iaStor.sys,4/' "$file" + sed -i '/^\[FileFlags\]/s/$/\niaStor.sys = 16/' "$file" + sed -i '/^\[SourceDisksFiles.'"$arch"'\]/s/$/\niaStor.cat = 1,,,,,,,1,0,0/' "$file" + sed -i '/^\[SourceDisksFiles.'"$arch"'\]/s/$/\niaStor.inf = 1,,,,,,,1,0,0/' "$file" + sed -i '/^\[SourceDisksFiles.'"$arch"'\]/s/$/\niaStor.sys = 1,,,,,,4_,4,1,,,1,4/' "$file" + sed -i '/^\[SourceDisksFiles.'"$arch"'\]/s/$/\niaStor.sys = 1,,,,,,,1,0,0/' "$file" + sed -i '/^\[SourceDisksFiles.'"$arch"'\]/s/$/\niaahci.cat = 1,,,,,,,1,0,0/' "$file" + sed -i '/^\[SourceDisksFiles.'"$arch"'\]/s/$/\niaAHCI.inf = 1,,,,,,,1,0,0/' "$file" + sed -i '/^\[SCSI\]/s/$/\niaStor=\"Intel\(R\) SATA RAID\/AHCI Controller\"/' "$file" + sed -i '/^\[HardwareIdsDatabase\]/s/$/\nPCI\\VEN_8086\&DEV_2922\&CC_0106=\"iaStor\"/' "$file" + + rm -rf "$drivers" - if [ ! -f "$drivers/NetKVM/$driver/$arch/netkvm.sys" ]; then - error "Failed to locate required network drivers!" && return 1 fi - mkdir -p "$dir/\$OEM\$/\$1/Drivers/NetKVM" || return 1 - cp -L "$drivers/NetKVM/$driver/$arch/netkvm.cat" "$dir/\$OEM\$/\$1/Drivers/NetKVM" || return 1 - cp -L "$drivers/NetKVM/$driver/$arch/netkvm.inf" "$dir/\$OEM\$/\$1/Drivers/NetKVM" || return 1 - cp -L "$drivers/NetKVM/$driver/$arch/netkvm.sys" "$dir/\$OEM\$/\$1/Drivers/NetKVM" || return 1 + local key setup + setup=$(find "$target" -maxdepth 1 -type f -iname setupp.ini -print -quit) + + if [ -n "$setup" ] && [ -z "$KEY" ]; then + + pid=$(<"$setup") + pid="${pid%$'\r'}" + + if [[ "$driver" == "2k" ]]; then + + echo "${pid:0:$((${#pid})) - 3}270" > "$setup" + + else + + if [[ "$pid" == *"270" ]]; then + + warn "this version of $desc requires a volume license key (VLK), it will ask for one during installation." + + else + + file=$(find "$target" -maxdepth 1 -type f -iname PID.INF -print -quit) + + if [ -n "$file" ]; then + + if [[ "$driver" == "2k3" ]]; then + + key=$(grep -i -A 2 "StagingKey" "$file" | tail -n 2 | head -n 1) + + else + + key="${pid:$((${#pid})) - 8:5}" + if [[ "${pid^^}" == *"OEM" ]]; then + key=$(grep -i -A 2 "$key" "$file" | tail -n 2 | head -n 1) + else + key=$(grep -i -m 1 -A 2 "$key" "$file" | tail -n 2 | head -n 1) + fi + key="${key#*= }" + + fi + + key="${key%$'\r'}" + [[ "${#key}" == "29" ]] && KEY="$key" + + fi + + if [ -z "$KEY" ]; then + + # These are NOT pirated keys, they come from official MS documentation. + + case "${driver,,}" in + "xp" ) + + if [[ "${arch,,}" == "x86" ]]; then + # Windows XP Professional x86 generic trial key (no activation) + KEY="DR8GV-C8V6J-BYXHG-7PYJR-DB66Y" + else + # Windows XP Professional x64 generic trial key (no activation) + KEY="B2RBK-7KPT9-4JP6X-QQFWM-PJD6G" + fi ;; + + "2k3" ) + + if [[ "${arch,,}" == "x86" ]]; then + # Windows Server 2003 Standard x86 generic trial key (no activation) + KEY="QKDCQ-TP2JM-G4MDG-VR6F2-P9C48" + else + # Windows Server 2003 Standard x64 generic trial key (no activation) + KEY="P4WJG-WK3W7-3HM8W-RWHCK-8JTRY" + fi ;; + + esac + + echo "${pid:0:$((${#pid})) - 3}000" > "$setup" + + fi + + fi + fi - if [ ! -f "$target/TXTSETUP.SIF" ]; then - error "The file TXTSETUP.SIF could not be found!" && return 1 fi - sed -i '/^\[SCSI.Load\]/s/$/\nviostor=viostor.sys,4/' "$target/TXTSETUP.SIF" - sed -i '/^\[SourceDisksFiles.'"$arch"'\]/s/$/\nviostor.sys=1,,,,,,4_,4,1,,,1,4/' "$target/TXTSETUP.SIF" - sed -i '/^\[SCSI\]/s/$/\nviostor=\"Red Hat VirtIO SCSI Disk Device\"/' "$target/TXTSETUP.SIF" - sed -i '/^\[HardwareIdsDatabase\]/s/$/\nPCI\\VEN_1AF4\&DEV_1001\&SUBSYS_00000000=\"viostor\"/' "$target/TXTSETUP.SIF" - sed -i '/^\[HardwareIdsDatabase\]/s/$/\nPCI\\VEN_1AF4\&DEV_1001\&SUBSYS_00020000=\"viostor\"/' "$target/TXTSETUP.SIF" - sed -i '/^\[HardwareIdsDatabase\]/s/$/\nPCI\\VEN_1AF4\&DEV_1001\&SUBSYS_00021AF4=\"viostor\"/' "$target/TXTSETUP.SIF" - sed -i '/^\[HardwareIdsDatabase\]/s/$/\nPCI\\VEN_1AF4\&DEV_1001\&SUBSYS_00000000=\"viostor\"/' "$target/TXTSETUP.SIF" + [ -n "$KEY" ] && KEY="ProductID=$KEY" - if [ ! -d "$drivers/sata/xp/$arch" ]; then - error "Failed to locate required SATA drivers!" && return 1 - fi - - mkdir -p "$dir/\$OEM\$/\$1/Drivers/sata" || return 1 - cp -Lr "$drivers/sata/xp/$arch/." "$dir/\$OEM\$/\$1/Drivers/sata" || return 1 - cp -Lr "$drivers/sata/xp/$arch/." "$target" || return 1 - - sed -i '/^\[SCSI.Load\]/s/$/\niaStor=iaStor.sys,4/' "$target/TXTSETUP.SIF" - sed -i '/^\[FileFlags\]/s/$/\niaStor.sys = 16/' "$target/TXTSETUP.SIF" - sed -i '/^\[SourceDisksFiles.'"$arch"'\]/s/$/\niaStor.cat = 1,,,,,,,1,0,0/' "$target/TXTSETUP.SIF" - sed -i '/^\[SourceDisksFiles.'"$arch"'\]/s/$/\niaStor.inf = 1,,,,,,,1,0,0/' "$target/TXTSETUP.SIF" - sed -i '/^\[SourceDisksFiles.'"$arch"'\]/s/$/\niaStor.sys = 1,,,,,,4_,4,1,,,1,4/' "$target/TXTSETUP.SIF" - sed -i '/^\[SourceDisksFiles.'"$arch"'\]/s/$/\niaStor.sys = 1,,,,,,,1,0,0/' "$target/TXTSETUP.SIF" - sed -i '/^\[SourceDisksFiles.'"$arch"'\]/s/$/\niaahci.cat = 1,,,,,,,1,0,0/' "$target/TXTSETUP.SIF" - sed -i '/^\[SourceDisksFiles.'"$arch"'\]/s/$/\niaAHCI.inf = 1,,,,,,,1,0,0/' "$target/TXTSETUP.SIF" - sed -i '/^\[SCSI\]/s/$/\niaStor=\"Intel\(R\) SATA RAID\/AHCI Controller\"/' "$target/TXTSETUP.SIF" - sed -i '/^\[HardwareIdsDatabase\]/s/$/\nPCI\\VEN_8086\&DEV_2922\&CC_0106=\"iaStor\"/' "$target/TXTSETUP.SIF" - - rm -rf "$drivers" - - local pid file setup - setup=$(find "$target" -maxdepth 1 -type f -iname setupp.ini | head -n 1) - pid=$(<"$setup") - pid="${pid:(-4)}" - pid="${pid:0:3}" - - if [[ "$pid" == "270" ]]; then - warn "this version of $desc requires a volume license key (VLK), it will ask for one during installation." - fi + mkdir -p "$dir/\$OEM\$" if ! addFolder "$dir"; then error "Failed to add OEM folder to image!" && return 1 @@ -1313,33 +1575,14 @@ prepareInstall() { XHEX=$(printf '%x\n' "$WIDTH") YHEX=$(printf '%x\n' "$HEIGHT") - local username="Docker" - local password="*" + local username="" + local password="" - [ -n "$PASSWORD" ] && password="$PASSWORD" [ -n "$USERNAME" ] && username=$(echo "$USERNAME" | sed 's/[^[:alnum:]@!._-]//g') + [ -z "$username" ] && username="Docker" - local ip="20.20.20.1" - [ -n "${VM_NET_IP:-}" ] && ip="${VM_NET_IP%.*}.1" - - # These are not pirated keys, they come from the official MS documentation. - if [[ "${driver,,}" == "xp" ]]; then - if [[ "${arch,,}" == "x86" ]]; then - # Windows XP Professional x86 generic key (no activation, trial-only) - [ -z "$KEY" ] && KEY="DR8GV-C8V6J-BYXHG-7PYJR-DB66Y" - else - # Windows XP Professional x64 generic key (no activation, trial-only) - [ -z "$KEY" ] && KEY="B2RBK-7KPT9-4JP6X-QQFWM-PJD6G" - fi - else - if [[ "${arch,,}" == "x86" ]]; then - # Windows Server 2003 Standard x86 generic key (no activation, trial-only) - [ -z "$KEY" ] && KEY="QKDCQ-TP2JM-G4MDG-VR6F2-P9C48" - else - # Windows Server 2003 Standard x64 generic key (no activation, trial-only) - [ -z "$KEY" ] && KEY="P4WJG-WK3W7-3HM8W-RWHCK-8JTRY" - fi - fi + [ -n "$PASSWORD" ] && password=$(echo "$PASSWORD" | sed 's/"//g') + [ -z "$password" ] && password="admin" find "$target" -maxdepth 1 -type f -iname winnt.sif -exec rm {} \; @@ -1377,8 +1620,8 @@ prepareInstall() { echo "[UserData]" echo " FullName=\"$username\"" echo " ComputerName=\"*\"" - echo " OrgName=\"Windows for Docker\"" - echo " ProductKey=$KEY" + echo " OrgName=\"$APP for $ENGINE\"" + echo " $KEY" echo "" echo "[Identification]" echo " JoinWorkgroup = WORKGROUP" @@ -1428,21 +1671,24 @@ prepareInstall() { echo "[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\StandardProfile\GloballyOpenPorts\List]" echo "\"3389:TCP\"=\"3389:TCP:*:Enabled:@xpsp2res.dll,-22009\"" echo "" - echo "[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa]" - echo "\"LimitBlankPasswordUse\"=dword:00000000" - echo "" echo "[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Applets\Tour]" echo "\"RunCount\"=dword:00000000" echo "" echo "[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced]" echo "\"HideFileExt\"=dword:00000000" echo "" + echo "[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer]" + echo "\"NoWelcomeScreen\"=\"1\"" + echo "" + echo "[HKEY_CURRENT_USER\Software\Microsoft\Internet Connection Wizard]" + echo "\"Completed\"=\"1\"" + echo "\"Desktopchanged\"=\"1\"" + echo "" echo "[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]" - echo "\"DefaultUserName\"=\"$username\"" - echo "\"DefaultDomainName\"=\"Dockur\"" - echo "\"AltDefaultUserName\"=\"$username\"" - echo "\"AltDefaultDomainName\"=\"Dockur\"" echo "\"AutoAdminLogon\"=\"1\"" + echo "\"DefaultUserName\"=\"$username\"" + echo "\"DefaultPassword\"=\"$password\"" + echo "\"DefaultDomainName\"=\"Dockur\"" echo "" echo "[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Video\{23A77BF7-ED96-40EC-AF06-9B1F4867732A}\0000]" echo "\"DefaultSettings.BitsPerPel\"=dword:00000020" @@ -1461,11 +1707,18 @@ prepareInstall() { echo "" } | unix2dos > "$dir/\$OEM\$/install.reg" + if [[ "$driver" == "2k" ]]; then + { echo "[HKEY_USERS\.DEFAULT\Software\Microsoft\Windows\CurrentVersion\Runonce]" + echo "\"^SetupICWDesktop\"=-" + echo "" + } | unix2dos >> "$dir/\$OEM\$/install.reg" + fi + if [[ "$driver" == "2k3" ]]; then { echo "[HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\srvWiz]" echo "@=dword:00000000" echo "" - echo "[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ServerOOBE\SecurityOOBE]" + echo "[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\ServerOOBE\SecurityOOBE]" echo "\"DontLaunchSecurityOOBE\"=dword:00000000" echo "" } | unix2dos >> "$dir/\$OEM\$/install.reg" @@ -1513,17 +1766,18 @@ prepareInstall() { echo "" echo "Call Domain.MoveHere(LocalAdminADsPath, \"$username\")" echo "" - echo "Set oFSO = CreateObject(\"Scripting.FileSystemObject\")" - echo "Set oHosts = oFSO.GetFile(\"C:\Windows\System32\drivers\etc\hosts\")" - echo "Set fileAPPEND = oFSO.OpenTextFile(\"C:\Windows\System32\drivers\etc\hosts\", 8, true)" - echo "fileAPPEND.Write(\"$ip host.lan\")" - echo "fileAPPEND.Close()" + echo "Set oLink = WshShell.CreateShortcut(WshShell.ExpandEnvironmentStrings(\"%userprofile%\\Desktop\\Shared.lnk\"))" + echo "With oLink" + echo " .TargetPath = \"\\\\host.lan\\Data\"" + echo " .Save" + echo "End With" + echo "Set oLink = Nothing" echo "" - } | unix2dos > "$dir/\$OEM\$/admin.vbs" + } | unix2dos > "$dir/\$OEM\$/install.vbs" { echo "[COMMANDS]" echo "\"REGEDIT /s install.reg\"" - echo "\"Wscript admin.vbs\"" + echo "\"Wscript install.vbs\"" echo "" } | unix2dos > "$dir/\$OEM\$/cmdlines.txt" @@ -1558,34 +1812,59 @@ prepareLegacy() { detectLegacy() { local dir="$1" - local find find2 + local find - find=$(find "$dir" -maxdepth 1 -type d -iname win95 | head -n 1) + find=$(find "$dir" -maxdepth 1 -type d -iname WIN95 -print -quit) [ -n "$find" ] && DETECTED="win95" && return 0 - find=$(find "$dir" -maxdepth 1 -type d -iname win98 | head -n 1) + find=$(find "$dir" -maxdepth 1 -type d -iname WIN98 -print -quit) [ -n "$find" ] && DETECTED="win98" && return 0 - find=$(find "$dir" -maxdepth 1 -type d -iname win9x | head -n 1) + find=$(find "$dir" -maxdepth 1 -type d -iname WIN9X -print -quit) [ -n "$find" ] && DETECTED="win9x" && return 0 - find=$(find "$dir" -maxdepth 1 -type f -iname cdrom_nt.5 | head -n 1) - [ -n "$find" ] && DETECTED="win2k" && return 0 + find=$(find "$dir" -maxdepth 1 -type f -iname CDROM_W.40 -print -quit) + [ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname CDROM_S.40 -print -quit) + [ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname CDROM_TS.40 -print -quit) + [ -n "$find" ] && DETECTED="winnt4" && return 0 - find=$(find "$dir" -maxdepth 1 -type d -iname win51 | head -n 1) - find2=$(find "$dir" -maxdepth 1 -type f -iname setupxp.htm | head -n 1) + find=$(find "$dir" -maxdepth 1 -type f -iname CDROM_NT.5 -print -quit) + + if [ -n "$find" ]; then + + find=$(find "$dir" -maxdepth 1 -type f -iname CDROM_IA.5 -print -quit) + [ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname CDROM_ID.5 -print -quit) + [ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname CDROM_IP.5 -print -quit) + [ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname CDROM_IS.5 -print -quit) + [ -n "$find" ] && DETECTED="win2k" && return 0 - if [ -n "$find" ] || [ -n "$find2" ] || [ -f "$dir/WIN51AP" ] || [ -f "$dir/WIN51IC" ]; then - [ -d "$dir/AMD64" ] && DETECTED="winxpx64" && return 0 - DETECTED="winxpx86" && return 0 fi - if [ -f "$dir/WIN51IA" ] || [ -f "$dir/WIN51IB" ] || [ -f "$dir/WIN51ID" ] || [ -f "$dir/WIN51IL" ] || [ -f "$dir/WIN51IS" ]; then - DETECTED="win2003r2" && return 0 - fi + find=$(find "$dir" -maxdepth 1 -iname WIN51 -print -quit) + + if [ -n "$find" ]; then + + find=$(find "$dir" -maxdepth 1 -type f -iname WIN51AP -print -quit) + [ -n "$find" ] && DETECTED="winxpx64" && return 0 + + find=$(find "$dir" -maxdepth 1 -type f -iname WIN51IC -print -quit) + [ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname WIN51IP -print -quit) + [ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname setupxp.htm -print -quit) + [ -n "$find" ] && DETECTED="winxpx86" && return 0 + + find=$(find "$dir" -maxdepth 1 -type f -iname WIN51IS -print -quit) + [ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname WIN51IA -print -quit) + [ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname WIN51IB -print -quit) + [ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname WIN51ID -print -quit) + [ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname WIN51IL -print -quit) + [ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname WIN51IS -print -quit) + [ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname WIN51AA -print -quit) + [ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname WIN51AD -print -quit) + [ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname WIN51AS -print -quit) + [ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname WIN51MA -print -quit) + [ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname WIN51MD -print -quit) + [ -n "$find" ] && DETECTED="win2003r2" && return 0 - if [ -f "$dir/WIN51AA" ] || [ -f "$dir/WIN51AD" ] || [ -f "$dir/WIN51AS" ] || [ -f "$dir/WIN51MA" ] || [ -f "$dir/WIN51MD" ]; then - DETECTED="win2003r2" && return 0 fi return 1 @@ -1603,6 +1882,10 @@ skipVersion() { return 1 } +isCompatible() { + return 0 +} + setMachine() { local id="$1" @@ -1614,7 +1897,9 @@ setMachine() { "win9"* ) ETFS="[BOOT]/Boot-1.44M.img" ;; "win2k"* ) - ETFS="[BOOT]/Boot-NoEmul.img" ;; + if ! prepareInstall "$iso" "$dir" "$desc" "2k"; then + error "Failed to prepare $desc ISO!" && return 1 + fi ;; "winxp"* ) if ! prepareInstall "$iso" "$dir" "$desc" "xp"; then error "Failed to prepare $desc ISO!" && return 1 @@ -1626,10 +1911,20 @@ setMachine() { esac case "${id,,}" in - "win9"* | "win2k"* ) + "win9"* ) + USB="no" + VGA="cirrus" DISK_TYPE="auto" + ADAPTER="rtl8139" MACHINE="pc-i440fx-2.4" BOOT_MODE="windows_legacy" ;; + "win2k"* ) + VGA="cirrus" + MACHINE="pc" + USB="pci-ohci" + DISK_TYPE="auto" + ADAPTER="rtl8139" + BOOT_MODE="windows_legacy" ;; "winxp"* | "win2003"* ) DISK_TYPE="blk" BOOT_MODE="windows_legacy" ;; diff --git a/src/entry.sh b/src/entry.sh index 17b2147..71e939e 100644 --- a/src/entry.sh +++ b/src/entry.sh @@ -8,8 +8,10 @@ set -Eeuo pipefail cd /run +. start.sh # Startup hook . utils.sh # Load functions . reset.sh # Initialize system +. server.sh # Start webserver . define.sh # Define versions . mido.sh # Download Windows . install.sh # Run installation @@ -20,7 +22,9 @@ cd /run . boot.sh # Configure boot . proc.sh # Initialize processor . power.sh # Configure shutdown +. memory.sh # Check available memory . config.sh # Configure arguments +. finish.sh # Finish initialization trap - ERR @@ -32,9 +36,11 @@ info "Booting ${APP}${BOOT_DESC} using QEMU v$version..." terminal ( sleep 30; boot ) & -tail -fn +0 "$QEMU_LOG" 2>/dev/null & +tail -fn +0 "$QEMU_LOG" --pid=$$ 2>/dev/null & cat "$QEMU_TERM" 2> /dev/null | tee "$QEMU_PTY" | \ sed -u -e 's/\x1B\[[=0-9;]*[a-z]//gi' \ +-e 's/\x1B\x63//g' -e 's/\x1B\[[=?]7l//g' \ +-e '/^$/d' -e 's/\x44\x53\x73//g' \ -e 's/failed to load Boot/skipped Boot/g' \ -e 's/0): Not Found/0)/g' & wait $! || : diff --git a/src/install.sh b/src/install.sh index 9c42bd7..7be2996 100644 --- a/src/install.sh +++ b/src/install.sh @@ -1,12 +1,60 @@ #!/usr/bin/env bash set -Eeuo pipefail -TMP="$STORAGE/tmp" -DIR="$TMP/unpack" -FB="falling back to manual installation!" ETFS="boot/etfsboot.com" +FB="falling back to manual installation!" EFISYS="efi/microsoft/boot/efisys_noprompt.bin" +backup () { + + local count=1 + local iso="$1" + local name="unknown" + local root="$STORAGE/backups" + local previous="$STORAGE/windows.base" + + if [ -f "$previous" ]; then + + previous=$(<"$previous") + previous="${previous//[![:print:]]/}" + + [ -n "$previous" ] && name="${previous%.*}" + + fi + + if ! makeDir "$root"; then + error "Failed to create directory \"$root\" !" + return 1 + fi + + local folder="$name" + local dir="$root/$folder" + + while [ -d "$dir" ] + do + count=$((count+1)) + folder="${name}.${count}" + dir="$root/$folder" + done + + rm -rf "$dir" + + if ! makeDir "$dir"; then + error "Failed to create directory \"$dir\" !" + return 1 + fi + + [ -f "$iso" ] && mv -f "$iso" "$dir/" + find "$STORAGE" -maxdepth 1 -type f -iname 'data.*' -not -iname '*.iso' -exec mv -n {} "$dir/" \; + find "$STORAGE" -maxdepth 1 -type f -iname 'windows.*' -not -iname '*.iso' -exec mv -n {} "$dir/" \; + find "$STORAGE" -maxdepth 1 -type f \( -iname '*.rom' -or -iname '*.vars' \) -exec mv -n {} "$dir/" \; + + [ -z "$(ls -A "$dir")" ] && rm -rf "$dir" + [ -z "$(ls -A "$root")" ] && rm -rf "$root" + + return 0 +} + skipInstall() { local iso="$1" @@ -16,28 +64,44 @@ skipInstall() { local previous="$STORAGE/windows.base" if [ -f "$previous" ]; then + previous=$(<"$previous") previous="${previous//[![:print:]]/}" + if [ -n "$previous" ]; then if [[ "${STORAGE,,}/${previous,,}" != "${iso,,}" ]]; then - if [ -f "$boot" ] && hasDisk; then - if [[ "${iso,,}" == "${STORAGE,,}/windows."* ]]; then - method="your custom .iso file" - else - if [[ "${previous,,}" != "windows."* ]]; then - method="the VERSION variable" - fi - fi - if [ -n "$method" ]; then - info "Detected that $method was changed, but ignoring this because Windows is already installed." - info "Please start with an empty /storage folder, if you want to install a different version of Windows." - fi - return 0 + + if ! hasDisk; then + + rm -f "$STORAGE/$previous" + return 1 + fi - rm -f "$STORAGE/$previous" + + if [[ "${iso,,}" == "${STORAGE,,}/windows."* ]]; then + method="your custom .iso file was changed" + else + if [[ "${previous,,}" != "windows."* ]]; then + method="the VERSION variable was changed" + else + method="your custom .iso file was removed" + + if [ -f "$boot" ]; then + info "Detected that $method, will be ignored." + return 0 + fi + + fi + fi + + info "Detected that $method, a backup of your previous installation will be saved..." + ! backup "$STORAGE/$previous" && error "Backup failed!" + return 1 + fi fi + fi [ -f "$boot" ] && hasDisk && return 0 @@ -51,8 +115,10 @@ skipInstall() { byte="16" && [[ "$MANUAL" == [Yy1]* ]] && byte="17" if [[ "$magic" != "$byte" ]]; then + info "The ISO will be processed again because the configuration was changed..." return 1 + fi return 0 @@ -69,8 +135,8 @@ startInstall() { if [[ "${VERSION,,}" == "http"* ]]; then file=$(basename "${VERSION%%\?*}") - : "${file//+/ }"; printf -v file '%b' "${_//%/\\x}" - file=$(echo "$file" | sed -e 's/[^A-Za-z0-9._-]/_/g') + printf -v file '%b' "${file//%/\\x}" + file="${file//[!A-Za-z0-9._-]/_}" else @@ -88,10 +154,18 @@ startInstall() { fi + TMP="$STORAGE/tmp" + rm -rf "$TMP" + skipInstall "$BOOT" && return 1 - rm -rf "$TMP" - mkdir -p "$TMP" + if hasDisk; then + ! backup "" && error "Backup failed!" + fi + + if ! makeDir "$TMP"; then + error "Failed to create directory \"$TMP\" !" + fi if [ -z "$CUSTOM" ]; then @@ -105,6 +179,25 @@ startInstall() { fi rm -f "$BOOT" + + find "$STORAGE" -maxdepth 1 -type f -iname 'data.*' -not -iname '*.iso' -delete + find "$STORAGE" -maxdepth 1 -type f -iname 'windows.*' -not -iname '*.iso' -delete + find "$STORAGE" -maxdepth 1 -type f \( -iname '*.rom' -or -iname '*.vars' \) -delete + + return 0 +} + +writeFile() { + + local txt="$1" + local path="$2" + + echo "$txt" >"$path" + + if ! setOwner "$path"; then + error "Failed to set the owner for \"$path\" !" + fi + return 0 } @@ -118,6 +211,10 @@ finishInstall() { error "Failed to find ISO file: $iso" && return 1 fi + if [[ "$iso" == "$STORAGE/"* ]]; then + ! setOwner "$iso" && error "Failed to set the owner for \"$iso\" !" + fi + if [[ "$aborted" != [Yy1]* ]]; then # Mark ISO as prepared via magic byte byte="16" && [[ "$MANUAL" == [Yy1]* ]] && byte="17" @@ -126,52 +223,68 @@ finishInstall() { fi fi - rm -f "$STORAGE/windows.old" - rm -f "$STORAGE/windows.vga" - rm -f "$STORAGE/windows.args" - rm -f "$STORAGE/windows.base" - rm -f "$STORAGE/windows.boot" - rm -f "$STORAGE/windows.mode" - rm -f "$STORAGE/windows.type" - - cp -f /run/version "$STORAGE/windows.ver" + local file="$STORAGE/windows.ver" + cp -f /run/version "$file" + ! setOwner "$file" && error "Failed to set the owner for \"$file\" !" if [[ "$iso" == "$STORAGE/"* ]]; then if [[ "$aborted" != [Yy1]* ]] || [ -z "$CUSTOM" ]; then base=$(basename "$iso") - echo "$base" > "$STORAGE/windows.base" + file="$STORAGE/windows.base" + writeFile "$base" "$file" fi fi if [[ "${PLATFORM,,}" == "x64" ]]; then if [[ "${BOOT_MODE,,}" == "windows_legacy" ]]; then - echo "$BOOT_MODE" > "$STORAGE/windows.mode" + file="$STORAGE/windows.mode" + writeFile "$BOOT_MODE" "$file" if [[ "${MACHINE,,}" != "q35" ]]; then - echo "$MACHINE" > "$STORAGE/windows.old" + file="$STORAGE/windows.old" + writeFile "$MACHINE" "$file" fi else # Enable secure boot + TPM on manual installs as Win11 requires - if [[ "$MANUAL" == [Yy1]* ]] || [[ "$aborted" == [Yy1]* ]]; then + if [[ "$MANUAL" == [Yy1]* || "$aborted" == [Yy1]* ]]; then if [[ "${DETECTED,,}" == "win11"* ]]; then BOOT_MODE="windows_secure" - echo "$BOOT_MODE" > "$STORAGE/windows.mode" + file="$STORAGE/windows.mode" + writeFile "$BOOT_MODE" "$file" fi fi # Enable secure boot on multi-socket systems to workaround freeze if [ -n "$SOCKETS" ] && [[ "$SOCKETS" != "1" ]]; then BOOT_MODE="windows_secure" - echo "$BOOT_MODE" > "$STORAGE/windows.mode" + file="$STORAGE/windows.mode" + writeFile "$BOOT_MODE" "$file" fi fi fi if [ -n "${ARGS:-}" ]; then ARGUMENTS="$ARGS ${ARGUMENTS:-}" - echo "$ARGS" > "$STORAGE/windows.args" + file="$STORAGE/windows.args" + writeFile "$ARGS" "$file" + fi + + if [ -n "${VGA:-}" ] && [[ "${VGA:-}" != "virtio"* ]]; then + file="$STORAGE/windows.vga" + writeFile "$VGA" "$file" + fi + + if [ -n "${USB:-}" ] && [[ "${USB:-}" != "qemu-xhci"* ]]; then + file="$STORAGE/windows.usb" + writeFile "$USB" "$file" fi if [ -n "${DISK_TYPE:-}" ] && [[ "${DISK_TYPE:-}" != "scsi" ]]; then - echo "$DISK_TYPE" > "$STORAGE/windows.type" + file="$STORAGE/windows.type" + writeFile "$DISK_TYPE" "$file" + fi + + if [ -n "${ADAPTER:-}" ] && [[ "${ADAPTER:-}" != "virtio-net-pci" ]]; then + file="$STORAGE/windows.net" + writeFile "$ADAPTER" "$file" fi rm -rf "$TMP" @@ -185,8 +298,9 @@ abortInstall() { local efi [[ "${iso,,}" == *".esd" ]] && exit 60 + [[ "${UNPACK:-}" == [Yy1]* ]] && exit 60 - efi=$(find "$dir" -maxdepth 1 -type d -iname efi | head -n 1) + efi=$(find "$dir" -maxdepth 1 -type d -iname efi -print -quit) if [ -z "$efi" ]; then [[ "${PLATFORM,,}" == "x64" ]] && BOOT_MODE="windows_legacy" @@ -207,16 +321,14 @@ abortInstall() { return 1 } -detectCustom() { +findFile() { local dir file base - local fname="custom.iso" + local fname="$1" local boot="$STORAGE/windows.boot" - CUSTOM="" - - dir=$(find / -maxdepth 1 -type d -iname "$fname" | head -n 1) - [ ! -d "$dir" ] && dir=$(find "$STORAGE" -maxdepth 1 -type d -iname "$fname" | head -n 1) + dir=$(find / -maxdepth 1 -type d -iname "$fname" -print -quit) + [ ! -d "$dir" ] && dir=$(find "$STORAGE" -maxdepth 1 -type d -iname "$fname" -print -quit) if [ -d "$dir" ]; then if ! hasDisk || [ ! -f "$boot" ]; then @@ -224,8 +336,8 @@ detectCustom() { fi fi - file=$(find / -maxdepth 1 -type f -iname "$fname" | head -n 1) - [ ! -s "$file" ] && file=$(find "$STORAGE" -maxdepth 1 -type f -iname "$fname" | head -n 1) + file=$(find / -maxdepth 1 -type f -iname "$fname" -print -quit) + [ ! -s "$file" ] && file=$(find "$STORAGE" -maxdepth 1 -type f -iname "$fname" -print -quit) if [ ! -s "$file" ] && [[ "${VERSION,,}" != "http"* ]]; then base=$(basename "$VERSION") @@ -241,31 +353,49 @@ detectCustom() { [ -z "$size" ] || [[ "$size" == "0" ]] && return 0 ISO="$file" - CUSTOM="$ISO" + CUSTOM="$file" BOOT="$STORAGE/windows.$size.iso" return 0 } +detectCustom() { + + CUSTOM="" + + ! findFile "custom.iso" && return 1 + [ -n "$CUSTOM" ] && return 0 + + ! findFile "boot.iso" && return 1 + [ -n "$CUSTOM" ] && return 0 + + return 0 +} + extractESD() { local iso="$1" local dir="$2" local version="$3" local desc="$4" - local size size_gb space space_gb desc + local size size_gb sizes space space_gb + local desc total total1 total2 total3 total4 + local imageIndex links links1 links2 links3 links4 - local msg="Extracting $desc bootdisk..." - info "$msg" && html "$msg" + local msg="Extracting $desc bootdisk" + info "$msg..." && html "$msg..." if [ "$(stat -c%s "$iso")" -lt 100000000 ]; then error "Invalid ESD file: Size is smaller than 100 MB" && return 1 fi rm -rf "$dir" - mkdir -p "$dir" - size=16106127360 + if ! makeDir "$dir"; then + error "Failed to create directory \"$dir\" !" && return 1 + fi + + size=9606127360 size_gb=$(formatBytes "$size") space=$(df --output=avail -B 1 "$dir" | tail -n 1) space_gb=$(formatBytes "$space") @@ -277,40 +407,74 @@ extractESD() { local esdImageCount esdImageCount=$(wimlib-imagex info "$iso" | awk '/Image Count:/ {print $3}') - wimlib-imagex apply "$iso" 1 "$dir" --quiet 2>/dev/null || { + if [ -z "$esdImageCount" ]; then + error "Cannot read the image count in ESD file!" && return 1 + fi + + sizes=$(wimlib-imagex info "$iso" | grep "Total Bytes:") + links=$(wimlib-imagex info "$iso" | grep "Hard Link Bytes:") + + total1=$(awk "NR==1{ print; }" <<< "$sizes" | cut -d':' -f2 | sed 's/^ *//') + links1=$(awk "NR==1{ print; }" <<< "$links" | cut -d':' -f2 | sed 's/^ *//') + total=$(( total1 - links1 )) + + total3=$(awk "NR==3{ print; }" <<< "$sizes" | cut -d':' -f2 | sed 's/^ *//') + links3=$(awk "NR==3{ print; }" <<< "$links" | cut -d':' -f2 | sed 's/^ *//') + total3=$(( total3 - links3 )) + total3=$(( total3 + 60000000 )) + + /run/progress.sh "$dir" "$total" "$msg ([P])..." & + + imageIndex="1" + wimlib-imagex apply "$iso" "$imageIndex" "$dir" --quiet 2>/dev/null || { retVal=$? - error "Extracting $desc bootdisk failed" && return $retVal + fKill "progress.sh" + error "Extracting $desc bootdisk failed ($retVal)" && return 1 } + fKill "progress.sh" + local bootWimFile="$dir/sources/boot.wim" local installWimFile="$dir/sources/install.wim" - local msg="Extracting $desc environment..." - info "$msg" && html "$msg" + local msg="Extracting $desc environment" + info "$msg..." && html "$msg..." - wimlib-imagex export "$iso" 2 "$bootWimFile" --compress=none --quiet || { + imageIndex="2" + /run/progress.sh "$bootWimFile" "$total3" "$msg ([P])..." & + + wimlib-imagex export "$iso" "$imageIndex" "$bootWimFile" --compress=none --quiet || { retVal=$? - error "Adding WinPE failed" && return ${retVal} + fKill "progress.sh" + error "Adding WinPE failed ($retVal)" && return 1 } - local msg="Extracting $desc setup..." - info "$msg" && html "$msg" + fKill "progress.sh" - wimlib-imagex export "$iso" 3 "$bootWimFile" --compress=none --boot --quiet || { + local msg="Extracting $desc setup" + info "$msg..." + + imageIndex="3" + /run/progress.sh "$bootWimFile" "$total3" "$msg ([P])..." & + + wimlib-imagex export "$iso" "$imageIndex" "$bootWimFile" --compress=none --boot --quiet || { retVal=$? - error "Adding Windows Setup failed" && return ${retVal} + fKill "progress.sh" + error "Adding Windows Setup failed ($retVal)" && return 1 } + fKill "progress.sh" + if [[ "${PLATFORM,,}" == "x64" ]]; then LABEL="CCCOMA_X64FRE_EN-US_DV9" else LABEL="CPBA_A64FRE_EN-US_DV9" fi - local msg="Extracting $desc image..." - info "$msg" && html "$msg" + local msg="Extracting $desc image" + info "$msg..." && html "$msg..." - local edition imageIndex imageEdition + local edition imageEdition edition=$(getCatalog "$version" "name") if [ -z "$edition" ]; then @@ -318,15 +482,27 @@ extractESD() { fi for (( imageIndex=4; imageIndex<=esdImageCount; imageIndex++ )); do - imageEdition=$(wimlib-imagex info "$iso" ${imageIndex} | grep '^Description:' | sed 's/Description:[ \t]*//') + + imageEdition=$(wimlib-imagex info "$iso" "$imageIndex" | grep '^Description:' | sed 's/Description:[ \t]*//') [[ "${imageEdition,,}" != "${edition,,}" ]] && continue - wimlib-imagex export "$iso" ${imageIndex} "$installWimFile" --compress=LZMS --chunk-size 128K --quiet || { + + total4=$(du -sb "$iso" | cut -f1) + total4=$(( total4 + 3000000 )) + + /run/progress.sh "$installWimFile" "$total4" "$msg ([P])..." & + + wimlib-imagex export "$iso" "$imageIndex" "$installWimFile" --compress=LZMS --chunk-size 128K --quiet || { retVal=$? - error "Addition of $imageIndex to the $desc image failed" && return $retVal + fKill "progress.sh" + error "Addition of $imageIndex to the $desc image failed ($retVal)" && return 1 } + + fKill "progress.sh" return 0 + done + fKill "progress.sh" error "Failed to find product '$edition' in install.wim!" && return 1 } @@ -336,7 +512,7 @@ extractImage() { local dir="$2" local version="$3" local desc="local ISO" - local size size_gb space space_gb + local file size size_gb space space_gb if [ -z "$CUSTOM" ]; then desc="downloaded ISO" @@ -350,18 +526,21 @@ extractImage() { return 1 fi - local msg="Extracting $desc image..." - info "$msg" && html "$msg" + local msg="Extracting $desc image" + info "$msg..." && html "$msg..." rm -rf "$dir" - mkdir -p "$dir" + + if ! makeDir "$dir"; then + error "Failed to create directory \"$dir\" !" && return 1 + fi size=$(stat -c%s "$iso") size_gb=$(formatBytes "$size") space=$(df --output=avail -B 1 "$dir" | tail -n 1) space_gb=$(formatBytes "$space") - if ((size<100000000)); then + if (( size < 100000000 )); then error "Invalid ISO file: Size is smaller than 100 MB" && return 1 fi @@ -370,12 +549,35 @@ extractImage() { fi rm -rf "$dir" + /run/progress.sh "$dir" "$size" "$msg ([P])..." & if ! 7z x "$iso" -o"$dir" > /dev/null; then + fKill "progress.sh" error "Failed to extract ISO file: $iso" && return 1 fi - LABEL=$(isoinfo -d -i "$iso" | sed -n 's/Volume id: //p') + fKill "progress.sh" + + if [[ "${UNPACK:-}" != [Yy1]* ]]; then + + LABEL=$(isoinfo -d -i "$iso" | sed -n 's/Volume id: //p') + + else + + file=$(find "$dir" -maxdepth 1 -type f -iname "*.iso" -print -quit) + + if [ -z "$file" ]; then + error "Failed to find any .iso file in archive!" && return 1 + fi + + if ! 7z x "$file" -o"$dir" > /dev/null; then + error "Failed to extract archive!" && return 1 + fi + + LABEL=$(isoinfo -d -i "$file" | sed -n 's/Volume id: //p') + rm -f "$file" + + fi return 0 } @@ -557,20 +759,19 @@ detectImage() { fi local src wim info - src=$(find "$dir" -maxdepth 1 -type d -iname sources | head -n 1) + src=$(find "$dir" -maxdepth 1 -type d -iname sources -print -quit) if [ ! -d "$src" ]; then warn "failed to locate 'sources' folder in ISO image, $FB" && return 1 fi - wim=$(find "$src" -maxdepth 1 -type f -iname install.wim | head -n 1) - [ ! -f "$wim" ] && wim=$(find "$src" -maxdepth 1 -type f -iname install.esd | head -n 1) + wim=$(find "$src" -maxdepth 1 -type f \( -iname install.wim -or -iname install.esd \) -print -quit) if [ ! -f "$wim" ]; then warn "failed to locate 'install.wim' or 'install.esd' in ISO image, $FB" && return 1 fi - info=$(wimlib-imagex info -xml "$wim" | tr -d '\000') + info=$(wimlib-imagex info -xml "$wim" | iconv -f UTF-16LE -t UTF-8) checkPlatform "$info" || exit 67 DETECTED=$(detectVersion "$info") @@ -589,7 +790,7 @@ detectImage() { desc=$(printEdition "$DETECTED" "$DETECTED") detectLanguage "$info" - if [[ "${LANGUAGE,,}" != "en" ]] && [[ "${LANGUAGE,,}" != "en-"* ]]; then + if [[ "${LANGUAGE,,}" != "en" && "${LANGUAGE,,}" != "en-"* ]]; then language=$(getLanguage "$LANGUAGE" "desc") desc+=" ($language)" fi @@ -597,7 +798,7 @@ detectImage() { info "Detected: $desc" setXML "" && return 0 - if [[ "$DETECTED" == "win81x86"* ]] || [[ "$DETECTED" == "win10x86"* ]]; then + if [[ "$DETECTED" == "win81x86"* || "$DETECTED" == "win10x86"* ]]; then error "The 32-bit version of $desc is not supported!" && return 1 fi @@ -648,13 +849,10 @@ updateXML() { local language="$2" local culture region user admin pass keyboard - if [ -n "${VM_NET_IP:-}" ]; then - sed -i "s/ 20.20.20.1 / ${VM_NET_IP%.*}.1 /g" "$asset" - fi - [ -z "$HEIGHT" ] && HEIGHT="720" [ -z "$WIDTH" ] && WIDTH="1280" + sed -i "s/>Windows for Docker$APP for $ENGINE1080<\/VerticalResolution>/$HEIGHT<\/VerticalResolution>/g" "$asset" sed -i "s/1920<\/HorizontalResolution>/$WIDTH<\/HorizontalResolution>/g" "$asset" @@ -683,22 +881,24 @@ updateXML() { user=$(echo "$USERNAME" | sed 's/[^[:alnum:]@!._-]//g') if [ -n "$user" ]; then + sed -i "s/-name \"Docker\"/-name \"$user\"/g" "$asset" sed -i "s/Docker<\/Name>/$user<\/Name>/g" "$asset" sed -i "s/where name=\"Docker\"/where name=\"$user\"/g" "$asset" sed -i "s/Docker<\/FullName>/$user<\/FullName>/g" "$asset" sed -i "s/Docker<\/Username>/$user<\/Username>/g" "$asset" fi - if [ -n "$PASSWORD" ]; then - pass=$(printf '%s' "${PASSWORD}Password" | iconv -f utf-8 -t utf-16le | base64 -w 0) - admin=$(printf '%s' "${PASSWORD}AdministratorPassword" | iconv -f utf-8 -t utf-16le | base64 -w 0) - sed -i "s/password<\/Value>/$admin<\/Value>/g" "$asset" - sed -i "s/true<\/PlainText>/<PlainText>false<\/PlainText>/g" "$asset" - sed -z "s/<Password>...........<Value \/>/<Password>\n <Value>$pass<\/Value>/g" -i "$asset" - sed -z "s/<Password>...............<Value \/>/<Password>\n <Value>$pass<\/Value>/g" -i "$asset" - sed -z "s/<AdministratorPassword>...........<Value \/>/<AdministratorPassword>\n <Value>$admin<\/Value>/g" -i "$asset" - sed -z "s/<AdministratorPassword>...............<Value \/>/<AdministratorPassword>\n <Value>$admin<\/Value>/g" -i "$asset" - fi + [ -n "$PASSWORD" ] && pass="$PASSWORD" || pass="admin" + + pw=$(printf '%s' "${pass}Password" | iconv -f utf-8 -t utf-16le | base64 -w 0) + admin=$(printf '%s' "${pass}AdministratorPassword" | iconv -f utf-8 -t utf-16le | base64 -w 0) + + sed -i "s/<Value>password<\/Value>/<Value>$admin<\/Value>/g" "$asset" + sed -i "s/<PlainText>true<\/PlainText>/<PlainText>false<\/PlainText>/g" "$asset" + sed -z "s/<Password>...........<Value \/>/<Password>\n <Value>$pw<\/Value>/g" -i "$asset" + sed -z "s/<Password>...............<Value \/>/<Password>\n <Value>$pw<\/Value>/g" -i "$asset" + sed -z "s/<AdministratorPassword>...........<Value \/>/<AdministratorPassword>\n <Value>$admin<\/Value>/g" -i "$asset" + sed -z "s/<AdministratorPassword>...............<Value \/>/<AdministratorPassword>\n <Value>$admin<\/Value>/g" -i "$asset" if [ -n "$EDITION" ]; then [[ "${EDITION^^}" == "CORE" ]] && EDITION="STANDARDCORE" @@ -788,7 +988,7 @@ addDrivers() { warn "Windows version unknown, falling back to Windows 11 drivers..." fi - if ! bsdtar -xf /drivers.txz -C "$drivers"; then + if ! bsdtar -xf /var/drivers.txz -C "$drivers"; then error "Failed to extract drivers from archive!" && return 1 fi @@ -857,21 +1057,20 @@ updateImage() { rm -rf "$tmp" mkdir -p "$tmp" - src=$(find "$dir" -maxdepth 1 -type d -iname sources | head -n 1) + src=$(find "$dir" -maxdepth 1 -type d -iname sources -print -quit) if [ ! -d "$src" ]; then error "failed to locate 'sources' folder in ISO image, $FB" && return 1 fi - wim=$(find "$src" -maxdepth 1 -type f -iname boot.wim | head -n 1) - [ ! -f "$wim" ] && wim=$(find "$src" -maxdepth 1 -type f -iname boot.esd | head -n 1) + wim=$(find "$src" -maxdepth 1 -type f \( -iname boot.wim -or -iname boot.esd \) -print -quit) if [ ! -f "$wim" ]; then error "failed to locate 'boot.wim' or 'boot.esd' in ISO image, $FB" && return 1 fi index="1" - result=$(wimlib-imagex info -xml "$wim" | tr -d '\000') + result=$(wimlib-imagex info -xml "$wim" | iconv -f UTF-16LE -t UTF-8) if [[ "${result^^}" == *"<IMAGE INDEX=\"2\">"* ]]; then index="2" @@ -927,7 +1126,7 @@ updateImage() { local find="$file" [[ "$MANUAL" == [Yy1]* ]] && find="$org" - path=$(find "$dir" -maxdepth 1 -type f -iname "$find" | head -n 1) + path=$(find "$dir" -maxdepth 1 -type f -iname "$find" -print -quit) if [ -f "$path" ]; then if [[ "$MANUAL" != [Yy1]* ]]; then @@ -971,8 +1170,8 @@ buildImage() { desc=$(printVersion "$DETECTED" "ISO") - local msg="Building $desc image..." - info "$msg" && html "$msg" + local msg="Building $desc image" + info "$msg..." && html "$msg..." [ -z "$LABEL" ] && LABEL="Windows" @@ -989,6 +1188,8 @@ buildImage() { error "Not enough free space in $STORAGE, have $space_gb available but need at least $size_gb." && return 1 fi + /run/progress.sh "$out" "$size" "$msg ([P])..." & + if [[ "${BOOT_MODE,,}" != "windows_legacy" ]]; then genisoimage -o "$out" -b "$ETFS" -no-emul-boot -c "$cat" -iso-level 4 -J -l -D -N -joliet-long -relaxed-filenames -V "${LABEL::30}" \ @@ -1009,6 +1210,8 @@ buildImage() { fi + fKill "progress.sh" + if [ -n "$failed" ]; then [ -s "$log" ] && echo "$(<"$log")" error "Failed to build image!" && return 1 @@ -1021,19 +1224,40 @@ buildImage() { [[ "$error" != "$hide" ]] && echo "$error" mv -f "$out" "$BOOT" || return 1 + ! setOwner "$BOOT" && error "Failed to set the owner for \"$BOOT\" !" + return 0 } bootWindows() { - rm -rf "$TMP" - if [ -f "$STORAGE/windows.args" ]; then ARGS=$(<"$STORAGE/windows.args") ARGS="${ARGS//[![:print:]]/}" ARGUMENTS="$ARGS ${ARGUMENTS:-}" fi + if [ -s "$STORAGE/windows.vga" ] && [ -f "$STORAGE/windows.vga" ]; then + if [ -z "${VGA:-}" ]; then + VGA=$(<"$STORAGE/windows.vga") + VGA="${VGA//[![:print:]]/}" + fi + fi + + if [ -s "$STORAGE/windows.usb" ] && [ -f "$STORAGE/windows.usb" ]; then + if [ -z "${USB:-}" ]; then + USB=$(<"$STORAGE/windows.usb") + USB="${USB//[![:print:]]/}" + fi + fi + + if [ -s "$STORAGE/windows.net" ] && [ -f "$STORAGE/windows.net" ]; then + if [ -z "${ADAPTER:-}" ]; then + ADAPTER=$(<"$STORAGE/windows.net") + ADAPTER="${ADAPTER//[![:print:]]/}" + fi + fi + if [ -s "$STORAGE/windows.type" ] && [ -f "$STORAGE/windows.type" ]; then if [ -z "${DISK_TYPE:-}" ]; then DISK_TYPE=$(<"$STORAGE/windows.type") @@ -1074,6 +1298,8 @@ if [ ! -s "$ISO" ] || [ ! -f "$ISO" ]; then fi fi +DIR="$TMP/unpack" + if ! extractImage "$ISO" "$DIR" "$VERSION"; then rm -f "$ISO" 2> /dev/null || true exit 62 diff --git a/src/mido.sh b/src/mido.sh index a11e8aa..369fc17 100644 --- a/src/mido.sh +++ b/src/mido.sh @@ -182,6 +182,7 @@ download_windows_eval() { local desc="$3" local filter="" local culture="" + local compare="" local language="" local user_agent="" local enterprise_type="" @@ -254,7 +255,7 @@ download_windows_eval() { iso_download_links=$(echo "$iso_download_page_html" | grep -io "$filter") || { # This should only happen if there's been some change to the download endpoint web address - if [[ "${lang,,}" == "en" ]] || [[ "${lang,,}" == "en-"* ]]; then + if [[ "${lang,,}" == "en" || "${lang,,}" == "en-"* ]]; then error "Windows server download page gave us no download link!" else language=$(getLanguage "$lang" "desc") @@ -264,28 +265,38 @@ download_windows_eval() { } case "$enterprise_type" in + "iot" | "ltsc" ) + case "${PLATFORM,,}" in + "x64" ) + if [[ "$windows_version" != "windows-10"* ]]; then + iso_download_link=$(echo "$iso_download_links" | head -n 1) + else + iso_download_link=$(echo "$iso_download_links" | head -n 4 | tail -n 1) + fi ;; + "arm64" ) + iso_download_link=$(echo "$iso_download_links" | head -n 2 | tail -n 1) ;; + esac ;; "enterprise" ) - iso_download_link=$(echo "$iso_download_links" | head -n 2 | tail -n 1) - ;; - "iot" ) - if [[ "${PLATFORM,,}" == "x64" ]]; then - iso_download_link=$(echo "$iso_download_links" | head -n 1) - fi - if [[ "${PLATFORM,,}" == "arm64" ]]; then - iso_download_link=$(echo "$iso_download_links" | head -n 2 | tail -n 1) - fi - ;; - "ltsc" ) - iso_download_link=$(echo "$iso_download_links" | head -n 4 | tail -n 1) - ;; + case "${PLATFORM,,}" in + "x64" ) + if [[ "$windows_version" != "windows-10"* ]]; then + iso_download_link=$(echo "$iso_download_links" | head -n 1) + else + iso_download_link=$(echo "$iso_download_links" | head -n 2 | tail -n 1) + fi ;; + "arm64" ) + iso_download_link=$(echo "$iso_download_links" | head -n 2 | tail -n 1) ;; + esac ;; "server" ) - iso_download_link=$(echo "$iso_download_links" | head -n 1) - ;; + case "${PLATFORM,,}" in + "x64" ) + iso_download_link=$(echo "$iso_download_links" | head -n 1) ;; + esac ;; * ) error "Invalid type specified, value \"$enterprise_type\" is not recognized!" && return 1 ;; esac - [[ "$DEBUG" == [Yy1]* ]] && echo "Found download link: $iso_download_link" + [ -z "$iso_download_link" ] && error "Could not parse download link from page!" && return 1 # Follow redirect so proceeding log message is useful # This is a request we make that Fido doesn't @@ -296,6 +307,30 @@ download_windows_eval() { return $? } + case "${PLATFORM,,}" in + "x64" ) + if [[ "${iso_download_link,,}" != *"x64"* ]]; then + echo "Found download link: $iso_download_link" + error "Download link is for the wrong platform? Please report this at $SUPPORT/issues" + return 1 + fi ;; + "arm64" ) + if [[ "${iso_download_link,,}" != *"a64"* && "${iso_download_link,,}" != *"arm64"* ]]; then + if [[ "$DEBUG" == [Yy1]* ]]; then + echo "Found download link: $iso_download_link" + echo "Link for ARM platform currently not available!" + fi + return 1 + fi ;; + esac + + if [[ "$DEBUG" == [Yy1]* && "$VERIFY" == [Yy1]* && "${lang,,}" == "en"* ]]; then + compare=$(getMido "$id" "$lang" "") + if [[ "${iso_download_link,,}" != "${compare,,}" ]]; then + echo "Retrieved link does not match the fixed link: $compare" + fi + fi + MIDO_URL="$iso_download_link" return 0 } @@ -315,7 +350,7 @@ getWindows() { case "${version,,}" in "win2008r2" | "win81${PLATFORM,,}"* | "win11${PLATFORM,,}-enterprise-iot"* | "win11${PLATFORM,,}-enterprise-ltsc"* ) - if [[ "${lang,,}" != "en" ]] && [[ "${lang,,}" != "en-"* ]]; then + if [[ "${lang,,}" != "en" && "${lang,,}" != "en-"* ]]; then error "No download in the $language language available for $edition!" MIDO_URL="" && return 1 fi ;; @@ -323,8 +358,7 @@ getWindows() { case "${version,,}" in "win11${PLATFORM,,}" ) ;; - "win11${PLATFORM,,}-enterprise-iot"* ) ;; - "win11${PLATFORM,,}-enterprise-ltsc"* ) ;; + "win11${PLATFORM,,}-enterprise"* ) ;; * ) if [[ "${PLATFORM,,}" != "x64" ]]; then error "No download for the ${PLATFORM^^} platform available for $edition!" @@ -353,6 +387,36 @@ getWindows() { return 0 } +getBuild() { + + local id="$1" + local ret="$2" + local url="" + local name="" + local build="$3" + local edition="" + local file="catalog.xml" + + case "${id,,}" in + "win11${PLATFORM,,}" ) + name="Windows 11 Pro" + url="https://worproject.com/dldserv/esd/getcatalog.php?build=${build}&arch=${PLATFORM^^}&edition=Professional" ;; + "win11${PLATFORM,,}-enterprise" | "win11${PLATFORM,,}-enterprise-eval") + name="Windows 11 Enterprise" + url="https://worproject.com/dldserv/esd/getcatalog.php?build=${build}&arch=${PLATFORM^^}&edition=Enterprise" ;; + esac + + case "${ret,,}" in + "url" ) echo "$url" ;; + "file" ) echo "$file" ;; + "name" ) echo "$name" ;; + "edition" ) echo "$edition" ;; + *) echo "";; + esac + + return 0 +} + getCatalog() { local id="$1" @@ -360,6 +424,12 @@ getCatalog() { local url="" local name="" local edition="" + local file="catalog.cab" + + if [[ "${id,,}" == "win11"* ]] && ! isCompatible; then + # ARMv8.0 cannot run Windows 11 builds 24H2 and up. + getBuild "$1" "$2" "22631.2861" && return 0 + fi case "${id,,}" in "win11${PLATFORM,,}" ) @@ -382,8 +452,9 @@ getCatalog() { case "${ret,,}" in "url" ) echo "$url" ;; + "file" ) echo "$file" ;; "name" ) echo "$name" ;; - "edition" ) echo "$edition" ;; + "edition" ) echo '[Edition="'"${edition}"'"]' ;; *) echo "";; esac @@ -396,82 +467,132 @@ getESD() { local version="$2" local lang="$3" local desc="$4" + local file + local result local culture local language - local editionName - local winCatalog size + local edition + local catalog + file=$(getCatalog "$version" "file") + catalog=$(getCatalog "$version" "url") culture=$(getLanguage "$lang" "culture") - winCatalog=$(getCatalog "$version" "url") - editionName=$(getCatalog "$version" "edition") + edition=$(getCatalog "$version" "edition") - if [ -z "$winCatalog" ] || [ -z "$editionName" ]; then + if [ -z "$file" ] || [ -z "$catalog" ]; then error "Invalid VERSION specified, value \"$version\" is not recognized!" && return 1 fi - local msg="Downloading product information from Microsoft server..." + local msg="Downloading catalog..." info "$msg" && html "$msg" rm -rf "$dir" - mkdir -p "$dir" - local wFile="catalog.cab" + if ! makeDir "$dir"; then + error "Failed to create directory \"$dir\" !" && return 1 + fi + local xFile="products.xml" local eFile="esd_edition.xml" local fFile="products_filter.xml" - { wget "$winCatalog" -O "$dir/$wFile" -q --timeout=30 --no-http-keep-alive; rc=$?; } || : + { wget "$catalog" -O "$dir/$file" -q --timeout=30 --no-http-keep-alive; rc=$?; } || : - msg="Failed to download $winCatalog" + msg="Failed to download $catalog" (( rc == 3 )) && error "$msg , cannot write file (disk full?)" && return 1 (( rc == 4 )) && error "$msg , network failure!" && return 1 (( rc == 8 )) && error "$msg , server issued an error response!" && return 1 (( rc != 0 )) && error "$msg , reason: $rc" && return 1 - cd "$dir" + if [[ "$file" == *".xml" ]]; then + + mv -f "$dir/$file" "$dir/$xFile" + + else + + cd "$dir" + + if ! cabextract "$file" > /dev/null; then + cd /run + error "Failed to extract $file!" && return 1 + fi - if ! cabextract "$wFile" > /dev/null; then cd /run - error "Failed to extract $wFile!" && return 1 - fi - cd /run + fi if [ ! -s "$dir/$xFile" ]; then - error "Failed to find $xFile in $wFile!" && return 1 + error "Failed to find $xFile in $file!" && return 1 fi - local edQuery='//File[Architecture="'${PLATFORM}'"][Edition="'${editionName}'"]' + local edQuery='//File[Architecture="'${PLATFORM,,}'"]'"${edition}"'' + result=$(xmllint --nonet --xpath "${edQuery}" "$dir/$xFile" 2>/dev/null) + + if [ -z "$result" ]; then + + edQuery='//File[Architecture="'${PLATFORM^^}'"]'"${edition}"'' + + result=$(xmllint --nonet --xpath "${edQuery}" "$dir/$xFile" 2>/dev/null) + + if [ -z "$result" ]; then + desc=$(printEdition "$version" "$desc") + language=$(getLanguage "$lang" "desc") + error "No download link available for $desc!" && return 1 + fi + + fi echo -e '<Catalog>' > "$dir/$fFile" - xmllint --nonet --xpath "${edQuery}" "$dir/$xFile" >> "$dir/$fFile" 2>/dev/null + echo "$result" >> "$dir/$fFile" echo -e '</Catalog>'>> "$dir/$fFile" - xmllint --nonet --xpath "//File[LanguageCode=\"${culture,,}\"]" "$dir/$fFile" >"$dir/$eFile" + result=$(xmllint --nonet --xpath "//File[LanguageCode=\"${culture,,}\"]" "$dir/$fFile" 2>/dev/null) - size=$(stat -c%s "$dir/$eFile") - if ((size<20)); then + if [ -z "$result" ]; then desc=$(printEdition "$version" "$desc") language=$(getLanguage "$lang" "desc") error "No download in the $language language available for $desc!" && return 1 fi + echo "$result" > "$dir/$eFile" + local tag="FilePath" - ESD=$(xmllint --nonet --xpath "//$tag" "$dir/$eFile" | sed -E -e "s/<[\/]?$tag>//g") + ESD=$(xmllint --nonet --xpath "//$tag" "$dir/$eFile" | sed -E -e "s/<[\/]?$tag>//g" 2>/dev/null) if [ -z "$ESD" ]; then error "Failed to find ESD URL in $eFile!" && return 1 fi tag="Sha1" - ESD_SUM=$(xmllint --nonet --xpath "//$tag" "$dir/$eFile" | sed -E -e "s/<[\/]?$tag>//g") + ESD_SUM=$(xmllint --nonet --xpath "//$tag" "$dir/$eFile" | sed -E -e "s/<[\/]?$tag>//g" 2>/dev/null) + + if [ -z "$ESD_SUM" ]; then + error "Failed to find ESD checksum in $eFile!" && return 1 + fi + tag="Size" - ESD_SIZE=$(xmllint --nonet --xpath "//$tag" "$dir/$eFile" | sed -E -e "s/<[\/]?$tag>//g") + ESD_SIZE=$(xmllint --nonet --xpath "//$tag" "$dir/$eFile" | sed -E -e "s/<[\/]?$tag>//g" 2>/dev/null) + + if [ -z "$ESD_SIZE" ]; then + error "Failed to find ESD filesize in $eFile!" && return 1 + fi rm -rf "$dir" return 0 } +isCompressed() { + + local file="$1" + + case "${file,,}" in + *".7z" | *".zip" | *".rar" | *".lzma" | *".bz" | *".bz2" ) + return 0 ;; + esac + + return 1 +} + verifyFile() { local iso="$1" @@ -479,8 +600,8 @@ verifyFile() { local total="$3" local check="$4" - if [ -n "$size" ] && [[ "$total" != "$size" ]] && [[ "$size" != "0" ]]; then - if [[ "$VERIFY" == [Yy1]* ]] || [[ "$DEBUG" == [Yy1]* ]]; then + if [ -n "$size" ] && [[ "$total" != "$size" && "$size" != "0" ]]; then + if [[ "$VERIFY" == [Yy1]* || "$DEBUG" == [Yy1]* ]]; then warn "The downloaded file has a different size ( $total bytes) than expected ( $size bytes). Please report this at $SUPPORT/issues" fi fi @@ -502,7 +623,7 @@ verifyFile() { fi if [[ "$hash" == "$check" ]]; then - info "Succesfully verified ISO!" && return 0 + info "Successfully verified ISO!" && return 0 fi error "The downloaded file has an unknown $algo checksum: $hash , as the expected value was: $check. Please report this at $SUPPORT/issues" @@ -517,9 +638,10 @@ downloadFile() { local size="$4" local lang="$5" local desc="$6" - local rc total total_gb progress domain dots space folder + local msg="Downloading $desc" + local rc total total_gb progress domain dots agent space folder - rm -f "$iso" + agent=$(get_agent) if [ -n "$size" ] && [[ "$size" != "0" ]]; then folder=$(dirname -- "$iso") @@ -535,8 +657,8 @@ downloadFile() { progress="--progress=dot:giga" fi - local msg="Downloading $desc" html "$msg..." + /run/progress.sh "$iso" "$size" "$msg ([P])..." & domain=$(echo "$url" | awk -F/ '{print $3}') dots=$(echo "$domain" | tr -cd '.' | wc -c) @@ -547,9 +669,9 @@ downloadFile() { fi info "$msg..." - /run/progress.sh "$iso" "$size" "$msg ([P])..." & + [[ "$DEBUG" == [Yy1]* ]] && echo "Downloading: $url" - { wget "$url" -O "$iso" -q --timeout=30 --no-http-keep-alive --show-progress "$progress"; rc=$?; } || : + { wget "$url" -O "$iso" --continue -q --timeout=30 --no-http-keep-alive --user-agent "$agent" --show-progress "$progress"; rc=$?; } || : fKill "progress.sh" @@ -557,39 +679,59 @@ downloadFile() { total=$(stat -c%s "$iso") total_gb=$(formatBytes "$total") if [ "$total" -lt 100000000 ]; then - error "Invalid download link: $url (is only $total_gb ?). Please report this at $SUPPORT/issues." && return 1 + error "Invalid download link: $url (is only $total_gb ?). Please report this at $SUPPORT/issues" && return 1 fi verifyFile "$iso" "$size" "$total" "$sum" || return 1 + isCompressed "$url" && UNPACK="Y" html "Download finished successfully..." && return 0 fi msg="Failed to download $url" (( rc == 3 )) && error "$msg , cannot write file (disk full?)" && return 1 (( rc == 4 )) && error "$msg , network failure!" && return 1 - (( rc == 8 )) && error "$msg , server issued an error response! Please report this at $SUPPORT/issues." && return 1 + (( rc == 8 )) && error "$msg , server issued an error response! Please report this at $SUPPORT/issues" && return 1 error "$msg , reason: $rc" return 1 } +delay() { + + local i + local delay="$1" + local msg="Will retry in X seconds..." + + info "${msg/X/$delay}" + + for i in $(seq "$delay" -1 1); do + html "${msg/X/$i}" + sleep 1 + done + + return 0 +} + downloadImage() { local iso="$1" local version="$2" local lang="$3" - local delay=5 local tried="n" local success="n" + local seconds="5" local url sum size base desc language - local msg="Will retry after $delay seconds..." if [[ "${version,,}" == "http"* ]]; then + base=$(basename "$iso") desc=$(fromFile "$base") + + rm -f "$iso" downloadFile "$iso" "$version" "" "" "" "$desc" && return 0 - info "$msg" && html "$msg" && sleep "$delay" + delay "$seconds" downloadFile "$iso" "$version" "" "" "" "$desc" && return 0 rm -f "$iso" + return 1 fi @@ -599,7 +741,7 @@ downloadImage() { desc=$(printVersion "$version" "") - if [[ "${lang,,}" != "en" ]] && [[ "${lang,,}" != "en-"* ]]; then + if [[ "${lang,,}" != "en" && "${lang,,}" != "en-"* ]]; then language=$(getLanguage "$lang" "desc") if ! validVersion "$version" "$lang"; then desc=$(printEdition "$version" "$desc") @@ -616,15 +758,17 @@ downloadImage() { if getWindows "$version" "$lang" "$desc"; then success="y" else - info "$msg" && html "$msg" && sleep "$delay" + delay "$seconds" getWindows "$version" "$lang" "$desc" && success="y" fi if [[ "$success" == "y" ]]; then size=$(getMido "$version" "$lang" "size" ) sum=$(getMido "$version" "$lang" "sum") + + rm -f "$iso" downloadFile "$iso" "$MIDO_URL" "$sum" "$size" "$lang" "$desc" && return 0 - info "$msg" && html "$msg" && sleep "$delay" + delay "$seconds" downloadFile "$iso" "$MIDO_URL" "$sum" "$size" "$lang" "$desc" && return 0 rm -f "$iso" fi @@ -635,7 +779,7 @@ downloadImage() { if isESD "$version" "$lang"; then if [[ "$tried" != "n" ]]; then - info "Failed to download $desc, will try a diferent method now..." + info "Failed to download $desc, will try a different method now..." fi tried="y" @@ -644,14 +788,16 @@ downloadImage() { if getESD "$TMP/esd" "$version" "$lang" "$desc"; then success="y" else - info "$msg" && html "$msg" && sleep "$delay" + delay "$seconds" getESD "$TMP/esd" "$version" "$lang" "$desc" && success="y" fi if [[ "$success" == "y" ]]; then ISO="${ISO%.*}.esd" + + rm -f "$ISO" downloadFile "$ISO" "$ESD" "$ESD_SUM" "$ESD_SIZE" "$lang" "$desc" && return 0 - info "$msg" && html "$msg" && sleep "$delay" + delay "$seconds" downloadFile "$ISO" "$ESD" "$ESD_SUM" "$ESD_SIZE" "$lang" "$desc" && return 0 rm -f "$ISO" ISO="$iso" @@ -664,14 +810,18 @@ downloadImage() { url=$(getLink "$i" "$version" "$lang") if [ -n "$url" ]; then + if [[ "$tried" != "n" ]]; then info "Failed to download $desc, will try another mirror now..." fi + tried="y" size=$(getSize "$i" "$version" "$lang") sum=$(getHash "$i" "$version" "$lang") + + rm -f "$iso" downloadFile "$iso" "$url" "$sum" "$size" "$lang" "$desc" && return 0 - info "$msg" && html "$msg" && sleep "$delay" + delay "$seconds" downloadFile "$iso" "$url" "$sum" "$size" "$lang" "$desc" && return 0 rm -f "$iso" fi diff --git a/src/power.sh b/src/power.sh index 4252dd8..98a6f73 100644 --- a/src/power.sh +++ b/src/power.sh @@ -1,11 +1,11 @@ #!/usr/bin/env bash set -Eeuo pipefail +: "${QEMU_TIMEOUT:="110"}" # QEMU Termination timeout + # Configure QEMU for graceful shutdown QEMU_TERM="" -QEMU_PORT=7100 -QEMU_TIMEOUT=110 QEMU_DIR="/run/shm" QEMU_PID="$QEMU_DIR/qemu.pid" QEMU_PTY="$QEMU_DIR/qemu.pty" @@ -35,7 +35,7 @@ boot() { grep -Fq "BOOTMGR is missing" "$QEMU_PTY" && fail="y" fi if [ -z "$fail" ]; then - info "Windows started succesfully, visit http://127.0.0.1:8006/ to view the screen..." + info "Windows started successfully, visit http://127.0.0.1:8006/ to view the screen..." return 0 fi fi @@ -74,6 +74,7 @@ ready() { finish() { local pid + local cnt=0 local reason=$1 touch "$QEMU_END" @@ -81,20 +82,32 @@ finish() { if [ -s "$QEMU_PID" ]; then pid=$(<"$QEMU_PID") - error "Forcefully terminating Windows, reason: $reason..." + echo && error "Forcefully terminating Windows, reason: $reason..." { kill -15 "$pid" || true; } 2>/dev/null while isAlive "$pid"; do + sleep 1 + cnt=$((cnt+1)) + # Workaround for zombie pid [ ! -s "$QEMU_PID" ] && break + + if [ "$cnt" == "5" ]; then + echo && error "QEMU did not terminate itself, forcefully killing process..." + { kill -9 "$pid" || true; } 2>/dev/null + fi + done + fi if [ ! -f "$STORAGE/windows.boot" ] && [ -f "$BOOT" ]; then # Remove CD-ROM ISO after install if ready; then - touch "$STORAGE/windows.boot" + local file="$STORAGE/windows.boot" + touch "$file" + ! setOwner "$file" && error "Failed to set the owner for \"$file\" !" if [[ "$REMOVE" != [Nn]* ]]; then rm -f "$BOOT" 2>/dev/null || true fi @@ -103,11 +116,19 @@ finish() { pid="/var/run/tpm.pid" [ -s "$pid" ] && pKill "$(<"$pid")" + rm -f "$pid" pid="/var/run/wsdd.pid" [ -s "$pid" ] && pKill "$(<"$pid")" + rm -f "$pid" - fKill "smbd" + pid="/var/run/samba/nmbd.pid" + [ -s "$pid" ] && pKill "$(<"$pid")" + rm -f "$pid" + + pid="/var/run/samba/smbd.pid" + [ -s "$pid" ] && pKill "$(<"$pid")" + rm -f "$pid" closeNetwork @@ -139,7 +160,7 @@ terminal() { fi if [ ! -c "$dev" ]; then - dev=$(echo 'info chardev' | nc -q 1 -w 1 localhost "$QEMU_PORT" | tr -d '\000') + dev=$(echo 'info chardev' | nc -q 1 -w 1 localhost "$MON_PORT" | tr -d '\000') dev="${dev#*serial0}" dev="${dev#*pty:}" dev="${dev%%$'\n'*}" @@ -188,7 +209,7 @@ _graceful_shutdown() { fi # Send ACPI shutdown signal - echo 'system_powerdown' | nc -q 1 -w 1 localhost "${QEMU_PORT}" > /dev/null + echo 'system_powerdown' | nc -q 1 -w 1 localhost "$MON_PORT" > /dev/null local cnt=0 while [ "$cnt" -lt "$QEMU_TIMEOUT" ]; do @@ -203,7 +224,7 @@ _graceful_shutdown() { info "Waiting for Windows to shutdown... ($cnt/$QEMU_TIMEOUT)" # Send ACPI shutdown signal - echo 'system_powerdown' | nc -q 1 -w 1 localhost "${QEMU_PORT}" > /dev/null + echo 'system_powerdown' | nc -q 1 -w 1 localhost "$MON_PORT" > /dev/null done @@ -215,7 +236,7 @@ _graceful_shutdown() { } SERIAL="pty" -MONITOR="telnet:localhost:$QEMU_PORT,server,nowait,nodelay" +MONITOR="telnet:localhost:$MON_PORT,server,nowait,nodelay" MONITOR+=" -daemonize -D $QEMU_LOG -pidfile $QEMU_PID" _trap _graceful_shutdown SIGTERM SIGHUP SIGINT SIGABRT SIGQUIT diff --git a/src/samba.sh b/src/samba.sh index cf45311..7cd3210 100644 --- a/src/samba.sh +++ b/src/samba.sh @@ -1,76 +1,123 @@ #!/usr/bin/env bash set -Eeuo pipefail -: "${SAMBA:="Y"}" +: "${SAMBA:="Y"}" # Enable Samba +: "${SAMBA_LEVEL:="1"}" # Logging level +: "${SAMBA_DEBUG:="N"}" # Disable debug + +tmp="/tmp/smb" +rm -rf "$tmp" + +rm -f /var/run/wsdd.pid +rm -f /var/run/samba/nmbd.pid +rm -f /var/run/samba/smbd.pid [[ "$SAMBA" == [Nn]* ]] && return 0 [[ "$NETWORK" == [Nn]* ]] && return 0 -hostname="host.lan" -interface="dockerbridge" - if [[ "$DHCP" == [Yy1]* ]]; then + socket="$IP" hostname="$IP" - interface="$VM_NET_DEV" + interfaces="$VM_NET_DEV" +else + hostname="host.lan" + case "${NETWORK,,}" in + "passt" | "slirp" ) + interfaces="lo" + socket="127.0.0.1" ;; + *) + socket="$VM_NET_IP" + interfaces="$VM_NET_BRIDGE" ;; + esac + if [ -n "${SAMBA_INTERFACE:-}" ]; then + interfaces+=",$SAMBA_INTERFACE" + fi fi -if [[ "${NETWORK,,}" == "user"* ]]; then - interface="127.0.0.1" -fi +html "Initializing shared folder..." +SAMBA_CONFIG="/etc/samba/smb.conf" +[[ "$DEBUG" == [Yy1]* ]] && echo "Starting Samba daemon..." addShare() { local dir="$1" - local name="$2" - local comment="$3" + local ref="$2" + local name="$3" + local comment="$4" + local cfg="$5" + local owner="" - mkdir -p "$dir" || return 1 + if [ ! -d "$dir" ]; then + if ! mkdir -p "$dir"; then + error "Failed to create shared folder ($dir)." && return 1 + fi + fi + + if ! ls -A "$dir" >/dev/null 2>&1; then + msg="No permission to access shared folder ($dir)." + msg+=" If SELinux is active, you need to add the \":Z\" flag to the bind mount." + error "$msg" && return 1 + fi + + if [ ! -w "$dir" ]; then + msg="shared folder ($dir) is not writeable!" + warn "$msg" + fi if [ -z "$(ls -A "$dir")" ]; then + if ! chmod 2777 "$dir"; then + error "Failed to set permissions for directory $dir" && return 1 + fi + owner=$(stat -c %u "$dir") + if [[ "$owner" == "0" ]]; then + if ! chown "1000:1000" "$dir"; then + error "Failed to set ownership for directory $dir" && return 1 + fi + fi + fi - chmod 777 "$dir" + if [[ "$dir" == "$tmp" ]]; then - { echo "--------------------------------------------------------" - echo " $APP for Docker v$(</run/version)..." - echo " For support visit $SUPPORT" - echo "--------------------------------------------------------" - echo "" - echo "Using this folder you can share files with the host machine." - echo "" - echo "To change its location, include the following bind mount in your compose file:" - echo "" - echo " volumes:" - echo " - \"/home/example:/${name,,}\"" - echo "" - echo "Or in your run command:" - echo "" - echo " -v \"/home/example:/${name,,}\"" - echo "" - echo "Replace the example path /home/example with the desired shared folder." - echo "" + { echo "--------------------------------------------------------" + echo " $APP for $ENGINE v$(</run/version)..." + echo " For support visit $SUPPORT" + echo "--------------------------------------------------------" + echo "" + echo "Using this folder you can exchange files with the host machine." + echo "" + echo "To select a folder on the host for this purpose, include the following bind mount in your compose file:" + echo "" + echo " volumes:" + echo " - \"./example:${ref}\"" + echo "" + echo "Or in your run command:" + echo "" + echo " -v \"\${PWD:-.}/example:${ref}\"" + echo "" + echo "Replace the example path ./example with your desired shared folder, which then will become visible here." + echo "" } | unix2dos > "$dir/readme.txt" fi - { echo "" - echo "[$name]" - echo " path = $dir" - echo " comment = $comment" - echo " writable = yes" - echo " guest ok = yes" - echo " guest only = yes" - echo " force user = root" - echo " force group = root" - } >> "/etc/samba/smb.conf" + { echo "" + echo "[$name]" + echo " path = $dir" + echo " comment = $comment" + echo " writable = yes" + echo " guest ok = yes" + echo " guest only = yes" + } >> "$cfg" return 0 } -{ echo "[global]" +{ echo "[global]" echo " server string = Dockur" echo " netbios name = $hostname" echo " workgroup = WORKGROUP" - echo " interfaces = $interface" + echo " interfaces = $interfaces" echo " bind interfaces only = yes" + echo " socket address = $socket" echo " security = user" echo " guest account = nobody" echo " map to guest = Bad User" @@ -78,51 +125,104 @@ addShare() { echo " follow symlinks = yes" echo " wide links = yes" echo " unix extensions = no" + echo " inherit owner = yes" + echo " create mask = 0666" + echo " directory mask = 02777" + echo " force user = root" + echo " force group = root" + echo " force create mode = 0666" + echo " force directory mode = 02777" echo "" - echo " # disable printing services" + echo " # Disable printing services" echo " load printers = no" echo " printing = bsd" echo " printcap name = /dev/null" echo " disable spoolss = yes" -} > "/etc/samba/smb.conf" +} > "$SAMBA_CONFIG" -share="/data" -[ ! -d "$share" ] && [ -d "$STORAGE/data" ] && share="$STORAGE/data" -[ ! -d "$share" ] && [ -d "/shared" ] && share="/shared" +# Add shared folders +share="/shared" [ ! -d "$share" ] && [ -d "$STORAGE/shared" ] && share="$STORAGE/shared" +[ ! -d "$share" ] && [ -d "/data" ] && share="/data" +[ ! -d "$share" ] && [ -d "$STORAGE/data" ] && share="$STORAGE/data" +[ ! -d "$share" ] && share="$tmp" -addShare "$share" "Data" "Shared" || error "Failed to create shared folder!" +! addShare "$share" "/shared" "Data" "Shared" "$SAMBA_CONFIG" && return 0 -[ -d "/data2" ] && addShare "/data2" "Data2" "Shared" -[ -d "/data3" ] && addShare "/data3" "Data3" "Shared" - -IFS=',' read -r -a dirs <<< "${SHARES:-}" -for dir in "${dirs[@]}"; do - [ ! -d "$dir" ] && continue - dir_name=$(basename "$dir") - addShare "$dir" "$dir_name" "Shared $dir_name" || error "Failed to create shared folder for $dir!" -done - -# Fix Samba permissions -[ -d /run/samba/msg.lock ] && chmod -R 0755 /run/samba/msg.lock -[ -d /var/log/samba/cores ] && chmod -R 0700 /var/log/samba/cores -[ -d /var/cache/samba/msg.lock ] && chmod -R 0755 /var/cache/samba/msg.lock - -if ! smbd; then - error "Samba daemon failed to start!" - smbd -i --debug-stdout || true +if [ -d "/shared2" ]; then + addShare "/shared2" "/shared2" "Data2" "Shared" "$SAMBA_CONFIG" || : +else + if [ -d "/data2" ]; then + addShare "/data2" "/shared2" "Data2" "Shared" "$SAMBA_CONFIG" || : + fi fi -if [[ "${BOOT_MODE:-}" == "windows_legacy" ]]; then - # Enable NetBIOS on Windows 7 and lower - if ! nmbd; then - error "NetBIOS daemon failed to start!" - nmbd -i --debug-stdout || true - fi +if [ -d "/shared3" ]; then + addShare "/shared3" "/shared3" "Data3" "Shared" "$SAMBA_CONFIG" || : else + if [ -d "/data3" ]; then + addShare "/data3" "/shared3" "Data3" "Shared" "$SAMBA_CONFIG" || : + fi +fi + +# Create directories if missing +mkdir -p /var/lib/samba/sysvol +mkdir -p /var/lib/samba/private +mkdir -p /var/lib/samba/bind-dns + +# Try to repair Samba permissions +[ -d /run/samba/msg.lock ] && chmod -R 0755 /run/samba/msg.lock 2>/dev/null || : +[ -d /var/log/samba/cores ] && chmod -R 0700 /var/log/samba/cores 2>/dev/null || : +[ -d /var/cache/samba/msg.lock ] && chmod -R 0755 /var/cache/samba/msg.lock 2>/dev/null || : + +rm -f /var/log/samba/log.smbd + +if ! smbd -l /var/log/samba; then + SAMBA_DEBUG="Y" + error "Failed to start Samba daemon!" +fi + +if [[ "$SAMBA_DEBUG" == [Yy1]* ]]; then + tail -fn +0 /var/log/samba/log.smbd --pid=$$ & +fi + +case "${NETWORK,,}" in + "passt" | "slirp" ) + return 0 ;; +esac + +if [[ "${BOOT_MODE:-}" == "windows_legacy" ]]; then + + # Enable NetBIOS on Windows 7 and lower + [[ "$DEBUG" == [Yy1]* ]] && echo "Starting NetBIOS daemon..." + + rm -f /var/log/samba/log.nmbd + + if ! nmbd -l /var/log/samba; then + SAMBA_DEBUG="Y" + error "Failed to start NetBIOS daemon!" + fi + + if [[ "$SAMBA_DEBUG" == [Yy1]* ]]; then + tail -fn +0 /var/log/samba/log.nmbd --pid=$$ & + fi + +else + # Enable Web Service Discovery on Vista and up - wsdd -i "$interface" -p -n "$hostname" & - echo "$!" > /var/run/wsdd.pid + [[ "$DEBUG" == [Yy1]* ]] && echo "Starting wsddn daemon..." + + rm -f /var/log/wsddn.log + + if ! wsddn -i "${interfaces%%,*}" -H "$hostname" --unixd --log-file=/var/log/wsddn.log --pid-file=/var/run/wsdd.pid; then + SAMBA_DEBUG="Y" + error "Failed to start wsddn daemon!" + fi + + if [[ "$SAMBA_DEBUG" == [Yy1]* ]]; then + tail -fn +0 /var/log/wsddn.log --pid=$$ & + fi + fi return 0