| 魔界の仮面弁士 さん ご返信ありがとうございます!
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 > ); |