【问题标题】:Get userid in ms windows for uid and gid mapping在 ms windows 中获取用户 ID 用于 uid 和 gid 映射
【发布时间】:2019-05-24 19:33:24
【问题描述】:

我有以下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 本地用户构建定制的、量身定制的映像。此外,他/她可以通过以下 GNU/Linux 命令获取用户和组 ID:

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

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

【问题讨论】:

  • 您只需要 Windows 等效值还是完全相同的值?
  • 获取用户和组 id 的 windows 等效命令,以防此 docker 映像未更改地运行到 ms windows。

标签: windows docker docker-compose uid


【解决方案1】:

在 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)的最后一部分是该机器/域上的唯一用户部分。

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

【讨论】:

  • 那么 GNU/Linux userid = SID 和 GNU/LINUX group groupid = SID 吗?
  • 是的,SID 字符串 (S-1-...) 标识用户、组和机器。有些 SID 是不变的(管理员和用户组 (S-1-5-...)),有些是唯一的(机器和域)。
  • 我还需要以某种方式将其设为整数。 Unix 中的 AFAIK Useris 也是无符号整数。
  • 好吧,SID 不是整数,它们至少有 10 个字节(忽略版本)。用户 RID(最后一个破折号后的数字)仅在特定机器上是唯一的。见docs.microsoft.com/en-us/windows/desktop/secauthz/…en.wikipedia.org/wiki/Security_Identifier
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-12
  • 2017-01-02
  • 2022-11-07
  • 2010-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多