从控制台应用程序更改用户的密码

本文关键字:用户 密码 控制台 应用程序 | 更新日期: 2023-09-27 17:50:58

我在写一个小小的c#代码。. NET 4)应用程序,将运行作为一个替代用户的"Shell",当登录到Windows Server 2012。除其他事项外,我想为用户提供更改自己的本地帐户密码的机会。

使用以下代码…

 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?

从控制台应用程序更改用户的密码

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

这是一个有点浮华,但看看这个页面(虽然它是从Vista时代,它仍然是相关的)。

这个想法是创建一个带嵌入式凭据的计划任务,以运行具有足够凭据的应用程序,但实际上不安排任务运行。然后你可以按需运行它(例如在登录时):

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

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

编辑:我刚刚在Server 2012上尝试过,由于某种原因,我无法获得交互式运行的测试控制台应用程序(即用户可以看到程序运行)。我可能只是我,但它可能是行为已经改变在Server 2012和这个技巧可能不适合你的需要,如果你需要与用户交互

将清单添加到程序集以通过UAC(用户帐户控制)

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

修改它,使您得到以下内容之一:

    正常
  1. 最高可用(取决于用户权限)
  2. <
  3. 管理权利/gh>

还有两个VS2010自带的工具,你可以使用:

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