converting from a SID to an account nameに関する質問があります。それ以外の方法はありません。C#/ .NETでユーザー名をSID文字列に変換する
ユーザー名をSID文字列に変換するにはどのようにしますか?たとえば、特定の名前のユーザーに関連するHKEY_USERSサブキーを確認するにはどうすればよいですか?
converting from a SID to an account nameに関する質問があります。それ以外の方法はありません。C#/ .NETでユーザー名をSID文字列に変換する
ユーザー名をSID文字列に変換するにはどのようにしますか?たとえば、特定の名前のユーザーに関連するHKEY_USERSサブキーを確認するにはどうすればよいですか?
ポッドキャストは、私が尋ねる必要があると答えています。彼らはすでに答えられていないときに質問します。ここに行く。
簡単な方法は、アップ.NET 2.0とし、これです:
NTAccount f = new NTAccount("username");
SecurityIdentifier s = (SecurityIdentifier) f.Translate(typeof(SecurityIdentifier));
String sidString = s.ToString();
はそれはしません動作し、また、.NET 1.1で動作し、ハードな方法、:
[DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)]
public static extern bool LookupAccountName([In,MarshalAs(UnmanagedType.LPTStr)] string systemName, [In,MarshalAs(UnmanagedType.LPTStr)] string accountName, IntPtr sid, ref int cbSid, StringBuilder referencedDomainName, ref int cbReferencedDomainName, out int use);
[DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)]
internal static extern bool ConvertSidToStringSid(IntPtr sid, [In,Out,MarshalAs(UnmanagedType.LPTStr)] ref string pStringSid);
/// <summary>The method converts object name (user, group) into SID string.</summary>
/// <param name="name">Object name in form domain\object_name.</param>
/// <returns>SID string.</returns>
public static string GetSid(string name) {
IntPtr _sid = IntPtr.Zero; //pointer to binary form of SID string.
int _sidLength = 0; //size of SID buffer.
int _domainLength = 0; //size of domain name buffer.
int _use; //type of object.
StringBuilder _domain = new StringBuilder(); //stringBuilder for domain name.
int _error = 0;
string _sidString = "";
//first call of the function only returns the sizes of buffers (SDI, domain name)
LookupAccountName(null, name, _sid, ref _sidLength, _domain, ref _domainLength, out _use);
_error = Marshal.GetLastWin32Error();
if (_error != 122) //error 122 (The data area passed to a system call is too small) - normal behaviour.
{
throw (new Exception(new Win32Exception(_error).Message));
} else {
_domain = new StringBuilder(_domainLength); //allocates memory for domain name
_sid = Marshal.AllocHGlobal(_sidLength); //allocates memory for SID
bool _rc = LookupAccountName(null, name, _sid, ref _sidLength, _domain, ref _domainLength, out _use);
if (_rc == false) {
_error = Marshal.GetLastWin32Error();
Marshal.FreeHGlobal(_sid);
throw (new Exception(new Win32Exception(_error).Message));
} else {
// converts binary SID into string
_rc = ConvertSidToStringSid(_sid, ref _sidString);
if (_rc == false) {
_error = Marshal.GetLastWin32Error();
Marshal.FreeHGlobal(_sid);
throw (new Exception(new Win32Exception(_error).Message));
} else {
Marshal.FreeHGlobal(_sid);
return _sidString;
}
}
}
}
ネイティブメソッドはリモートマシン上で実行できるという利点がありますが、.NETメソッドはリモートで実行できません。例では、表示されませんが
それLookupAccountName(null)
< - これは上で実行するリモートシステムです。
using System;
using System.Management;
using System.Windows.Forms;
namespace WMISample
{
public class MyWMIQuery
{
public static void Main()
{
try
{
ManagementObjectSearcher searcher =
new ManagementObjectSearcher("root\\CIMV2",
"SELECT * FROM Win32_UserAccount where name='Galia'");
foreach (ManagementObject queryObj in searcher.Get())
{
Console.WriteLine("-----------------------------------");
Console.WriteLine("Win32_UserAccount instance");
Console.WriteLine("-----------------------------------");
Console.WriteLine("Name: {0}", queryObj["Name"]);
Console.WriteLine("SID: {0}", queryObj["SID"]);
}
}
catch (ManagementException e)
{
MessageBox.Show("An error occurred while querying for WMI
data: " + e.Message);
}
}
}
}
私はNTAccountの変数として 'f'を選んだ理由について興味をそそられています! – crb
"これは動作しません。" ...簡単なアプローチがうまくいかないときに私が.NET 2.0を持っていると仮定した場合のポインタです。 – Rory
私は残念ながら覚えていません。私はおそらく2.0以前を意味していた。私はそれが同じWin32 API呼び出しにまで沸き立つことを期待しています。 – crb