C言語によるWindowsプログラミングの解説サイトです。 書籍Windows Internalsの解説はこちらをご確認ください。
フォルダやレジストリキーのような階層を持つオブジェクトは、コンテナオブジェクトと呼ばれることがあります。 コンテナオブジェクトに設定されているACEは、その下位に存在するコンテナオブジェクトとリーフオブジェクトに継承させることができるため、 コンテナオブジェクトとリーフオブジェクトのセキュリティは基本的に矛盾しません。 つまり、フォルダを読み取り専用にした場合は、その下位に作成したファイルも通常は読み取り専用になります。 ここで言うデフォルトとは、セキュリティ記述子を指定せずにファイルを作成することであり、 ACEが継承ACEであるかどうかは、次のコードで確認することができます。 GetAce(pDacl, i, (LPVOID *)&pAce); if (pAce->Header.AceFlags & INHERITED_ACE) { // ACEが継承ACEのときに実行される } He
プロセスのセキュリティコンテキストを昇格させるという行為は、慎重に行われるべきといえます。 たとえば、UACであれば昇格時にダイアログを表示するようにし、 実際に昇格を許可するかどうかの判断をユーザーに任せています。 これは当然といえば当然の話であり、プロセスが自動でセキュリティコンテキストを 昇格させることができるのであれば、何のために制限ユーザーとして実行しているのか分かりません。 しかしながら、プロセスが既に管理者として動作している場合は、 プロセスのセキュリティコンテキストをより強力なSYSTEMに昇格させることができます。 この方法を理解しておけば、たとえばWindows XPでSE_TCB_NAME特権が必要になった場合、 それをAdministratorsに割り当てて一度ログオフする必要はありません。 プロセスをSYSTEMとして実行することにより、SE_TCB_NAME特権
通信相手とコネクションを確立して相手のトークンを偽装する。 通信に使用したAPIが名前付きパイプならImpersonateNamedPipeClient、 SSPIならImpersonateSecurityContextになる。 上記の表の最初2つの方法は、特定のユーザーを偽装します。 よって、特定のユーザーとしてコードを実行したい場合は、これらの方法を利用することになります。 3つ目の方法は、既存のユーザーに特定の制限を加えて動作させたい場合に利用します。 アプリケーションがユーザーをログオンさせるというのは、 少し不思議に思えるところがあるかもしれません。 ログオンというのはPCを起動して、これからユーザーがWindowsを利用するときのみに 必要となるものではないでしょうか。 確かにこれはログオンの代表的な例ですが、実際のところログオンはいつでも行ってよいのです。 ユーザー名とパスワ
今回は、前節のサーバーのクライアントを作成します。 クライアントは名前付きパイプでサーバーに接続し、 サーバーがパイプに書き込んだ値を受信します。 #include <windows.h> int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow) { TCHAR szData[256]; DWORD dwResult; HANDLE hPipe; hPipe = CreateFile(TEXT("\\\\.\\pipe\\GetComputer"), GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); if (hPipe == INVALID_HANDLE_VALUE) { if (GetLastError() == ERRO
たとえば、タスクマネージャを起動してみるとこれらのアカウントで 動作するプログラムが存在することが確認できます。 上記したSIDの取得方法は既に説明済みです。 たとえば、AdministratorsのSIDを取得したいのであれば、 LookupAccountNameの第2引数に"Administrators"と指定すればよいだけです。 しかし、AllocateAndInitializeSidを使えばより簡単にSIDを作成できます。 BOOL AllocateAndInitializeSid( PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority, BYTE nSubAuthorityCount, DWORD dwSubAuthority0, DWORD dwSubAuthority1, DWORD dwSubAuthority2, DWORD dwS
通常のウインドウの状態から任意のタイミングでフルスクリーンに切り替えるようなとき、 ウインドウの状態のことをウインドウモードと呼び、 フルスクリーンの状態のことをフルスクリーンモードと呼びます。 前節で説明したように、これらの切り替えはChangeDisplaySettingsを呼ぶことによって可能ですが、 モードの切り替えというのは単純に解像度を変更するだけではありません。 ウインドウスタイルの変更も必要ですし、ウインドウの位置も変更しなければなりません。 それらの処理を1つの関数に実装すると、恐らく以下のような感じになると思われます。 void ChangeMode(HWND hwnd) { DEVMODE dv; g_bWindowMode = !g_bWindowMode; ShowCursor(g_bWindowMode); if (g_bWindowMode) { Change
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く