6

ローカル ユーザー アカウント (つまり、ローカル管理者アカウント) がアクティブかどうかを C# から確認するにはどうすればよいですか?

私が実際に望んでいるのは、「net user Administrator」コマンドからの「Account Active」=「Yes」(または「No」) 出力の C# 置換です。

残念ながら、この質問はこれと重複しているように見えますが、ルート DirectoryEntry オブジェクトのパラメーターに何を渡せばよいかわかりません。「ldap://」+ Environment.MachineName、「ldap://127.0.0.1」、「WinNT://」+ Environment.MachineName などのさまざまなことを試しましたが、どれも機能しませんでした。3 つのケースすべてで、searcher.FindAll() 呼び出しによって例外がスローされます。

4

5 に答える 5

5
class Program
{
    static void Main(string[] args)
    {

        // Create the context for the principal object. 
        PrincipalContext ctx = new PrincipalContext(ContextType.Machine);

        UserPrincipal u = UserPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, "Administrator");
        Console.WriteLine(String.Format("Administrator is enable: {0}", u.Enabled));

    }
}
于 2012-09-07T14:44:29.053 に答える
1

WMIのクエリを実行できますWin32_UserAccount

これは、MS のwmi コード作成者が参照として吐き出すボイラープレートです。

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 Disabled FROM Win32_UserAccount WHERE name = 'alexk'");

                foreach (ManagementObject queryObj in searcher.Get())
                {
                    Console.WriteLine("-----------------------------------");
                    Console.WriteLine("Win32_UserAccount instance");
                    Console.WriteLine("-----------------------------------");
                    Console.WriteLine("Disabled: {0}", queryObj["Disabled"]);
                    Console.ReadKey();
                }
            }
            catch (ManagementException e)
            {
                MessageBox.Show("An error occurred while querying for WMI data: " + e.Message);
            }
        }
    }
}

(私はツールをリンクしますが、いつものように msdn リンクは死んでいます)

于 2012-09-07T13:34:15.060 に答える
1

これを試して。

 var server = "YOURMACHINENAME";
 var username = "Guest"; 
 var de = new DirectoryEntry {Path = "WinNT://" + server + ",computer"};
 var result = de.Children
     .Cast<DirectoryEntry>()
     .First<DirectoryEntry>(d => d.SchemaClassName == "User" && d.Properties["Name"].Value.ToString() == username);

 var flags = (int)result.Properties["UserFlags"].Value;
 var disabled = (flags & 2) == 2;
于 2012-09-07T13:40:03.363 に答える
0

これはまったく同じではありませんが、彼らは次を使用DirectoryEntry directoryEntry = new DirectoryEntry(string.Format("WinNT://{0}/{1}", computerName, username)); しています。

于 2012-09-07T13:36:38.643 に答える
0

ローカル ユーザーであることを考慮して、必要なものを取得するには、win32 API 関数NetGetUserInfoを呼び出す必要があります。

pinvoke.net の例はほとんど必要なものですが、必要な情報を取得するには level パラメータを 2 に変更する必要があります

于 2012-09-07T13:44:46.477 に答える