社本@元ネオニート Blog

社本@元ネオニート (元々ワック) のいたずら書き (for Programmers)

AILight Banner
AILight Blog

プロフィール

社本@元ネオニート Blog
働いたら負けかなと思っていたのですが。。とうとう働き始めました。アメリカのシアトル・エリアにある企業向けのバックアップソフトを開発している会社です。日本人は私だけ。なんとか。。やっていけてるようです。

目次

Blog 利用状況

記事分類

過去の記事

タグ

プロセスの整合性レベル (IntegrityLevel) の取得方法 - Windows Vista

プロセスの整合性レベル (IntegrityLevel) の取得方法です。

---
 // 整合性レベルの取得
 #define INTEGRITYLEVEL_UNKNOWN  -1
 #define INTEGRITYLEVEL_LOW   0
 #define INTEGRITYLEVEL_MEDIUM  1
 #define INTEGRITYLEVEL_HIGHT  2
 static int GetIntegrityLevel(HANDLE hProcess = ::GetCurrentProcess())
 {
  int nr = INTEGRITYLEVEL_UNKNOWN;

  CString strSid = thisClass::GetIntegrityLevelSid(hProcess);
  if (strSid.IsEmpty())
  {
   return INTEGRITYLEVEL_UNKNOWN;
  }

  if      (lstrcmpi(strSid, CSidHelper::GetWellKnownStringSid(WinLowLabelSid)) == 0)
  {
   nr = INTEGRITYLEVEL_LOW;
  }
  else if (lstrcmpi(strSid, CSidHelper::GetWellKnownStringSid(WinMediumLabelSid)) == 0)
  {
   nr = INTEGRITYLEVEL_MEDIUM;
  }
  else if (lstrcmpi(strSid, CSidHelper::GetWellKnownStringSid(WinHighLabelSid)) == 0)
  {
   nr = INTEGRITYLEVEL_HIGHT;
  }
  else
  {
   ATLASSERT(0);
   return INTEGRITYLEVEL_UNKNOWN;
  }

  return nr;
 }
 static CString GetIntegrityLevelSid(HANDLE hProcess = ::GetCurrentProcess())
 {
  CString strResult;
  HANDLE hToken = NULL;
  BOOL br = ::OpenProcessToken(hProcess, TOKEN_QUERY | TOKEN_QUERY_SOURCE, &hToken);
  if (!br)
  {
   return _T("");
  }

  DWORD dwLengthNeeded = 0;
  br = ::GetTokenInformation(hToken, TokenIntegrityLevel, NULL, 0, &dwLengthNeeded);
  if (!br)
  {
   DWORD dwError = ::GetLastError();
   if (dwError == ERROR_INSUFFICIENT_BUFFER)
   {
    PTOKEN_MANDATORY_LABEL pTokenMandatoryLabel = (PTOKEN_MANDATORY_LABEL)::LocalAlloc(0, dwLengthNeeded);
    if (pTokenMandatoryLabel == NULL)
    {
     return _T("");
    }

    br = ::GetTokenInformation(hToken, TokenIntegrityLevel, pTokenMandatoryLabel, dwLengthNeeded, &dwLengthNeeded);
    if (!br)
    {
     ::LocalFree(pTokenMandatoryLabel);
     return _T("");
    }

    strResult = CSidHelper::ConvertSidToStringSid(pTokenMandatoryLabel->Label.Sid);
    ::LocalFree(pTokenMandatoryLabel);
   }
  }

  return strResult;
 }
---

整合性レベル (IntegrityLevel) のSIDの取得方法は分かったんですが、
実際のSIDがどこを探しても、"低"のものがサンプルにちらっと記載が
あるだけなので、かなり困りました。。

コードにあるように、WELL_KNOWN_SID_TYPEに新たに定義された
WinLowLabelSid等をGetWellKnownStringSid APIを使えば、SIDが
取得できます。


■プロセスの整合性レベルの特定 - 保護モードの Internet Explorer の理解と機能 - MSDN
http://www.microsoft.com/japan/msdn/ie/general/protectedmode.aspx#dse_detil

■アクセストークンの種類 (TOKEN_INFORMATION_CLASS) - Windows Vista - 社本@ワック Blog
http://www.ailight.jp/blog/sha256/archive/2007/01/17/13516.aspx

■既知のSIDの取得方法 - Security - 社本@ワック Blog
http://www.ailight.jp/blog/sha256/archive/2005/01/23/3881.aspx

投稿日時 : 2007年1月17日 14:55


コメントを追加

#  整合性レベル (IntegrityLevel) のSID - Windows Vista 2007年1月17日 18:37 社本@ワック Blog

整合性レベル (IntegrityLevel) のSID - Windows Vista
タイトル
名前
URL
コメント