社本@元ネオニート Blog

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

AILight Banner
AILight Blog

プロフィール

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

目次

Blog 利用状況

記事分類

過去の記事

タグ

整合性レベル (IntegrityLevel) の低いプロセスの作成方法 - Windows Vista

整合性レベル (IntegrityLevel) の低いプロセスの作成方法です。

整合性レベルが高い状態のインストーラやアップデータから
アプリケーションを起動する時に使うといいでしょう。
単純にCreateProcess APIを使うと、整合性レベルが高い
アプリケーションが起動してしまうので、安全性が低くなり
望ましくありません。

---
#define SID_INTEGRITYLEVEL_LOW     _T("S-1-16-4096")
#define SID_INTEGRITYLEVEL_MEDIUM    _T("S-1-16-8192")
#define SID_INTEGRITYLEVEL_HIGH     _T("S-1-16-12288")

 static HRESULT CreateProcessAsUser(LPCTSTR szApplicationName, LPTSTR szCommandLine = _T(""), LPCTSTR szSid = SID_INTEGRITYLEVEL_LOW, HANDLE hProcess = ::GetCurrentProcess())
 {
  HANDLE hToken = NULL;
  BOOL br = ::OpenProcessToken(hProcess, MAXIMUM_ALLOWED, &hToken);
  if (!br)
  {
   return E_FAIL;
  }

  HANDLE hNewToken = NULL;
  br = ::DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL, SecurityImpersonation, TokenPrimary, &hNewToken);
  if (br == FALSE)
  {
   ::CloseHandle(hToken);
   return E_FAIL;
  }

  PSID pSid = NULL;
  br = CSidHelper::Probe_ConvertStringSidToSid(szSid, &pSid);
  if (!br)
  {
   ::CloseHandle(hToken);
   ::CloseHandle(hNewToken);
   return E_FAIL;
  }

  if (pSid == NULL)
  {
   ::CloseHandle(hToken);
   ::CloseHandle(hNewToken);
   ::LocalFree(pSid);
   return E_FAIL;
  }

  br = CSidHelper::Probe_IsValidSid(pSid);
  if (!br)
  {
   ::CloseHandle(hToken);
   ::CloseHandle(hNewToken);
   ::LocalFree(pSid);
   return E_FAIL;
  }

  TOKEN_MANDATORY_LABEL tokenMandatoryLabel = { 0 };
  tokenMandatoryLabel.Label.Attributes = SE_GROUP_INTEGRITY;
  tokenMandatoryLabel.Label.Sid = pSid;

  // プロセスの整合性レベルの設定
  br = ::SetTokenInformation(hNewToken, TokenIntegrityLevel, &tokenMandatoryLabel, sizeof(TOKEN_MANDATORY_LABEL) + CSidHelper::Probe_GetLengthSid(pSid));
  if (!br)
  {
   ::CloseHandle(hToken);
   ::CloseHandle(hNewToken);
   ::LocalFree(pSid);
   return E_FAIL;
  }

  STARTUPINFO startupInfo = { 0 };
  PROCESS_INFORMATION processInfomation = { 0 };
  br = ::CreateProcessAsUser(hNewToken, szApplicationName, szCommandLine, NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInfomation);
  if (!br)
  {
   ::CloseHandle(hToken);
   ::CloseHandle(hNewToken);
   ::LocalFree(pSid);
   return E_FAIL;
  }

  ::CloseHandle(hToken);
  ::CloseHandle(hNewToken);
  ::LocalFree(pSid);

  return S_OK;
 }
---

投稿日時 : 2007年1月19日 21:58


コメントを追加

タイトル
名前
URL
コメント