Powershell 修改用户配置文件

最近公司打算统一修改AD用户的一些属性,包括SamAccountName,UPN,Office365的UPN,这样保证这些属性和邮件地址是一致的。这些修改本身不难,都可以通过PowerShell批量实现,问题在于修改之后有很多额外的问题,例如Outlook的ost文件啦,通过AD进行LDAP登录的工具了,一些软件的保存路径等需要处理。

修改了AD登录名之后的首要问题就是计算机上的用户配置文件需要进行同步修改。公司没用SCCM,因此只有自己想办法了。豆子做了些测试,基本上需要做以下操作:

  1. 以其他管理员身份登录计算机;
  2. 确认该用户abc已经退出登录状态,可以通过任务管理器或者quser来操作
  3. 修改C:\users\abc 的文件名为新的用户名C:\users\abc1
  4. 修改注册表,这个里面有一堆根据SID命名的key,需要找到对应的,然后修改对应的profileImagePath

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList

  5. 创建新的symboLink连接从 c:\users\abc  <==> c:\users\abc1。windows下面有自带的mklink命令可以使用,比如 mklink /D c:\users \abc c:\users\abc1。PS5以后可以用New-item创建,但是早期的版本没有原生的PS命令,只能间接调用cmd,或者自己写一个方法

上面的操作都可以通过PS脚本来实现。

#创建SymLink的方法,这个网上发现有现成的,我就直接下载了
function New-Symlink {
    <#
    .SYNOPSIS
        Creates a symbolic link.
    #>
    param (
        [Parameter(Position=0, Mandatory=$true)]
        [string] $Link,
        [Parameter(Position=1, Mandatory=$true)]
        [string] $Target
    )
    Invoke-MKLINK -Link $Link -Target $Target -Symlink
}
function New-Hardlink {
    <#
    .SYNOPSIS
        Creates a hard link.
    #>
    param (
        [Parameter(Position=0, Mandatory=$true)]
        [string] $Link,
        [Parameter(Position=1, Mandatory=$true)]
        [string] $Target
    )
    Invoke-MKLINK -Link $Link -Target $Target -HardLink
}
function New-Junction {
    <#
    .SYNOPSIS
        Creates a directory junction.
    #>
    param (
        [Parameter(Position=0, Mandatory=$true)]
        [string] $Link,
        [Parameter(Position=1, Mandatory=$true)]
        [string] $Target
    )
    Invoke-MKLINK -Link $Link -Target $Target -Junction
}
function Invoke-MKLINK {
    <#
    .SYNOPSIS
        Creates a symbolic link, hard link, or directory junction.
    #>
    [CmdletBinding(DefaultParameterSetName = "Symlink")]
    param (
        [Parameter(Position=0, Mandatory=$true)]
        [string] $Link,
        [Parameter(Position=1, Mandatory=$true)]
        [string] $Target,
        [Parameter(ParameterSetName = "Symlink")]
        [switch] $Symlink = $true,
        [Parameter(ParameterSetName = "HardLink")]
        [switch] $HardLink,
        [Parameter(ParameterSetName = "Junction")]
        [switch] $Junction
    )
    # Ensure target exists.
    if (-not(Test-Path $Target)) {
        throw "Target does not exist.`nTarget: $Target"
    }
    # Ensure link does not exist.
    if (Test-Path $Link) {
        throw "A file or directory already exists at the link path.`nLink: $Link"
    }
    $isDirectory = (Get-Item $Target).PSIsContainer
    $mklinkArg = ""
    if ($Symlink -and $isDirectory) {
        $mkLinkArg = "/D"
    }
    if ($Junction) {
        # Ensure we are linking a directory. (Junctions don‘t work for files.)
        if (-not($isDirectory)) {
            throw "The target is a file. Junctions cannot be created for files.`nTarget: $Target"
        }
        $mklinkArg = "/J"
    }
    if ($HardLink) {
        # Ensure we are linking a file. (Hard links don‘t work for directories.)
        if ($isDirectory) {
            throw "The target is a directory. Hard links cannot be created for directories.`nTarget: $Target"
        }
        $mkLinkArg = "/H"
    }
    # Capture the MKLINK output so we can return it properly.
    # Includes a redirect of STDERR to STDOUT so we can capture it as well.
    $output = cmd /c mklink $mkLinkArg `"$Link`" `"$Target`" 2>&1
    if ($lastExitCode -ne 0) {
        throw "MKLINK failed. Exit code: $lastExitCode`n$output"
    }
    else {
        Write-Output $output
    }
}
 
 
 
#定义一个Flag跳出循环
$flag=$true
while($flag){
    $oldName=read-host "Please input the old user name"
    write-host ‘Searching user profile..‘ -ForegroundColor Cyan
     
    #测试该用户是否已经登录,这里有个小技巧把quser的字符串结果转换为对象,具体解释参考博客
    http://beanxyz.blog.51cto.com/5570417/1906162
    if (Test-Path "c:\users\$oldName"){
        write-host "User Profile c:\users\$oldName found." -ForegroundColor Cyan
        #Check if the user is currently logged In
        $quser = (quser) -replace ‘\s{2,17}‘, ‘,‘ | ConvertFrom-Csv
        $sessionId = $quser | Where-Object { $_.Username -eq $newName } | select -ExpandProperty id
         
        #如果已经登录,那么强行退出这个用户
        foreach($id in $sessionId){
            if($id -ne $null){
                write-host "Detected User $newName still login" -ForegroundColor red
                Write-Host "Force logoff the user" -ForegroundColor red
                logoff $id
            }
         
        }
        
        $newName=read-host "Please input the new name"
        $oldpath="c:\users\$oldName"
        $newpath="c:\users\$newName"
         
        #重命名文件夹
        rename-item $oldpath $newpath -Confirm -ErrorAction Stop
        write-host "Searching Registry Information " -ForegroundColor Cyan
         
        #查询对应的注册表Key
        Get-ChildItem "hklm:\software\microsoft\windows nt\currentversion\profilelist" | foreach{
            #Get the username from SID
            $sid=$_.Name.Split(‘\‘)[-1];
             
            #根据SID来匹配用户,如果用户匹配成功,那么修改对应的ProfileList
            try{
            $objSID = New-Object System.Security.Principal.SecurityIdentifier ($sid)
            $objUser = $objSID.Translate( [System.Security.Principal.NTAccount]) 
            $username=$objUser.Value
            }
            catch{}
            #change registry keys
            if(($username -eq "omnicom\$oldName") -or ($username -eq "omnicom\$newName")){
                write-host "Found Registry Information of user profile $newName" -ForegroundColor Cyan
                $keys=Get-ItemProperty "hklm:\software\microsoft\windows nt\currentversion\profilelist\$sid" 
                $keys.ProfileImagePath=$newpath
                write-host "Registry key profile list is changed to $newpath" -ForegroundColor Cyan
                 
                 
                #调用上面的方法,创建Symbolink
                #Create new symbolink
                #New-Item -Path $oldpath -ItemType Junction -Value $newpath
                New-Symlink -Link $oldpath -Target $newpath
                 
                break;
            }
            else{
                write-host "$username Name not match...skip" -ForegroundColor Yellow
             
            }
         
        }
        $flag=$false
         
    }
    else {
        write-host "Profile is not found. Please try again" -ForegroundColor red
    }
}

执行效果,我直接把这个文件扔到一个远程电脑的C盘下测试,然后以本地管理员身份登录,执行这个脚本,成功!

时间: 2024-10-08 09:30:06

Powershell 修改用户配置文件的相关文章

windows 7中修改用户配置文件的路径

