C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.38044 の関連記事表示

<< 0 >>
■38044  Re[2]: Environment.UserDomainNameについて
□投稿者/ たろ -(2009/07/06(Mon) 15:12:32)

    魔界の仮面弁士 さん
    ご返信ありがとうございます!

    Frameworkのバージョンによって使用するAPIの構成が違うんですね!
    勉強になります。。

    ということは、NET Framework1.1の環境で作成したwindowサービスを
    .NET Framework2.0の環境で起動させるにはEnvironment.UserDomainNameを使用せずに
    直接GetUserNameEx関数をCALLする必要があるってことですよね?



    No38041 (魔界の仮面弁士 さん) に返信
    > ■No38038 (たろ さん) に返信
    >>初歩的な質問です。
    > 本当に?
    >
    >
    >>.NET Framework1.1の環境で作成したwindowサービスを
    >>.NET Framework2.0の環境で起動しても、
    >>「マイコンピュータのプロパティで参照できるドメイン名」を取得させることはできないのでしょうか?
    > 手元に同様の環境が無いので検証はできませんが、どちらのバージョンも、基本的には内部で
    > LookupAccountName API を呼び出すのですが、2.0 版はその前に、GetUserNameEx API を
    > 優先的に利用する仕様になっているようです。
    >
    > # おそらく .NET 2.0 では、Win98 や NT 4.0 をサポートしなくなったため、
    > # GetUserNameEx の呼び出し機能が追加されたのではないかな…と想像。
    >
    >
    > で、手元の環境でこれらの API を、LocalSystem アカウントのサービスで実行したところ、
    >  GetUserNameEx は「ワークグループ名\アカウント名」
    >  LookupAccountName は「NT AUTHORITY」
    > を返してきました。テスト環境は .NET 3.5 SP1 + Windows XP SP3 です。
    >
    >
    > protected override void OnStart(string[] args)
    > {
    >  EventLogTraceListener listener = new EventLogTraceListener("Service1");
    >  Trace.Listeners.Add(listener);
    >
    >  int capacity;
    >  StringBuilder domainName;
    >
    >  capacity = 1024;
    >  domainName = new StringBuilder(capacity);
    >  if (!GetUserNameEx(2, domainName, ref capacity))
    >  {
    >   Trace.WriteLine("GetUserNameEx 失敗:0x" + Marshal.GetLastWin32Error().ToString("x8"));
    >  }
    >  else
    >  {
    >   Trace.WriteLine("GetUserNameEx 成功:" + domainName.ToString());
    >  }
    >
    >  int length = 1024;
    >  byte[] sid = new byte[length];
    >  int sid_name_use;
    >  capacity = 1024;
    >  domainName = new StringBuilder(capacity);
    >  if (!LookupAccountName(null, Environment.UserName, sid, ref length, domainName, ref capacity, out sid_name_use))
    >  {
    >   Trace.WriteLine("LookupAccountName 失敗:0x" + Marshal.GetLastWin32Error().ToString("x8"));
    >  }
    >  else
    >  {
    >   Trace.WriteLine("LookupAccountName 成功:" + domainName.ToString());
    >  }
    >
    >  listener.Close();
    >  Trace.Listeners.Remove(listener);
    >  listener.Dispose();
    > }
    >
    > [DllImport("advapi32", CharSet = CharSet.Unicode, SetLastError = true)]
    > [return: MarshalAs(UnmanagedType.U1)]
    > private static extern bool LookupAccountName(
    >  string machineName,
    >  string accountName,
    >  byte[] sid,
    >  ref int sidLen,
    >  StringBuilder domainName,
    >  ref int domainNameLen,
    >  out int peUse
    > );
    >
    > [DllImport("secur32", CharSet = CharSet.Unicode, SetLastError = true)]
    > private static extern bool GetUserNameEx(
    >  int format,
    >  StringBuilder domainName,
    >  ref int domainNameLen
    > );
記事No.38038 のレス /過去ログ65より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -