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

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

C# と VB.NET の入門サイト

Re[4]: Environment.UserDomainNameについて


(過去ログ 65 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■38038 / inTopicNo.1)  Environment.UserDomainNameについて
  
□投稿者/ たろ (38回)-(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の環境で起動すること自体おかしいのでしょうか?

ご教授お願いします。







引用返信 編集キー/
■38041 / inTopicNo.2)  Re[1]: Environment.UserDomainNameについて
□投稿者/ 魔界の仮面弁士 (1144回)-(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
);
引用返信 編集キー/
■38044 / inTopicNo.3)  Re[2]: Environment.UserDomainNameについて
□投稿者/ たろ (39回)-(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
> );
引用返信 編集キー/
■38047 / inTopicNo.4)  Re[3]: Environment.UserDomainNameについて
□投稿者/ 魔界の仮面弁士 (1145回)-(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 で取得する。
引用返信 編集キー/
■38125 / inTopicNo.5)  Re[4]: Environment.UserDomainNameについて
□投稿者/ たろ (40回)-(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 で取得する。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -