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

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

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

No.38038 の関連記事表示

<< 0 >>
■38038  Environment.UserDomainNameについて
□投稿者/ たろ -(2009/07/06(Mon) 13:18:51)

    分類:[C#] 

    おせわになっております。たろです。

    初歩的な質問です。

    現在、C#でWindowサービスを作成しているのですが、
    その中でEnvironment.UserDomainNameを使用してドメイン名を取得しています。

    .NET Framework1.1の環境で作成したwindowサービスを
    .NET Framework1.1と.NET Framework2.0の環境で起動すると、
    どちらも「NT AUTHORITY」というドメイン名が取得されます。

    .NET Framework2.0の環境で作成したwindowサービスを
    .NET Framework2.0の環境で起動すると、
    「マイコンピュータのプロパティで参照できるドメイン名」が取得されます。

    そこで質問です。
    .NET Framework1.1の環境で作成したwindowサービスを
    .NET Framework2.0の環境で起動しても、
    「マイコンピュータのプロパティで参照できるドメイン名」を取得させることはできないのでしょうか?

    そもそも、.NET Framework1.1の環境で作成したwindowサービスを
    .NET Framework2.0の環境で起動すること自体おかしいのでしょうか?

    ご教授お願いします。






親記事 /過去ログ65より / 関連記事表示
削除チェック/

■38041  Re[1]: Environment.UserDomainNameについて
□投稿者/ 魔界の仮面弁士 -(2009/07/06(Mon) 14:45:59)
    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より / 関連記事表示
削除チェック/

■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より / 関連記事表示
削除チェック/

■38047  Re[3]: Environment.UserDomainNameについて
□投稿者/ 魔界の仮面弁士 -(2009/07/06(Mon) 15:33:19)
    No38044 (たろ さん) に返信
    > ということは、NET Framework1.1の環境で作成したwindowサービスを
    > .NET Framework2.0の環境で起動させるにはEnvironment.UserDomainNameを使用せずに
    > 直接GetUserNameEx関数をCALLする必要があるってことですよね?

    残念ながら、そこまでは分かりません。
    私が知らないだけで、もっと良い方法があるのかも知れませんし。


    ただし、もしも GetUserNameEx を使うのであれば、その戻り値は
    >> GetUserNameEx は「ワークグループ名\アカウント名」
    のような形式になる事が予想されます。ドメイン環境ではテストしていませんが、
    もしも API 併用で実装するなら、下記のような手順にすることで、期待する結果を
    得る事ができるように思えます。実際にそちらの環境で試してみてください。


    (1) GetUserNameEx が成功したら、結果に "\" が含まれているかを評価する。
    (2) もし "\" が含まれていれば、それより前の部分をドメイン名とみなす。
    (3) 結果に "\" が含まれない、もしくは API が失敗した場合は、Environment.UserDomainName で取得する。
記事No.38038 のレス /過去ログ65より / 関連記事表示
削除チェック/

■38125  Re[4]: Environment.UserDomainNameについて
□投稿者/ たろ -(2009/07/07(Tue) 11:44:58)
    魔界の仮面弁士 さん
    ご返信ありがとうございます!

    もう少し方法が探してみて、
    いいやり方がない場合、ご教授していただいた方法をとらせてもらいます!

    ありがとうございました!


    No38047 (魔界の仮面弁士 さん) に返信
    > ■No38044 (たろ さん) に返信
    >>ということは、NET Framework1.1の環境で作成したwindowサービスを
    >>.NET Framework2.0の環境で起動させるにはEnvironment.UserDomainNameを使用せずに
    >>直接GetUserNameEx関数をCALLする必要があるってことですよね?
    >
    > 残念ながら、そこまでは分かりません。
    > 私が知らないだけで、もっと良い方法があるのかも知れませんし。
    >
    >
    > ただし、もしも GetUserNameEx を使うのであれば、その戻り値は
    > >> GetUserNameEx は「ワークグループ名\アカウント名」
    > のような形式になる事が予想されます。ドメイン環境ではテストしていませんが、
    > もしも API 併用で実装するなら、下記のような手順にすることで、期待する結果を
    > 得る事ができるように思えます。実際にそちらの環境で試してみてください。
    >
    >
    > (1) GetUserNameEx が成功したら、結果に "\" が含まれているかを評価する。
    > (2) もし "\" が含まれていれば、それより前の部分をドメイン名とみなす。
    > (3) 結果に "\" が含まれない、もしくは API が失敗した場合は、Environment.UserDomainName で取得する。
記事No.38038 のレス / END /過去ログ65より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -