stdlib/os: add isAdmin (#17012)
* stdlib/os: add isAdmin * uint8 -> cuchar, assert isAdmin on Azure Co-authored-by: Timothee Cour <timothee.cour2@gmail.com> * Update lib/pure/os.nim docs Co-authored-by: Timothee Cour <timothee.cour2@gmail.com> * Address comments on #17012 * Raise on errors in #17012 * Check the result of FreeSid in #17012 * Change case in #17012 * Fix memory leak in #17012 * Address comments in #17012 Co-authored-by: Timothee Cour <timothee.cour2@gmail.com> Co-authored-by: Timothee Cour <timothee.cour2@gmail.com>
This commit is contained in:
parent
d1e093207a
commit
31424b3808
4 changed files with 84 additions and 0 deletions
|
|
@ -1688,6 +1688,36 @@ proc setFilePermissions*(filename: string, permissions: set[FilePermission],
|
|||
var res2 = setFileAttributesA(filename, res)
|
||||
if res2 == - 1'i32: raiseOSError(osLastError(), $(filename, permissions))
|
||||
|
||||
proc isAdmin*: bool {.noWeirdTarget.} =
|
||||
## Returns whether the caller's process is a member of the Administrators local
|
||||
## group (on Windows) or a root (on POSIX), via `geteuid() == 0`.
|
||||
when defined(windows):
|
||||
# Rewrite of the example from Microsoft Docs:
|
||||
# https://docs.microsoft.com/en-us/windows/win32/api/securitybaseapi/nf-securitybaseapi-checktokenmembership#examples
|
||||
# and corresponding PostgreSQL function:
|
||||
# https://doxygen.postgresql.org/win32security_8c.html#ae6b61e106fa5d6c5d077a9d14ee80569
|
||||
var ntAuthority = SID_IDENTIFIER_AUTHORITY(value: SECURITY_NT_AUTHORITY)
|
||||
var administratorsGroup: PSID
|
||||
if not isSuccess(allocateAndInitializeSid(addr ntAuthority,
|
||||
BYTE(2),
|
||||
SECURITY_BUILTIN_DOMAIN_RID,
|
||||
DOMAIN_ALIAS_RID_ADMINS,
|
||||
0, 0, 0, 0, 0, 0,
|
||||
addr administratorsGroup)):
|
||||
raiseOSError(osLastError(), "could not get SID for Administrators group")
|
||||
|
||||
defer:
|
||||
if freeSid(administratorsGroup) != nil:
|
||||
raiseOSError(osLastError(), "failed to free SID for Administrators group")
|
||||
|
||||
var b: WINBOOL
|
||||
if not isSuccess(checkTokenMembership(0, administratorsGroup, addr b)):
|
||||
raiseOSError(osLastError(), "could not check access token membership")
|
||||
|
||||
return isSuccess(b)
|
||||
else:
|
||||
return geteuid() == 0
|
||||
|
||||
proc createSymlink*(src, dest: string) {.noWeirdTarget.} =
|
||||
## Create a symbolic link at `dest` which points to the item specified
|
||||
## by `src`. On most operating systems, will fail if a link already exists.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue