none
RD移動ユーザープロファイルを削除するコマンド RRS feed

  • 質問

  • リモートデスクトップサーバーが複数台ある環境で何からのトラブルがあり、ユーザーアカウント固有のトラブルだった場合、ユーザープロファイルを初期化/削除したい場合があると思います。

    2003 の頃は delprof.exe で対応していました。特定のプロファイルを削除するのはちょっと面倒ですが、リモートサーバーにも対応していたので重宝してました。

    ネットで検索してみたところ、delprof.exeは 2008 R2には対応していないようです。

    2008 R2の移動ユーザープロファイルをコマンドラインで削除する方法はあるのでしょうか?

    個々のサーバーにログオンして、システムのプロパティのユーザープロファイルダイアログからGUIで削除するしか方法は無いのでしょうか?

    お手数ですが何かご存じ方、よろしくお願い致します。


    • 移動 星 睦美 2013年1月22日 1:19 適切なフォーラムと判断しました
    2013年1月21日 9:21

回答

  • チャブーンです。

    MSで用意されたコマンドツールはないようですが、検索でちょっと調べたところ、サードパーティでツールが出ているようですので、確認されてはどうでしょうか?

    http://helgeklein.com/free-tools/delprof2-user-profile-deletion-tool/

    サードパーティツールが使えない環境であれば、ご自分でスクリプトを組むしかないでしょう。簡単な内容としては、次の感じになるのではないかと。

    ・削除ユーザーのSIDを取得
    ・リモートセッションの確立
    ・HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\該当SID\ProfileImagePathのフォルダを削除
    ・HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\該当SIDレジストリキー自体を削除

    PowerShellのGet-ADUserやPSSession、Invoke-Commandを使えば割と簡単にできそうです。

    追記:興味があったのでちょっと作ってみました。Active Directoryモジュールがない環境でも動作しますが、ドメインに参加していることと、自分自身やリモート先のWinRMが有効になっていないと動作しません(winrm quickconfigコマンドを事前に実行してください)。

    .\delprofile.ps1 -Name <アカウント名> [-Computername <リモート名>]で動作するはずです。

    Param(
    [Parameter(Mandatory=$True,Position=1)]
    [string]$Name,
    [Parameter(Mandatory=$False,Position=2)]
    [string]$ComputerName="."
    )
    
    $objDomain = New-Object System.DirectoryServices.DirectoryEntry
    $objSearcher = New-Object System.DirectoryServices.DirectorySearcher
    $objSearcher.SearchRoot = $objDomain
    $objSearcher.SearchScope = "Subtree"
    
    $strFilter = "(cn=$Name)"
    $objSearcher.Filter = $strfilter
    $objUser = ($objSearcher.Findone()).GetDirectoryEntry()
    $SID=(New-Object System.Security.Principal.SecurityIdentifier $objUser.objectsid[0],0).Value
    
    Invoke-Command -Computername $ComputerName {
    	Param($Name,$SID)
    	Set-Location "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList"
    	IF ((Test-Path $SID) -eq $True) {
    		$ProfilePath=(Get-Item $SID).GetValue("ProfileImagePath")
    		$RegistryPath=(Get-Item $SID).PSPath
    		cmd /C rmdir /S /Q $ProfilePath
    		Remove-Item $RegistryPath -Recurse -Force
    		Write-Host $Name " (" $SID ") のプロファイルを削除しました。"
    		}
    	Else	{
    		Write-Host $Name " (" $SID ") のプロファイルは見つけられませんでした。"
    		}
    } -ArgumentList $Name,$SID


    2013年1月22日 1:35
    モデレータ

すべての返信

  • abeo さん、投稿ありがとうございます。
    フォーラム オペレーターの星 睦美です。

    Active Directory フォーラムで回答が集まるのではないかと思いますので、スレッドを移動させていただきました。

    スレッドにアラートを設定しておくと、移動や返信があった際にメールでお知らせします。(アラートは"マイフォーラム リンク>設定>アラートを設定する" で設定できます。)

    *参考になる回答がありましたら、投稿者からの[回答としてマーク]をお願いします。


    日本マイクロソフト株式会社 フォーラム オペレーター 星 睦美



    • 編集済み 星 睦美 2013年1月22日 1:20 移動のお知らせ
    2013年1月22日 0:17
  • チャブーンです。

    MSで用意されたコマンドツールはないようですが、検索でちょっと調べたところ、サードパーティでツールが出ているようですので、確認されてはどうでしょうか?

    http://helgeklein.com/free-tools/delprof2-user-profile-deletion-tool/

    サードパーティツールが使えない環境であれば、ご自分でスクリプトを組むしかないでしょう。簡単な内容としては、次の感じになるのではないかと。

    ・削除ユーザーのSIDを取得
    ・リモートセッションの確立
    ・HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\該当SID\ProfileImagePathのフォルダを削除
    ・HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\該当SIDレジストリキー自体を削除

    PowerShellのGet-ADUserやPSSession、Invoke-Commandを使えば割と簡単にできそうです。

    追記:興味があったのでちょっと作ってみました。Active Directoryモジュールがない環境でも動作しますが、ドメインに参加していることと、自分自身やリモート先のWinRMが有効になっていないと動作しません(winrm quickconfigコマンドを事前に実行してください)。

    .\delprofile.ps1 -Name <アカウント名> [-Computername <リモート名>]で動作するはずです。

    Param(
    [Parameter(Mandatory=$True,Position=1)]
    [string]$Name,
    [Parameter(Mandatory=$False,Position=2)]
    [string]$ComputerName="."
    )
    
    $objDomain = New-Object System.DirectoryServices.DirectoryEntry
    $objSearcher = New-Object System.DirectoryServices.DirectorySearcher
    $objSearcher.SearchRoot = $objDomain
    $objSearcher.SearchScope = "Subtree"
    
    $strFilter = "(cn=$Name)"
    $objSearcher.Filter = $strfilter
    $objUser = ($objSearcher.Findone()).GetDirectoryEntry()
    $SID=(New-Object System.Security.Principal.SecurityIdentifier $objUser.objectsid[0],0).Value
    
    Invoke-Command -Computername $ComputerName {
    	Param($Name,$SID)
    	Set-Location "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList"
    	IF ((Test-Path $SID) -eq $True) {
    		$ProfilePath=(Get-Item $SID).GetValue("ProfileImagePath")
    		$RegistryPath=(Get-Item $SID).PSPath
    		cmd /C rmdir /S /Q $ProfilePath
    		Remove-Item $RegistryPath -Recurse -Force
    		Write-Host $Name " (" $SID ") のプロファイルを削除しました。"
    		}
    	Else	{
    		Write-Host $Name " (" $SID ") のプロファイルは見つけられませんでした。"
    		}
    } -ArgumentList $Name,$SID


    2013年1月22日 1:35
    モデレータ
  • 回答ありがとうございます。

    やはりMS標準のコマンドは無いのですね。デフォルトユーザープロファイルの作成も面倒なことになってますし、残念です。

    サードパーティー製のツールですが、このツール(delplof2.exe)は商用では有償のようで3万以上するようですし、日本語でのサポートも望めないでしょうから、今回は難しいです。でも困っている方は、きっと沢山いるのでしょうね(笑)。

    PowerShellで出来るのですね。当方にはPowerShellのスキルが無いもので、こちらも今回はちょっと難しいですが参考にさせていただきます。

    PowerShellは今後ますます避けては通れないでしょうから興味はあるのですが、なかなか取り組めないです。本件を題材に時間のあるときに取り組んでみたいと思います。

    有用な情報をありがとうございました。

    2013年1月22日 3:49