C#请求域管理员凭据并使用它们执行某项任务

时间:2014-11-19 18:16:14

标签: c# wpf authentication

我需要一些帮助,说明如何使用运行应用程序的当前用户的Credential。 因此,在Windows 7中,您只需运行应用程序即可使用用户运行应用程序,或者您可以使用“以其他用户身份运行”选项并以其他用户身份运行。

在我的Active Directory中,我有2个帐户域用户和一个域管理员权限。我以域用户身份登录Windows,当我需要“以不同用户身份运行”时,以域管理员身份启动某项任务。

所以任务是获取我的凭据并使用它来执行某些任务,让我们说重命名活动目录用户名。 我能看到的最好的方法是让用户运行应用程序进入Domain Admin凭证,然后启动应用程序并将其用于各种任务。当然,我可以使用“以不同用户身份运行”轻松运行应用程序,但我仍然需要获取此凭据并使用它们。

我在网上搜索过,我找不到这个,我只能找到使用凭据进行网络身份验证。

如果你能告诉我一些如何:

的例子

1)向用户询问管理员用户凭证(我可以不用此处离开)

2)获取并使用运行应用程序的用户的凭据

我不想知道密码,我知道我不能。真的不想添加到WPF表单密码框我更喜欢使用Windows API来处理这个我已经使用“以其他用户身份运行”输入的用户名和密码。

PS:对不起,如果这个话题存在:(我想我不善于创建正确的搜索请求。

添加:更清楚我需要什么。在powershell中,它将如下所示:

# This Asks user to enter credentials
$cred = Get-Credential; 
# this checks if I have rights to use them.
Get-ADDomain “DOMAIN” –Server “Domain.com” –Credential $cred; 

当然,它简化为地狱,但重点是我可以在需要时使用用户输入的凭据。

2 个答案:

答案 0 :(得分:2)

Get-ADDomain的等效C#非常简单,只是

public void PerformSomeActionAsAdmin(string adminUsername, string adminPassword)
{
    //Null causes the constructor to connect to the current domain the machine is on.
    //                                                                       |
    //                                                                       V
     using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain, null, adminUsername, adminPassword))
    {
        //do something here with ctx, the operations will be performed as whoever's username and password you passed in.
    }
}

如果您不想连接到当前域,而是想要连接到Domain.com,请将null替换为相应的字符串。

编辑:如果您想使用安全字符串而无法使用System.DirectoryServices.AccountManagement.PrincipalContext,则需要使用System.DirectoryServices.Protocols中的较低级别电话。执行此过程非常复杂,这里有一个指向MSDN文章的链接" Introduction to System.DirectoryServices.Protocols (S.DS.P)"解释如何使用它。这是一个很复杂的阅读,老实说,我认为能够使用加密字符串是值得的。

public void PerformSomeActionAsAdmin(NetworkCredential adminCredential)
{
    using(LdapConnection connection = new LdapConnection("fabrikam.com", adminCredential))
    {
       // MAGIC
    }
}

答案 1 :(得分:0)

您想检查当前用户是否是管理员?从查看他的代码开始,它应该可以帮助您开始识别当前用户所在的AD组。这将为您提供一个字符串列表,这些字符串是当前用户所属的每个组的名称。然后,您可以针对您要检查的任何AD组检查该列表。将YourDomain替​​换为您的域名:

WindowsIdentity wi = WindowIdentity.GetCurrent();

List<string> result = new List<string>();

foreach (IdentityReference group in wi.Groups)
                    {
                        result.Add(group.Translate(typeof(NTAccount)).ToString().Replace("YourDomain\\", String.Empty));
                    }

由于我不太确定你要做什么,这也可能会有所帮助。您必须从textobx,密码框等处获取用户名和密码。这可以用于&#34;覆盖&#34;例如,使用经理的凭证等来执行当前用户因AD群组成员资格等而无法做的事情。

using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, "YourDomain"))
                {
                    if (UserName.Contains("YourDomain\\"))
                    {
                        UserName = UserName.Replace("YourDomain\\", String.Empty);
                    }
                    //validate the credentials
                   bool IsValid = pc.ValidateCredentials(UserName, Password);
                }