質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.53%

  • PowerShell

    350questions

    Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

古いユーザプロファイルを削除したい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 568

SUSU0703

score 7

こんにちは。

Powershellで3か月以上前の古いユーザプロファイルを削除したいと思っています。

まず、こちらで実行したのですがすぐに終わってしまい何も処理がされませんでした。
Get-CIMInstance win32_userProfile | where{($_.LastUseTime -lt $(Get-Date).Date.AddDays(-180))} | Remove-CIMInstance

試しにwhere部分を省いて実行するとちゃんとプロファイルが削除されるので、whereの条件が間違っていると思っています。
Get-CIMInstance win32_userProfile | Remove-CIMInstance

Get-CIMInstance win32_userProfile の部分を実行してLastUseTimeを見るとこのようになっており、
LastUseTime                      : 6/6/2018 10:15:24 AM

次に、(Get-Date).Date.AddDays(-90) の部分を実行するとこのようになっています。
(Get-Date).Date.AddDays(-90)    Thursday, March 8, 2018 12:00:00 AM

よって、おそらくFormatが別のものと認識されて処理がされないのかと思っていますが、例えば以下のようにして
$maxage = (Get-Date).AddDays(-90).ToString("M/d/yyyy h:mm:ss tt")

$maxageを実行するとLastUseTime と同じ形式になったので
$maxage                3/8/2018 10:17:37 AM

以下のように実行してもやはり何も起こりません。おそらく時間ではなく文字列などで認識されているのかと思いますが、
これはどのようにすればちゃんと時間として認識して古いプロファイルが削除出来るようになるでしょうか。
$maxage = (Get-Date).AddDays(-180).ToString("M/d/yyyy h:mm:ss tt")
Get-CIMInstance win32_userProfile | where{($_.LastUseTime -lt $maxage)} | Remove-CIMInstance

宜しくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

こんにちは。  

Win32_UserProfileクラスのLastUseTimeプロパティはDatetime型なので無理にフォーマット変換する必要はありません。 

最初に示された、

# where内のカッコが怪しい...
Get-CIMInstance win32_userProfile | where{($_.LastUseTime -lt $(Get-Date).Date.AddDays(-180))} | Remove-CIMInstance

のカッコの付け方が怪しいので、

Get-CIMInstance win32_userProfile | where { $_.LastUseTime -lt $((Get-Date).Date.AddDays(-180)) }

の様にして対象オブジェクトが取得できるか確認してください。  
取得できれば後ろに

| Remove-CIMInstance

をつけてプロファイルを削除してください。


【補足】

ちなみに、LastUseTimeプロパティは実行ユーザーの権限によっては取得できず$nullになる場合があります。
上記回答に関してLastUseTimeプロパティは正しく取得できる前提です。

もし、LastUseTimeプロパティが取得できていない場合は「管理者として実行」してください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/06 17:40

    stknohg さん

    ありがとうございます。出来ました! 仰る通り、最初実行したときは何も起きず、全部のUserのLastuseTimeを見ると日時が表示されているものといないものがあり、管理者として実行すると全てのUserの日時が表示されてプロファイル削除も出来ました。

    最後にもう一点質問なのですが、Explorer上で見るUserProfileフォルダの"Date modified"の日付と、"LastuseTime"の日付が全く違うようで、"Date modified"だと2007年なのに"LastuseTime"だと2008年になっていたりして、Explorerのコラム一覧にもLastuseTimeのような項目がありませんでした。

    てっきり、Windows Explorerの"Date modified"の日付を元に削除されると思っていたのですが、このPowershell上の"LastuseTime"というのは、WindowsのExplorer上では確認できない箇所なんでしょうか。 もしくは、"Date modified" の日付で削除などは可能なのでしょうか。

    宜しくお願い致します。

    キャンセル

  • 2018/06/07 09:15

    私も正確な答えを把握していないのですが、調べた限りLastuseTimeプロパティはユーザー毎のレジストリの実体であるNTUSER.datの更新時刻と連動する値になる様です。
    プロファイルのフォルダ(C:\Users\Administratorなど)の更新時刻とは別物なのでエクスプローラーからは見れません。

    そして、Win32_UserProfileクラスにはプロファイルのフォルダを指すLocalPathプロパティがありますので、これを使えばフォルダの更新時刻などは取れると思います。
    ただし、フォルダの更新時刻はプロファイルの作成時(=初回ログイン時)からまず変わることはないと思われますのでこの情報が使い物になるかは怪しいですね。

    キャンセル

  • 2018/06/07 13:11 編集

    とりあえず値をとるだけなら、

    ```
    Get-CimInstance Win32_UserProfile |
    ForEach-Object {
    $dir = (Get-Item -LiteralPath $_.LocalPath)
    [PSCustomObject]@{
    SID = $_.SID;
    LocalPath = $_.LocalPath;
    LastUseTime = $_.LastUseTime;
    ProfileDirectoryLastAccessTime = $dir.LastAccessTime;
    ProfileDirectoryLastWriteTime = $dir.LastWriteTime;
    }
    }
    ```

    でいけるかと。
    (コメントだとインデントが崩れるのでそこは適当に直してください)

    キャンセル

  • 2018/06/07 18:00

    たびたびありがとうございます!試してみます。大変助かりました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PowerShell

    350questions

    Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。