【问题标题】:Changing user's password from console application从控制台应用程序更改用户密码
【发布时间】:2013-01-07 17:55:59
【问题描述】:

我正在编写一个小型 C# (.NET 4) 应用程序,该应用程序将在登录到 Windows Server 2012 时作为用户“Shell”的替代品运行。除此之外,我想为用户提供机会更改他们自己的本地帐户的密码。

使用下面的代码..

 DirectoryEntry directory = new DirectoryEntry("WinNT://" + Environment.MachineName + ",computer");
 DirectoryEntry userEntry = directory.Children.Find(username);
 userEntry.Invoke("SetPassword", new object[] { newPassword });

 userEntry.CommitChanges();

... 如果代码是从提升的命令提示符启动的,则可以正常工作。但是,由于 Shell 替换作为“普通”应用程序运行,我得到一个

访问被拒绝

代码运行时出现异常,即使用户设置为本地管理员。

是否有任何代码或机制可用于以编程方式设置用户自己的本地帐户密码而无需提升?或者(我知道这可能更像是一个 ServerFault 问题:)任何方​​式来运行“替换外壳”作为提升的进程而无需禁用 UAC?

【问题讨论】:

  • 您的程序集中是否有请求管理员权限的清单?通过 UAC?
  • 宾果游戏-我认为s what Im 不见了。我现在至少被提示使用 UAC,我可以通过一些用户培训来“管理”它 :) 谢谢,请随时在下面重复你的答案以获得一些额外的点 :)

标签: c# .net uac


【解决方案1】:

更改用户密码是一项高权限操作,因为您不希望任何恶意代码在您不知情的情况下清除您现有的凭据。您可以使用
runas /user:<a-priviliged-user> <your-program>.exe 从命令提示符处执行程序。它当然会提示您输入特权用户的密码。

【讨论】:

    【解决方案2】:

    这有点麻烦,但是看看this page(虽然它来自 Vista 时代,但它仍然具有相关性)。

    这个想法是您创建一个具有嵌入式凭据的计划任务,以使用足够的凭据运行应用程序,但实际上并不计划任务运行。然后,您可以通过以下方式按需运行它(例如在登录期间):

    \windows\system32\schtasks.exe /run /tn "task name"
    

    正如我所说的:一个笨蛋,但它可能足以满足您的要求 - 程序将以管理员权限运行,而不会提示输入 UAC。

    编辑:我刚刚在 Server 2012 上尝试过,但由于某种原因,我无法让测试控制台应用程序以交互方式运行(即,用户可以看到程序正在运行)。我可能只是我自己,但可能是 Server 2012 中的行为发生了变化,如果您需要与用户交互,这个技巧可能不适合您的需求。

    【讨论】:

      【解决方案3】:

      向您的程序集添加清单以通过 UAC(用户帐户控制)

      VS2010 中,您可以将清单文件添加到您的项目中。 Right click your project 解决方案资源管理器上的文件,选择 Add,然后选择 New item。在那里你可以找到Application Manifest File

      修改它以获得以下之一:

      1. 正常
      2. 最高可用(取决于用户权限)
      3. 管理员权限

      还有 VS2010 附带的 2 个工具可供您使用:

      1. MageUI.exe(清单生成和编辑工具,图形客户端)
      2. Mage.exe(清单生成和编辑工具,命令行)

      【讨论】:

        猜你喜欢
        • 2011-03-25
        • 2020-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-14
        相关资源
        最近更新 更多