お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"誰でもOKなセキュリティ属性の取得関数"



はーい。 かとちんです。\(^0^)/




システム資源よりのオブジェクト(セマフォやらメモリマッピングやら)は
高度な権限を持ったユーザがデフォルトのセキュリティ属性(nil)によっ
て、生成しちゃうと、普通のプロセスと共有できなくなっちゃいます。
例えばサービス内でオブジェクトを生成しようものなら、ログオンしているア
ドミニストレータが起動した通常プロセスさえ共有できないという...

んで、解決方法は「誰でもOKセキュリティ属性」を生成すれば良いのですが
その具体的な方法が過去ログになかったようなので、載っけます。

NT/2000プログラムで、CreateMutex、CreateSemaphoreの第1パラメタや、
CreateFileMapping の第2パラメタ、CreateMailSlotの第4パラメタなどに
御利用ください。

-------------------------関数本体------------------------------------
(*
 * 引数が多いですがご勘弁を。セキュリティ属性はポインタが入り組んで
 * いるので回避できないのです。
 * スレッドセーフにするために変数の外部定義はしたくなかったし。
 *)
function GetAllUserAccessSA(var SD: TSecurityDescriptor;
 var SA: TSecurityAttributes): PSecurityAttributes;
var
  VI: TOSVersionInfo;
begin
  Result := nil;
  FillChar(SD, SizeOf(SD), 0);
  FillChar(SA, SizeOf(SA), 0);
  VI.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
  if GetVersionEx(VI) and (VI.dwPlatformId = VER_PLATFORM_WIN32_NT) then
  begin
    if not InitializeSecurityDescriptor(@SD, SECURITY_DESCRIPTOR_REVISION) then
      RaiseLastWin32Error;
    if not SetSecurityDescriptorDacl(@SD, True, nil, False) then
      RaiseLastWin32Error;

    SA.nLength := SizeOf(SA);
    SA.lpSecurityDescriptor := @SD;
    SA.bInheritHandle := False;
    Result := @SA;
  end;
end;

------------------- 使用例 -------------------------------------------

var
  SD: TSecurityDescriptor;
  SA: TSecurityAttributes;
  hMutex: THandle;
begin
  hMutex := CreateMutex(GetAllUserAccessSA(SD, SA), True, 'MyXObj');
    :
end;


▲●    2000/12/11 16:54 JDX06162(とんちんかんちんかとちん)
 ■     Inprise Delphi ... The Great Development Kit
uses D2Desktop, D3CSS, D4CSS, D5ENT;
 


- FDELPHI  MES(16):玉石混淆みんなで作るSample蔵【見本蓄積】 00/12/14 -

Original document by かとちん        氏 ID:(JDX06162)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum