2011-08-14 32 views

回答

4

您可以使用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; 
}  
+0

謝謝,但什麼是(lm.h)文件,是他們在.net中的一些替代品?因爲我不熟悉C++ :) –

+0

不能幫助你,對不起,但我想有一些支持的方式直接從.net代碼調用Win32 API函數。 MSDN庫中記錄了NetUserSetInfo參數和USER_INFO_0結構。 NET_API_STATUS只是一個32位無符號整數。 –

4

你不能在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

希望這有助於。

+0

謝謝你,這是一個很好的答案,但我認爲你可以通過程序更改用戶名,因爲如果你按下F2,它可以從本地用戶和組更改。 –

+0

確定,但它不會更改附加到C:\ Users \中的用戶的文件系統...檢查我編輯的帖子。 – Tigran

+0

好的,沒事的.. 我只需要改變登錄名,我明天就試試:) –

3

我已經寫了一些小方法來重命名使用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; 
} 
+0

這也是一個有用的舔(重命名使用WMI,WMIC工具)http://www.911cd.net/forums//index.php?showtopic=23638 –

+0

謝謝你!我設法減少你的代碼到'使用(var entry = new DirectoryEntry($「WinNT:// {Environment.MachineName}/{oldLoginName}」))entry.Rename(newLoginName);'爲我的目的,它的工作原理完美! – Maverik