|
■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 );
|