在 ms windows 中获取 userid 以进行 uid 和 gid 映射

Get userid in ms windows for uid and gid mapping

我有以下 Dockerfile:

FROM php:7-cli-alpine3.9

ARG USERID=1000
ARG GROUPID=1000

RUN apk add --no-cache --update bash bash-completion bash-doc &&\
    addgroup -g ${GROUPID} developer &&\
    mkdir -p /home/developer/code &&\
    adduser -D -u ${USERID} -G developer -h /home/developer -s /bin/bash developer &&\
    chown developer:developer -R /home/developer/code &&\
    php -r "copy('https://getcomposer.org/installer', '/tmp/composer-setup.php');"&&\
    php -r "if (hash_file('sha384', '/tmp/composer-setup.php') === '48e3236262b34d30969dca3c37281b3b4bbe3221bda826ac6a9a62d6444cdb0dcd0615698a5cbe587c3f0fe57a54d8f5') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" &&\
    php /tmp/composer-setup.php --install-dir=bin --filename=composer &&\
    php -r "unlink('composer-setup.php');" &&\
    chmod +x /bin/composer

VOLUME /home/developer/code
WORKDIR /home/developer/code
USER developer

ENTRYPOINT /bin/bash

我可以通过以下方式构建它 docker-compose.yml:

version: '3'
services:
  php:
    build:
      context: .
      dockerfile: ./Dockerfile
      args:
        USERID: $USERID
        GROUPID: $GROUPID
    image: 'pcmagas/rover_php'
    stdin_open: true
    tty: true
    volumes:
     - './:/home/developer/code'

因此,通过 .env 文件提供 $USERID$GROUPID 的值,每个开发人员都可以为其 GNU/Linux 本地用户构建自定义的、量身定制的图像运行 将图像导入 his/her 计算机。此外,he/she 可以通过以下 GNU/Linux 命令获取用户和组 ID:

id -u # For user id
id -g # For group id

但是在 Microsoft windows 上,我如何才能获得正确的用户和组 ID,以便将位于图像内部的用户 ID 和组 ID 正确映射到位于图像外部的用户 ID 和组 ID?

在 Windows 上,用户属于多个组,而不是特定组。从技术上讲,用户令牌有一个 TokenPrimaryGroup 属性,可能是为了提供某种 UNIX 兼容性,但我认为 Windows 没有附带打印此 SID 的工具。

您可以在 Vista+ 上使用 whoami.exe 获取用户 SID (SecurityID):

批处理文件:

for /F "tokens=1,2 delims=: " %%A in ('WhoAmI /USER /FO LIST') do @if /I "%%~A" == "SID" echo %%B

互动cmd.exe:

for /F "tokens=1,2 delims=: " %A in ('WhoAmI /USER /FO LIST') do @if /I "%~A" == "SID" echo %B

用户 SID 标识特定计算机或域上的用户。 SID 的最后一部分(RID)是 machine/domain.

上的唯一用户部分

如果您绝对需要 "a group",您可以解析 WHOAMI /GROUPS /FO LIST 的输出并查找 S-1-5-32-544(管理员),而无需 仅拒绝 !如果存在,则用户是管理员,如果不存在,则可能只是用户 (S-1-5-32-545)。你也可以看看 how Samba maps groups.