문제

사용자가 Windows XP에서 관리 권한으로 실행 중인지 여부를 감지하는 방법을 알아 내려고합니다. 이것은 Vista/Win7에서 할 수있는 매우 쉽습니다. 우아미 명령. Vista에서 그것을하는 방법에 대한 Ruby의 스 니펫은 다음과 같습니다.

다음 링크는 이제 Mutew가 제안한 솔루션을 통합합니다.

http://gist.github.com/65931

문제는 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...
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top