Windows XP에서 관리자 권한으로 실행되는 경우 감지하십시오
-
05-09-2019 - |
문제
사용자가 Windows XP에서 관리 권한으로 실행 중인지 여부를 감지하는 방법을 알아 내려고합니다. 이것은 Vista/Win7에서 할 수있는 매우 쉽습니다. 우아미 명령. Vista에서 그것을하는 방법에 대한 Ruby의 스 니펫은 다음과 같습니다.
다음 링크는 이제 Mutew가 제안한 솔루션을 통합합니다.
문제는 Whoami가 Windows XP와 함께 제공되지 않으므로 위의 링크 된 방법은 관리자로 실행중인 경우에도 WinXP에서 항상 False를 반환합니다.
그렇다면 Ruby, 명령 줄 도구, 배치 파일 또는 타사 (오픈 소스, 실제로 필요한) 도구를 사용하여 Windows XP에서 관리자로 실행되는지 여부를 감지하는 방법을 알고 있습니까?
해결책
사용자가 높은 모드로 실행 중인지 여부가 감지됩니다 (예 : "관리자로 실행 된 명령 프롬프트). 로컬 서비스 계정 Reg 키를 읽기 위해 관리자 권한이 필요하다는 사실에 의존합니다.
reg query "HKU\S-1-5-19"
읽을 수없는 경우 0이 아닌 오류 코드를 반환하고 가능하면 0이됩니다.
XP에서 작동합니다 ...
다른 팁
당신이 달리면
>net localgroup administrators
명령 쉘에서는 Windows XP에서 관리자 계정 목록을 가져와야합니다. 출력을 구문 분석하고 스캔하여 원하는 특정 사용자 계정을 확인하십시오. 예를 들어 현재 사용자가 관리자인지 확인하려면
>net localgroup administrators | find "%USERNAME%"
piskvor 옵션은 정상적으로 또는이 URL을 확인하십시오http://weseetips.com/2008/04/16/how-to-check--whether-current-user-have-administrator-privilege/
이것은 해당 페이지의 코드입니다
SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
PSID AdministratorsGroup;
// Initialize SID.
if( !AllocateAndInitializeSid( &NtAuthority,
2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS,
0, 0, 0, 0, 0, 0,
&AdministratorsGroup))
{
// Initializing SID Failed.
return false;
}
// Check whether the token is present in admin group.
BOOL IsInAdminGroup = FALSE;
if( !CheckTokenMembership( NULL,
AdministratorsGroup,
&IsInAdminGroup ))
{
// Error occurred.
IsInAdminGroup = FALSE;
}
// Free SID and return.
FreeSid(AdministratorsGroup);
return IsInAdminGroup;
확인하십시오 CheckTokenMembership 방법. ISUSERADMIN () 구현 샘플과 해당 기능이 예상되는 것을 반환하지 않고 개선하기 위해 수행해야 할 일에 대한 다른 유용한 커뮤니티 피드백이 있습니다.
이것은 껍질을 벗기지 않고 알게 될 것입니다.
require 'win32/registry'
is_admin = false
begin
Win32::Registry::HKEY_USERS.open('S-1-5-19') {|reg| }
is_admin = true
rescue
end
이 전략은 피터와 비슷하지만 오버 헤드가 적습니다.
다음은 더 나은 (PowerShell) 방법입니다. https://stackoverflow.com/a/16617861/863980
한 줄로, 당신은 말할 수 있습니다 (포쉬로 복사/붙여 넣기가 작동합니다) :
(@(([ADSI]"WinNT://./Administrators,group").psbase.Invoke("Members")) | `
foreach {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)}) -contains "Administrator"
=> 반환 True
사용자가 관리자 그룹에 속하는 경우 (사용자 확인과는 달리 사용자는 관리자 임)
(참고 : Backtick 또는 Grave Accent`PowerShell에서 캐리지 리턴을 빠져 나와 Ruby에서는 C ++의 시스템 ( '명령')과 같은 쉘 명령을 실행합니다.)
루비에서는 말할 수 있습니다 (IRB에서 복사/붙여 넣기) :
def is_current_user_local_admin?
return `powershell "(@(([ADSI]'WinNT://./Administrators,group').psbase.Invoke('Members')) | foreach {$_.GetType().InvokeMember('Name', 'GetProperty', $null, $_, $null)}) -contains 'Administrator'"`.include? "True"
end
그래도 (더 나은) WMI 방법을 모르면됩니다. 그것으로, 당신은 (다시 루비에서)와 같은 일을 할 수있었습니다.
require 'win32ole'
wmi = WIN32OLE.connect('WinNT://./Administrators,group')
# don't know what should come here...