スポンサーサイト

  • 2016.09.11 Sunday

一定期間更新がないため広告を表示しています

  • 0
    • -
    • -
    • -

    Configuration Manager の再インストールスクリプト

    • 2016.08.19 Friday
    • 11:39

    JUGEMテーマ:パソコン

     

     

    大規模組織ではかなりの割合で使用する組織が増えてきたSCCMですが、2007などを使用している場合によく起こる現象として、

    SCCMクライアントであるConfiguration Managerが壊れてしまい、SCCMサーバーと通信をしなくなってしまうことがあります。

     

    この原因は、実際にはリポジトリと呼ばれるファイルの破損によって起きていることが多いのですが、これらの関連するすべてを再インストールしようとすると1時間くらいはかかる作業になってしまいます。

     

    手動での処理の方法はMSのサイトに載っておりましたので、それをすべて自動化するスクリプトを作成しました。

     

    途中でシステムファイルを削除する項目は、ファイルのCALの委譲などをする必要がありややこしいので飛ばしております。

    MSに確認したらそこまで影響が無い項目らしいので許してください。

     

    ファイルは二つに分けます。

    全部管理者でログオンして、管理者で実行してください。

     

    ccmsetup.exe /uninstall を管理者で実行した後の動作を処理しているので、実行も含めたい場合には、一番先頭に絶対パスで入力してくださいね!

     

    1つ目のスクリプト

     

    # ダイアログ表示用のアセンブリインストール

    Add-Type -Assembly System.Windows.Forms


    # 下記条件にあるまで永遠に繰り返し

    while(1) {

    # コントロールパネルに表示するために必要なSMSRAP.cplが存在するか確認し、無い場合に処理を続行させる

             $exist = (Test-Path "C:¥Windows¥SysWOW64¥CCM¥SMSRAP.cpl")
             if($exist){
                         
                        'Configuration Manager のアンインストール中です。通常15分程度かかります。'
                        '30分以上かかる場合は、サービスを停止してから再度実行してください。'
            
                        }else{

    # 関連する証明書の削除

                       Get-Childitem cert:localmachine¥sms | Remove-item -force

    # 関連の設定ファイルやレジストリを削除

                       Remove-Item "c:¥windows¥smscfg.ini" -force
                       Remove-Item "HKLM:Software¥Wow6432Node¥Microsoft¥SMS" -force -Recurse
                       Remove-Item "HKLM:Software¥Wow6432Node¥Microsoft¥CCM" -force -Recurse
                       Remove-Item "HKLM:Software¥Wow6432Node¥Microsoft¥CCMSetup" -force -Recurse
                     
    # 再起動後にスクリプトが実行されるように設定        

                       New-ItemProperty "HKLM:SOFTWARE¥Microsoft¥Windows¥CurrentVersion¥RunOnce" -name "sccm_uninstall" -Value "sccm_uninstall_2nd_start.bat" -PropertyType String -force

    # 再起動前に警告を表示
              
                       [System.Windows.Forms.MessageBox]::Show("OKをクリックすると再起動が始まります。すべてのデータを保存してからOKをクリックしてください。")

                       Start-Sleep -Seconds 10

                       restart-Computer -force
                       }   
             Start-Sleep -Seconds 90
             }

     

    RunOnceに sccm_uninstall_2nd_start.bat  が指定されており、ここから以下のスクリプト(ps1)をキックしてます。

     

    Start-Sleep -m 10000

    # Repository_old がすでに存在する場合は先に削除

    $exist = (Test-Path "c:¥Windows¥System32¥wbem¥Repository_old")

    if($exist){
              Remove-Item "c:¥Windows¥System32¥wbem¥Repository_old" -force -Recurse
              }

    # 関連サービスをすべてストップ。Winmgmtがタイムアウトすることがあるので連打してます。何をとめるかは環境によって変化します。

    stop-Service "SMS Agent Host" -force
    stop-Service "Security Center" -force
    stop-Service "Winmgmt" -force
    stop-Service "Winmgmt" -force
    stop-Service "Winmgmt" -force

    # Repositoryフォルダをリネーム

    Rename-Item c:¥Windows¥System32¥wbem¥Repository Repository_old -force

    # 関連するサービスを開始。エラーが出ても気にしない。

    Start-Sleep -m 500

    Start-Service "Winmgmt"
    Start-Service "Security Center"
    Start-Service "SMS Agent Host"

    Start-Sleep -m 2000

    # フォルダが再構築されているか確認。

    $exist = (Test-Path "c:¥Windows¥System32¥wbem¥Repository")

    # 存在する場合は、処理が成功のためSCCMクライアントのプッシュを依頼。

    if($exist){
              $exist = (Test-Path "c:¥Windows¥System32¥wbem¥Repository_old")
              if($exist){
                                                                           
                        New-Item "C:¥ProgramData¥Corporate¥SCCM_Reinstall_OK.txt" -itemtype File -force

                        Get-date >> "C:¥ProgramData¥Corporate¥SCCM_Reinstall_OK.txt"

                        "該当のクライアントにプッシュを実行してください。" >> "C:¥ProgramData¥Corporate¥SCCM_Reinstall_OK.txt"

                        restart-Computer -force
             
                        }else{

                        New-Item "C:¥ProgramData¥Corporate¥SCCM_Reinstall_NG.txt" -itemtype File -force

                        Get-date >> "C:¥ProgramData¥Corporate¥SCCM_Reinstall_NG.txt"
     
                        "Repositoryフォルダがリネームされてません。もう一度実行して同じ結果なら手動でリネームを実施してみてください。" >> "C:¥ProgramData¥Corporate¥SCCM_Reinstall_NG.txt"

                        restart-Computer -force

                        }

            }else{
           
            New-Item "C:¥ProgramData¥Corporate¥SCCM_Reinstall_NG.txt" -itemtype File -force
           
            $i = "Repositoryフォルダが存在しません。もう一度実行して同じ結果ならリプレースが必要です。"

            Get-date >> "C:¥ProgramData¥Corporate¥SCCM_Reinstall_NG.txt"

            "Repositoryフォルダが存在しません。もう一度実行して同じ結果ならリプレースが必要です。" >> "C:¥ProgramData¥Corporate¥SCCM_Reinstall_NG.txt"

            restart-Computer -force

            }

     

    環境によって多少は動作が変わると思うので、各自実験しながら使ってみてください。

    あと、削除まではやってありますが、インストールはうちの環境ではSCCMからのプッシュで実行しています。

    手動でもインストールはできると思いますので、必要であればそれを追加してみてくださいね!

     

    年間100台くらいは、この作業が必要になっていたらしいので、私の今回の作成したスクリプトで年間100時間。

    約50万円/年の節約になります。

    作業時間は2時間程度でしたので、なんてリーズナブル!

     

    インフラ関係のことであれば何でもご相談ください!

    中抜きが無いので、他社さんよりお安く対応できます!

     

     

    スクリプトからキーボード操作を行う方法

    • 2016.08.04 Thursday
    • 11:47

    JUGEMテーマ:パソコン

     

    ITエンジニアに適任なのは、面倒が嫌いな人。

    これは仕事をしない人という意味ではなく、繰り返しの作業は基本的に全部自動化することで面倒を減らす努力をするという意味になります。

     

    すべての作業をマクロ化するのは大変なので、これを自動的にマクロ化してくれるソフトとしては UWSC などが有名ですね!
    でも、自動記録というは簡単な反面、複雑なことをするのであると結局自分でコードを書く必要があり、プロが使うようなものじゃないです。

     

    VBSでもPowershellでも、同じようにキーボードの入力をマクロ化して操作する方法が提供されています。

    これ、通常のスクリプトと違ってあまりに長いコードを書くと、途中で別の画面にフォーカスが移ってしまうと操作が中断する恐れがあります。

    これはスクリプトでGUIをいじっているだけだからですね。

    GUI操作を目視しながら作成できるので簡単なのですが、あくまで簡易的と考えて使ってくださいね!

     

    下記はレノボのPCでFnキーをlockした状態でユーザーに渡したかったのですが、どうしても直接操作するメソッドが見当たらなかったので、SendKeyメソッドで操作した例になります。

    最近、意地でもスクリプト化して、完成した瞬間が快感です笑


    add-type -AssemblyName System.Windows.Forms

    Start-Process "Shell:::{725BE8F7-668E-4C7B-8F90-46BDB0936430}"

    Start-Sleep -m 2000

    [System.Windows.Forms.SendKeys]::SendWait("^{TAB}")

    Start-Sleep -m 500

    [System.Windows.Forms.SendKeys]::SendWait("^{TAB}")

    Start-Sleep -m 500

    [System.Windows.Forms.SendKeys]::SendWait("%L")

    Start-Sleep -m 500

    [System.Windows.Forms.SendKeys]::SendWait("{ENTER}")

    Windowsにログオンができないときの対処方法

    • 2016.08.02 Tuesday
    • 15:58

    JUGEMテーマ:パソコン

     

     


    Ctrl+Alt+Delete を押して、パスワードを入力しても青い画面のまま、もしくはまた最初の画面に戻る現象があります。


    先日、そのような現象があり苦労したので回避方法をご紹介します。


    まず、当方の環境で発生した現象ではセーフモードでのログオンは可能でした。


    また、画面事態は青い画面のまま何も表示されていない状況だったのですが、実際に多数のプロセスは起動しているようで、外部のパソコンからイベントビューアが覗けたり、エクスプローラーからファイルの移動ができたりなど画面が表示されない以外は正常と考えられる動作でした。
     

    確認事項は以下の通りです。


    まずは権限の確認を行います。


    画面の表示=シェルの起動は userinit.exe が起動すると表示されますので、ここら辺を重点的に確認します。


    userinit.exe に関するアクセス許可は適切であるか。
    ADコンテナのUsers グループの情報は適切であるか。


    今回はこちらは正常でした。


    次にクリーンブートを実行したところ、マカフィーのサービスはオフにすることができなかったので、それ以外のサービスを切ってみたところ起動できませんでした。

    ここまでの切り分けで考えられることとして、マカフィーが一番怪しいということが分かります。
     

    オフにすることができないマカフィーの設定ですが下記の設定でオフにすることが可能です。


    HKEY_LOCAL_MACHINE¥SYSTEM¥CurrentControlSet¥Services


    この配下にある、各種マカフィーをクリックし手選択して Start の値を4に変更するとサービスを止めることができるようになります。

    完全なクリーンブート状態で確認したところ、回避が確認されました。


    今回パッチ配信の直後に発生した現象なので、何らかの誤作動で useuinit.exe をマカフィーがロックかけてしまったことが原因のようでした。


    セキュリティソフトは起動時に最も無防備になるパソコンを守るために、起動プロセスに割り込む動作をすることがあります。


    その割込にて変な判定を受けてしまったようです。

     

    同じような現象が発生していたら、セキュリティソフトを一時停止 or アンインストールしてみると回避されるかもしれません。

    ITを使ってコスト削減!

    • 2016.08.01 Monday
    • 13:13

    JUGEMテーマ:パソコン

     

     


    会社を経営するうえで、かかる費用を減らすのは非常に大事なことです。


    しかし、先日ある経営者の話を聞いてびっくりしたことがあります。


    「ITなんかにいくらコストかけてもお金は生み出さない。無駄だ!」


    上記は残念ながらITが理解できていない方の発想になります。

     

    そもそもITの導入が流行ったのは、経営を効率化させるためでした。


    2016年に発表されたある統計では、時間当たりの作業効率で、日本は先進国最低となりました。


    海外の会社に行くと、金曜日などは午後でみんな帰ってしまう状況ですが、時間当たりの効率が高いので全体の売り上げはかなり多くなります。


    一方で日本の場合は作業効率が低いので、長時間労働をして「サービス残業問題」が発生したり「過労死」などが起きてしまっています。

     

    作業効率が低いというのは、ITが積極的に導入されるまでは特に問題視されませんでした。


    しかし、海外で積極的にITを導入したことで世界と日本に大きな差が出てきてしまっているのが現在の状況です。


    皆様もこんな経験はないでしょうか。

     

    インフルエンザに罹患したため、治った後も自宅待機で仕事ができない。


    複数人での会議の予定を立てる為、何度もメールをやり取りする。


    営業で出かけていたが、会議があるので1時間かけて事務所に戻る。


    稟議書にハンコを貰うため、上司の席を次々と渡り歩く。


    聞きたいことがあったが、相手がほかの人と話をしていたので終わるまで待つ。


    各種申請書がどこにあるのか探す。


    上記には実はすごいコストがかかっていますが、ITを整備すればすべて0円になるようなことばかりです。


    そして日本に来るような規模の外資系の会社ではまずありえない状況です。


    ITのエンジニアは悪く言うと頭でっかちな人間が多いと思います。


    決して経営者の目線では物事は見れないため、なかなか経営に役立つITの活用情報が出回りません。


    会社が儲かるようにするためには・・


    1. 売り上げを伸ばす


    2. コストを減らす


    極論を言えばこの二つだけですので、そのどちらにもITを活用することで活路が見えます。 


    当社はコンサルではありませんが、システムの提案くらいは可能ですのでいつでもお声掛けください。

    データをバックアップするためのスクリプト

    • 2016.07.29 Friday
    • 13:11

    JUGEMテーマ:パソコン

     

     

    データを保存しておかないと、いつか大変なことになります。

    かといって、毎日バックアップするのは大変だし・・

     

    そんな方にお勧めなのが、スクリプトで自動実行です♪

     

    以下のコマンドをテキスト等にコピーして、拡張子を.ps1にして保存してください。

    そしてそれを起動するためのBATファイル等を作成してタスクスケジューラーに登録しましょう!

     

    それだけで必ず指定した日にデータを保存するようになります。

     

    # ユーザー名と外付けHDDのドライブレターを確認、ならびに追加フォルダがあるか確認

    [void][System.Reflection.Assembly]::Load("Microsoft.VisualBasic, Version=8.0.0.0, Culture=Neutral, PublicKeyToken=b03f5f7f11d50a3a")
    $Drive = [Microsoft.VisualBasic.Interaction]::InputBox("外付けHDDのドライブレターを入力", "ドライブレター確認")
    $username = [Microsoft.VisualBasic.Interaction]::InputBox("対象のUIDを入力", "ユーザー確認")
    $path1 = [Microsoft.VisualBasic.Interaction]::InputBox("追加したいパスを入力", "追加フォルダ1個目")
    $path2 = [Microsoft.VisualBasic.Interaction]::InputBox("追加したいパスを入力", "追加フォルダ2個目")
    $path3 = [Microsoft.VisualBasic.Interaction]::InputBox("追加したいパスを入力", "追加フォルダ3個目")

    New-Item $Drive":¥$username" -ItemType Directory -Force

    # デスクトップフォルダが存在する場合にコピー

    $exist = (Test-Path "c:¥users¥$username¥desktop")
    if ($exist){Copy-Item "c:¥users¥$username¥desktop" $Drive":¥$username" -Recurse -force}

    # ドキュメントフォルダが存在する場合にコピー

    $exist = (Test-Path "c:¥users¥$username¥documents")
    if ($exist){Copy-Item "c:¥users¥$username¥documents" $Drive":¥$username" -Recurse -force}

    # ピクチャフォルダが存在する場合にコピー

    $exist = (Test-Path "c:¥users¥$username¥pictures")
    if ($exist){Copy-Item "c:¥users¥$username¥pictures" $Drive":¥$username" -Recurse -force}

    # ビデオフォルダが存在する場合にコピー

    $exist = (Test-Path "c:¥users¥$username¥videos")
    if ($exist){Copy-Item "c:¥users¥$username¥videos" $Drive":¥$username" -Recurse -force}

    # ミュージックフォルダが存在する場合にコピー

    $exist = (Test-Path "c:¥users¥$username¥music")
    if ($exist){Copy-Item "c:¥users¥$username¥music" $Drive":¥$username" -Recurse -force}

    # お気に入りフォルダが存在する場合にコピー

    $exist = (Test-Path "c:¥users¥$username¥favorites")
    if ($exist){Copy-Item "c:¥users¥$username¥favorites" $Drive":¥$username" -Recurse -force}

    # 追加フォルダがある場合にコピー

    $exist = (Test-Path $path1)
    if ($exist){Copy-Item $path1 $Drive":¥$username" -Recurse -force}

    $exist = (Test-Path $path2)
    if ($exist){Copy-Item $path2 $Drive":¥$username" -Recurse -force}

    $exist = (Test-Path $path3)
    if ($exist){Copy-Item $path3 $Drive":¥$username" -Recurse -force}

    PR

    calendar

    S M T W T F S
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
    << August 2019 >>

    selected entries

    categories

    archives

    recent comment

    recommend

    links

    profile

    search this site.

    others

    mobile

    qrcode

    powered

    無料ブログ作成サービス JUGEM