在windows 7中用户配置文件的默认位置是在c:\users文件夹中.我建议最好在安装完操作系统之后就将用户配置文件的默认位置改变到其他分区. Warning在视图更改注册表之前,请备份好注册表相关键值. 1. 将c:\user文件夹Copy到新的位置(默认情况下 "Default" directory 是隐藏的,请到 Tools > Folder Options > View (tab) > Show Hidden files, folders, and dri

python之修改用户配置文件

用户的配置文件如下 backend oldboy school school1 age 21 weight 210 qq 550124281 iphone 13925293887backend oldgirl school school2 age 22 weight 220backend oldteacher school school3 age 23 weight 230backend oldstudent school school4 age 24 weight 240 作业要求: 1.实现

域内计算机迁移到其他域,自动脚本运行,继承原用户配置文件、管理员权限不变

因一个公司收购另外一个公司,现需要把被收购公司的计算机迁移到收购公司域内,要求用户配置文件不变,计算机名重新编辑,用户继承本地管理员权限使用了DefProf.exe迁移配置文件使用了netdom.exe迁移域使用了数据库自动计算机名更改,并抓取计算机信息到数据库 脚本如下: @echo off color 0Acls copy CDGAMED.ps1 C:\tmpcopy CDGAMEL.ps1 C:\tmpcopy zhuaqu.ps1 C:\tmpcopy netdom.exe C:\Win

Linux培训教程 linux下修改用户权限的方法

一般我们日常碰到要修改用户权限的,往往是要么修改一下用户的gorupid,通过上面命令可以改;要么是把普通用户改成具有超级权限的用户,这个一般自己不能直接改,只能是root或有root权限的用户才能帮你改,在/etc/passwd文件里面,找到对应userid那一行,将userid那一列你的id改成0,然后强制保存退出.这时候你的这个用户就有超级用户权限了.改用户的groupid也可以这样改. 如果是改某个文件的属性,就比较简单了,直接用chmod命令就可以了,我一般直接后面接数字,如果要给rw

为VisualSVN Server增加在线修改用户密码的功能

原文:为VisualSVN Server增加在线修改用户密码的功能 附件下载:点击下载 VisualSVN Server是一个非常不错的SVN Server程序,方便,直观,用户管理也异常方便. 不过,它本身并没有提供在线修改密码的功能.由于在实际使用过程中,一旦SVN的用户比较多,只单单依靠windows的管理控制台去修改密码 显然是不太合适的. 总不能任何人想改个密码还要通过管理员吧?所以,就想为其增加在线修改密码的功能. 说实话,网上已经有了可以在线修改密码的方法.试用过,也的确可以.不过

[添加用户]解决useradd 用户后没有添加用户Home目录的情况,Linux改变文件或目录的访问权限命令,linux修改用户密码,usermod的ysuum安装包。飞

usermod的yum安装包: shadow-utils 将nobody用户添加到nogroup 组: usermod -g nogroup nobody cat /etc/passwd|grep nobody nobody:x:65534:65534:nobody:/var/lib/nobody:/bin/bash 第3个字段是65534:意思就是,UID(用户的ID)是500. 第4个字段是65534:意思就是.GID(用户的组ID)的500. 使用usermod -g nogroup no

第6章 用户和用户组管理(1)_用户配置文件及其它管理相关文件

1. 用户配置文件 1.1 用户信息文件 (1)用户管理简介 ①越是对服务器安全性要求高的服务器,越需要建立合理的用户权限等级制度和服务器操作规范 ②在Linux中主要是通过用户配置文件来查看和修改用户信息 (2)/etc/passwd文件(用来存放用户名等信息.打开方式:#vim /etc/passwd,查看帮助:#man 5 passwd) ①第1字段:用户名称(如root) ②第2字段:密码标志,"x"表示该用户有密码,存放在/etc/shadow文件中(只有管理有权限查看).如

用户配置文件漫游与文件夹重定向

什么是用户配置文件呢?         用户配置文件,顾名思意,用户配置文件是用来保存用户个性化设置的文件,例如在系统中新建了两个用户:jebom,soka.在系统里就会有两个用户配置文件夹:jebom,soka,每个文件夹各自储存了各自用户的使用个性化设置,如各自的桌面,各自的输入法,各自的收藏夹,各自的浏览历史等. 配置文件夹在什么位置?         配置文件夹在默认情况下存在于C:\Documents and Settings.现在我们把C:\Documents and Setting

域用户配置文件的漫游配置(全)

漫游的优势: 1,方便用户的操作,域用户无论在哪个客户端登录,桌面环境配置都是一样的,可以在外地办公. 2,数据的统一存储,管理更方便. 一:搭建域控制器    1.此实验环境是windows2008 2.win+R快捷键打开运行 dcpromo打开域控制器安装 3.勾选高级模式安装 下一步 4.在新林中新建域  下一步 5.输入一个域名例如:zhaoyi.com(必须后缀为.com) 6.林功能级别最好是选择server 2008这个级别(只能升级,不能降级) 7.勾选DNS服务器 下一步 是