【问题标题】:Change some windows username programmatically (Rename windows user)以编程方式更改某些 Windows 用户名(重命名 Windows 用户)
【发布时间】:2011-08-14 12:50:38
【问题描述】:

如何以编程方式更改 Windows 用户名(使用一些 API 或命令行工具) 或者如何重命名windows用户?

【问题讨论】:

  • 为什么?这是一个典型的问题!并且没有关于它的资源!!!
  • 你想达到什么目的?您要临时登录其他用户吗?
  • 没有。我需要更改某些特定 Windows 用户的登录名或用户名。

标签: c# .net windows windows-7


【解决方案1】:

我已经编写了一些小方法来使用 System.DirectoryServices.DirectoryEntry 类重命名 Windows 用户。

public bool RenameUser(string oldLoginName, string newLoginName)
{
    bool renamed = false;
    try
    {
        using (DirectoryEntry AD = new
                   DirectoryEntry("WinNT://" + Environment.MachineName + ",computer"))
        {
            try
            {
                using (DirectoryEntry NewUser = AD.Children.Find(oldLoginName, "user"))
                {
                    if (NewUser != null)
                    {
                        NewUser.Rename(newLoginName);
                        renamed = true;
                    }
                }
            }
            catch (Exception ex)
            {
                //TODO: Log
            }
        }
    }
    catch (Exception ex)
    {
         //TODO: Log
    }
    return renamed;
}

【讨论】:

  • 这也是一个有用的舔(Rename using WMI, WMIC tool)911cd.net/forums//index.php?showtopic=23638
  • 谢谢你!为了我的目的,我已设法将您的代码减少到 using (var entry = new DirectoryEntry($"WinNT://{Environment.MachineName}/{oldLoginName}")) entry.Rename(newLoginName);,它运行良好!
【解决方案2】:

您可以使用 NetUserSetInfo 函数更改用户帐户的用户名。

如果您只想更改用户名,请将 level 参数设置为 0 并传递 USER_INFO_0 结构。如果您想一次更改几项内容,可以使用不同的级别。

这是我成功用来更改用户名的一段简单代码:

#include <Windows.h>
#include <LM.h>

#include <stdio.h>

#pragma comment(lib, "netapi32.lib")

int main(int argc, char ** argv)
{
    USER_INFO_0 ui0;
    NET_API_STATUS result;
    LPWSTR command = GetCommandLineW();
    wchar_t newname[21];

    while (*command != L'*') command++;

    command++;

    ui0.usri0_name = newname;
    wcscpy_s(newname, _countof(newname), L"decommiss-");
    wcscat_s(newname, _countof(newname), command);

    result = NetUserSetInfo(NULL, command, 0, (LPBYTE)&ui0, NULL);

    printf("%u\n", result);

    return result;
}    

【讨论】:

  • 谢谢,但什么是 (lm.h) 文件,它们是 .net 中的替代品吗?因为我不熟悉 c++ :)
  • 无法帮助您,抱歉,但我想有一些受支持的方式可以直接从 .net 代码调用 Win32 API 函数。 NetUserSetInfo 参数和 USER_INFO_0 结构记录在 MSDN 库中。 NET_API_STATUS 只是一个 32 位无符号整数。
  • 这个问题是用 C# 标记的,但这是一个 C++ 答案...
  • @Herohtar,这是 Windows 的答案。毕竟,我们不是来为人们编写代码的,但有时一些示例代码可以帮助阐明 API 应该如何使用 - 在这种情况下,它使用什么语言并不重要,不是吗?
【解决方案3】:

在 Windows 系统上你不能明显改变用户名,因为它有点像 key 用于很多内部资源,但你可以更改它的 DisplayName,顺便说一下,这不会影响关于内部文件结构,所以有点cosmetic 的变化。这很可能会给您或同一台机器上的其他用户在多年的使用中造成混淆,所以我建议不要这样做。但如果你愿意,这里是 powershell 脚本示例,应该为你工作:

  $CurrentUserName = "Your_Domain_Name/Current_User_Name" 
    Get-QADUser -SearchRoot $CurrentUserName  `
    | Set-QADUser -DisplayName "New_User_Name" `
    | FT FirstName, LastName, DisplayName, company

有关更详细的描述,请查看这个很好的示例:

Change user DisplayName from powershell

请注意,这里他们为PowerShell 使用了额外的插件。

编辑

关于主题的另一个链接以澄清我的意思:

Change user name on Windows7 Professional

希望这会有所帮助。

【讨论】:

  • 谢谢,这是一个很好的答案,但我认为您可以通过编程方式更改用户名,因为如果您按 F2,它可以从本地用户和组中更改!
  • 好的,但它不会更改 C:\Users\ 中附加到用户的文件系统...检查我编辑的帖子。
  • 好的,没关系..我只需要更改登录名,我明天试试:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-01
  • 1970-01-01
  • 2015-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多