如何检查 cygwin mintty/bash 是否以管理员身份运行?

如何检查 cygwin mintty/bash 是否以管理员身份运行?

问题陈述:测试 Cygwinmintty bash会话是否“以管理员身份运行”的最优雅和最强大的方法是什么?

具体来说,为什么呢?mintty使用 Windows 时,我通常会打开多个终端(mintty没有选项卡)。最尴尬的是,当我需要找到一个终端窗口时,我通过右键单击“以管理员身份运行”来启动它,例如,当我想运行ping或其他一次性程序时。我想直观地指示终端会话的“以管理员身份运行”性质(通过更改启动文件中的bashshell 提示符变量)。PS1~/.bashrc

一些快速的潜在解决方案:

  1. 我可以比较一些环境变量的值。快速查看env输出,可以发现很多差异。但是,很难说哪个在移植到另一台 Windows 机器(可能运行不同版本的 Windows)方面最可靠。
  2. id,更具体地说,id -Gn如果以管理员身份运行,则会显示不同的组。在我的 Windows 7 机器中,我已将Administratorsroot添加到列表中。同样,我不确定这是否可移植。
  3. 我可以尝试将文件写入普通用户无法执行的位置。但我不想将任何文件写入陌生的地方——在某些想象的情况下,这可能会造成破坏(例如,存储介质故障),而且这在我看来非常不雅观。
  4. 运行一些 Windows 程序,这些程序将通过返回状态或输出指示命令是否以“管理员身份”运行。最好是一些具有与 UNIX 类似目的的程序id(1)命令(但原生存在于 Windows 或 Cygwin 中,但没有将 Windows 系统概念过于牵强地翻译为 POSIX 模拟概念)。

有什么更好或更优雅的建议吗?也许 cygwin 提供了专用于此目的的命令实用程序?

更新:97% 重复https://stackoverflow.com/questions/4051883/batch-script-how-to-check-for-admin-rights/- 不同之处在于这里使用bash而不是 (在我看来很奇怪和过时的) Windows cmd.exe。请检查那里的答案和评论。

答案1

我刚刚出于同样的原因编写了这个函数。我从来不知道哪个 shell 具有管理员权限。

function isadmin()
{
    net session > /dev/null 2>&1
    if [ $? -eq 0 ]; then echo "admin"
    else echo "user"; fi
}

它改编自这个答案https://stackoverflow.com/a/11995662/307968对于 Windows cmd shell。如果您是管理员,Net Session 将返回 0 状态。

现在我只需要改变我的提示,或者可能是标题栏颜色......

答案2

这个问题的明确答案来自Cygwin 邮件列表。如果启动进程的用户属于组 544(管理员),则该进程以管理员权限运行。此外,从 Cromax 下面的注释中可以看出,组 114(本地帐户和管理员组成员)有时也存在。这两个组的测试是

id -G | grep -qE '\<(114|544)\>'

或者在没有外部调用的情况下在 bash 中,

[[ "${GROUPS[@]}" =~ (^| )(114|544)( |$) ]]

例如,

id -G | grep -qE '\<(114|544)\>' && echo admin || echo user

过去,您还需要检查 /etc/group 中的组 0(根组)。但 Cygwin 中不再安装 /etc/group,如果存在,通常应将其删除,因此不再推荐也检查第 0 组。

答案3

我使用了 Windows 程序的返回值at。我还重新创建了 PROMPTING 特殊字符的功能\$

# Set a white $ initially
eStyle='\[\e[0m\]$'

# If 'at' succeeds, use a red # instead
at &> /dev/null && eStyle='\[\e[0;31m\]#\[\e[0m\]'  # Use # in red

PS1='\n\[\e[0;32m\]\u@\h \[\e[0;33m\]\w\[\e[0m\]\n'"$eStyle "

例子

答案4

id -G | grep -qE '\<(544|0)\>'对我来说似乎不起作用,因为即使提升了,我的输出也没有 <> 或 544。但是,由于写入需要提升%WINDIR%\system32,因此我使用它通过 shell 函数测试提升:

is_elevated() { 
   [[ $(uname -o) -eq "Cygwin" ]] || return 1
   touch $WINDIR/system32/.cyg_elevated &> /dev/null
}

当应用于史蒂文关于红色哈希字符的绝妙想法时:

is_elevated && PS1='\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n\[\e[0;31m\]#\[\e[0m\] '

相关内容