TEMTECOMAI ORTHOSTATIC HYPOTENSION

元ダメプログラマで現ダメ中間管理職の駄文

Windows 10 に .NET Framework 3.5 をインストールする

.NET Framework 3.5 をインストールしたい場合は [コントロール パネル] - [プログラム] - [Windows の機能の有効化または無効化] で [.NET Framework 3.5 (.NET 2.0 および 3.0 を含む)] にチェックを入れて [OK] をクリックすればインストールすることができますわね。
この時の実際のインストールは Windows Update 経由で行われるらしいよ。(よくわからんし、調べるつもりもないけれど)

0x800F081F とか 0x800F0906 とかのエラーでインストールできないよ

がしかしタイトルにもある通り 0x800F081F のエラーが出てインストールすることができない場合があるっていう。
Windows Live メールも .NET Framework 3.5 が必須。 実に困った状態。(今時 Windows Live メール使うなって話もあるが)
0x800F081F ってのは 「ソースが見つからない」 っていうエラーらしいです。 (よくわからんし、調べるつもりもないけれど)

0x800F0906 が出た

会社でよく発生しそうなエラー。
PC が .NET Framework 3.5 に必要なファイルを Windows Update からダウンロードできない場合に発生するらしいよ。
PC が社外と通信するための設定が不完全 (ファイアウォールとかプロキシとか) だったり、WSUS がしゃしゃり出てくるようになっていたり。
もし一時的に WSUS を経由しないで直接 Windows Update サーバーと通信できるように環境を変えられるのなら問題ないらしい。
ということなので、GPO で 「WSUS を使わない」 というポリシーをリンクさせた作業用の OU を作成し、作業中の PC をその OU に入れて再チャレンジしてみた。

今度は 0x800F081F が出た

先ほどまでのエラーと似たエラー番号なので変化に気づきづらかったよ。
KB2734782 によれば 「代替インストール ソースに指定した場所に必要なものがない、またはそれを読み取る権限がない、または壊れている」 ということらしいが、そんなもんを指定した記憶はない。
ただ単純に Windows の機能から .NET Framework 3.5 を有効にしようとしただけだもの。

OS のメディアを使って手っ取り早くインストールした

うちの場合は 0x800F081F だったので Windows 10 のメディアを使って解決した。
メディアは Microsoft からダウンロードした Windows 10 インストール イメージを焼いておいたもの。
こいつを使って .NET Framework 3.5 をインストールできるらしい。 iso を直接マウントしても大丈夫っぽい。
PowerShell を管理者権限で起動して下記のコマンドを打つ。
Enable-WindowsOptionalFeature -Online -FeatureName NetFx3 -All -Source "D:\x64\sources\sxs" -LimitAccess
この場合 Windos 10 のメディアが D: ドライブにあるってことで、Source オプションで sxs フォルダーの位置を指定してあげる。
同様のことは Dism っていうコマンドでも可能らしい。 (よくわからんし、調べるつもりもないけれど)
さらには Fondue というコマンドもあるらしい。 (よくわからんし、以下同文)
TechNet ブログ Windows 8 に .NET Framework 3.5 をインストールする、もう1つの方法 Fondue に一通り書いてある。

KB2966828 (MS14-046) が原因になることがあるらしい

KB2966828 (MS14-046) は .NET Framework のセキュリティ修正プログラムのひとつで、Address Space Layout Randomization (ASLR) というセキュリティ機能を迂回されてしまう脆弱性を修正するらしい。
ASLR ってのはプロセスをロードする場所をランダムな場所にする仕組みらしい。 ランダムな場所にロードすることで、攻撃者が攻撃しづらくするらしい。 (よくわからんし、調べるつもりもないけれど)

ASLR の仕組みを簡単に説明すれと 「毎回同じフロアのトイレの同じ個室で仕事をさぼっているとバレてしまうので都度ランダムな個室を選択する」 ということだね。

この KB2966828 は PC に .NET Framework 3.5 がインストールされていることを前提としているらしいので、KB2966828 をインストールした後に初めて .NET Framework 3.5 を有効にしようとするとエラーになるようですね。
例えば 「社内で PC をセットアップする際に Windows Update でガンガン攻めて、最後に Windows Live メールをインストールしようとして .NET Framework 3.5 を有効化しようとしたらエラー」 とか。

で、Windows 8.1 以前や Server 2012 R2 以前の Windows にはさらなる修正プログラム KB305628 が用意されているので、修正プログラムを適用すれば問題が解決するらしい。

Windows 10 用の修正プログラムは用意されていないようだ。。。
Web をさまよってみると 「Windows 10 ではコマンド プロンプトからの Dism コマンドや、PowerShell の Enable-WindowsOptionalFeature コマンドレットでならインストールできた」 という情報もあるし、一時的に KB2966828 をアンインストールしたって話もある。
まぁいろいろ選択肢があるってことですかね。

1
SharePoint ってやつは、ページ上に 「Web パーツ」 とか 「アプリ パーツ」 と呼ばれる 「機能」 をポトペタしていくわけですよ。 この 「機能」 ってやつにはいろんな種類があるんだけど、まぁ一番使うのは 「ドキュメント ライブラリ」 と 「お知らせ」 あたりだと思う。

サイト作成者としては、これらのパーツをサイトのページ上にポトペタする。 そして次のような使い方をイメージする。
「サイトの利用者はページ上のパーツにドキュメントを登録したり、ページ上のパーツに登録されているドキュメントを編集したりダウンロードしたいする」

サイト作成者がパーツを配置したページには何種類かのパーツが配置されているのだが、何かの拍子に 「操作しているパーツだけが表示されているページ」 に飛ばされてしまうことがある。
どうやらそのパーツだけのための裏ページが存在していて、そのページに迷い込むと自分の居場所を見失ってしまい、サイト内で迷子になってしまう恐怖のページなのである。

作成者が意図して作りこんだページの URL はこんな感じ。
xxxx.sharepoint.com/sites/foo/baa/_layouts/15/start.aspx#
このページ上にいくつかのパーツを配置している。
利用者はこのページ上に配置されているいくつかのパーツの機能を利用する。
例えば、ドキュメント ライブラリを基にした議事録用のエリアがあり、利用者は登録済みの議事録を閲覧したり、新しい議事録を登録したりする。

で、この議事録用のパーツ専用の裏ページの URL がこんな感じ。
xxxx.sharepoint.com/sites/foo/baa/_layouts/15/start.aspx#/DocLib1/Forms/AllItems.aspx
DocLib1 ってのは議事録用のパーツに付けられた名前。
(ちなみに新しいパーツを準備する時に、いきなり日本語の名前を付けてしまうとこういう機械的な名前になっちゃうらしく、アスキー文字で名前を付けた後に改名すれば理解可能な URL になるらしい)
このページには議事録用パーツのビューしか存在せず、その他のパーツは表示されていない。 ただしページの最上部や左側には共通項目が表示されている。
作成者が作ったページ上のパーツのビューは作成者の手によってツールバーを非表示にしてあったり、グループ化してツリー表示にしたりと様々なカスタマイズがしてあるのだが、AllItems.aspx は単なる表形式の表示になっている。
このページの存在を認めるのなら、このページ上のビューもカスタマイズしないと気が済まない。
なんなんだこの手の掛かりようは。。。

ちなみにページ左側の [最近使った項目] の下に表示されている項目はこの AllItems.aspx のページらしい。
裏ページは思ったよりも近くにいるようだ。

PowerShell ってもんは、横に横にと、ものすごく長くなってしまう宿命なのかしらね。
世界で一番嫌いなのが横スクロールだ。
Param
(
    [ValidateSet("Phonetic", "EmployeeNumber", "AccountName")]
    [string]
    $conditionType,
    [string]$value
)

switch ($conditionType)
{
    "Phonetic" { $condition = "msds-PhoneticDisplayName -like '*$value*'"; break }
    "EmployeeNumber" { $condition = "employeeNumber -eq '$value'"; break }
    "AccountName" { $condition = "samaccountName -eq '$value'"; break }
    default { $condition = "*" }
}

Get-ADUser -Filter $condition -Properties * | Select-Object Enabled, LockedOut, Description, UserPrincipalName, Surname, Givenname, msDS-PhoneticDisplayName, EmployeeNumber, Department, EMailAddress, DistinguishedName

Get-ADUser -Filter $condition | Get-ADPrincipalGroupMembership | Sort-Object GroupScope, Name | Format-Table GroupScope, Name -AutoSize
みたいな

黒崎くんの言いなりになんてならないが 2月27日 (土) から全国上映されるらしいのですが、その映画チケット 2枚を予約してほしいと頼まれた。
まだ 2週間も前なので予約できないわけですが、TOHO シネマズのサイトを見ていると封切日の 10時20分の回が終わった所で出演者たちによる舞台挨拶が全国同時中継される、と。

TOHO シネマズ宇都宮での PC 等によるチケット予約は 24日の深夜 0時から始まるわけですが、なんか昨日から 「きっと忘れる」 とか 「その日は遊びに来ないよね」 とかプレッシャーを受け続けているわけですよ。

がんばるから。
がんばるからさ。

クイック操作による新規メール作成では宛先, cc, bcc, タイトル, 本文, フラグ, 重要度などをあらかじめ定義しておけるため、こりゃほぼほぼテンプレート機能じゃないか、というのが前回の記事

しかしクイック操作による新規メール作成の定義では、本文はプレーン テキストに限られており、HTML メールのような装飾は入れることができません。
定型業務報告などでメール本文で済ませるような場合に表を使いたいこともあるのですが、テンプレート機能だと呼び出し操作の手数が多いので困ってしまいます。

そこでもう少しクイック操作について深掘りしてみたところ、メールを新規で作成させるジョブじゃなくても同様の事ができる気がしてきました。

テンプレートとなるメールを下書きフォルダーに保存しておき、その下書きメールを複製して編集 → 送信ってする手順をクイック操作でやってみる。
  1. 新規メール作成画面を開き、定型化する要素を入れ込んでいく。
  2. 一通り作成したらメールを下書きに保存する。(作成画面を閉じようとすると聞いてくる)
  3. [ホーム] タブの [クイック操作] を開き、[新しいクイック操作] - [ユーザー設定] をクリック。
  4. 適当な名前を付ける。
  5. 「フォルダーへコピー」 のアクションを選択。
  6. コピー先のフォルダーとして 「下書き」 を選択。
これで準備完了。 次は本番
  1. 下書きフォルダーを開き、テンプレートとなる下書きメールを選択。
  2. [ホーム] タブの [クイック操作] から、先ほど作成したクイック操作を選択する。
  3. 選択した下書きメールが下書きフォルダーに複製される。
  4. 複製されたメール (どっちでもいいけど) をダブルクリックして編集画面を開き、必要な修正を加えたら送信する。
手順としてはこんなもんですかね。

他に、定型句的なアプローチ方法も使えそうだ。
いわゆるクイック ギャラリーってやつですね。 クイック ギャラリーにユーザー独自の本文パーツを用意しておき、これらを挿入してメールを組み立てていく。 本文にバリエーションを持たせる場合に使えそうなので、定型業務向けというよりは、会社のメール文化や自分のスタイルに合わせた定型文パーツを複数用意しておいて、これらを組み合わせてビジネスメールを作成するって感じでしょうか。
  1. メールの作成画面で本文をある程度作りこむ。
  2. クイック パーツに登録したい箇所をマウスでドラッグして選択する
  3. メール作成画面の [挿入] タブにある [クイック パーツ] から [選択範囲をクイック パーツ ギャラリーに保存] を選択する。
  4. 適当な名前を付け、オプションが 「内容のみ挿入」 となっていることを確認する。
これで準備完了。 次は本番
  1. いつものように新規メール作成画面を開く。
  2. 作成画面の [挿入] タブにある [クイック パーツ] を開き、本文に挿入したいクイック パーツを選択する。
タイトルや宛先を定義しておくことはできないのでガチガチの定型メールでは扱いづらいのも否めない。
これらをテンプレートや下書きで定義しておき、いくつかのパターンが考えられる本文の一部に対してクイック パーツを使うという手もあるって話ですね。

Outlook 2010 やら 2013 での話。 (2016 はまだ使っていないのでわからない)

せっかく作ったメール テンプレートですが、これを使って新規メールを作成するまでの手順がひどすぎる。
[ホーム] タブの [新規作成] グループにある [新しいアイテム] をクリックし、その中の [その他のアイテム] の更に奥の [フォームの選択] をクリックすると 「フォームの選択」 というダイアログが出る。
POP3 のメール設定だからなのかもしれないが、「フォルダーの場所」 のドロップダウン ボックスで 「ファイル システム内のユーザー テンプレート」 を選択し、一覧に表示された中から目的のテンプレートを選択して [開く] ボタンをクリック (またはテンプレートをダブルクリック) する。
これでようやくテンプレートを使った新規メールが開く。

Outlook 2013 : メール テンプレートへの長い道のり

Outlook 2013 : フォーム選択ダイアログ

定型メールを手早く作成するためのテンプレートも、呼び出すためにマウスを何度もクリックせにゃならんと面倒になってきて、だんだんと使わなくなり、しまいにゃ前回送ったメールを元に新規メールを作ったりするようになる。

そこで Outlook のクイック操作が登場。
[ホーム] タブの [クイック操作] グループにある [新しいクイック操作] から [新しい電子メール] を選択。
このダイアログで宛先、タイトル、本文などを保存しておくと、クイック操作の一覧からワンクリックで定型メールが作成できるようになる。

Outlook : クイック操作

これで定型メールを連発することが可能になった。

Windows 10 の Inside Preview でローンチしたのは 7月の半ばでしたかね。
そして翌月の月例アップデートに MS15-091 : Microsoft Edge 用の累積的なセキュリティ更新プログラム (3084525) が 「緊急」 として初登場。
インパクトのある初登場でした。
9月には MS15-095 : Microsoft Edge 用の累積的なセキュリティ更新プログラム (3089665) が 「緊急」 として 2ヶ月連続 2回目の登場。
10月には MS15-107 : Microsoft Edge 用の累積的なセキュリティ更新プログラム (3096448) が若干ランクを下げた 「重要」 で 3ヶ月連続 3回目の登場。
11月は MS15-113 : Microsoft Edge 用の累積的なセキュリティ更新プログラム (3104519) で再び 「緊急」 に返り咲き、4ヶ月連続 4回目の登場。
12月ももちろん MS15-125 : Microsoft Edge 用の累積的なセキュリティ更新プログラム (3116184) を 「緊急」 でぶっこみ、見事 5ヶ月連続 5回目の登場を果たした。

頑張ってください。

たとえテストだろうがインストール要件に 4コアの CPU とか書いてあるわけだからそのとうりのスペックを用意せにゃならんのだろうね。
4年前に導入した Core i-3 2100 3.1GHz だと 2Core 2HT でギリギリなわけだけど、その全てを cCPU としてつぎ込んじゃっても大丈夫なのかね。
今時の仮装環境って CPU の数がオーバーしてても大丈夫なの?
同時稼働してる仮想マシン群の vCPU の合計が物理 CPU の数をオーバーしても大丈夫、って記事があるのだからきっと大丈夫だよね

一人当たり月額 1500円くらい高いけど Skype for Business (旧 Lync) ですんげー人数が参加する会議 (経営トップから全従業員への新年の挨拶とか) ができたり、(日本ではまだ開始時期が未定だけど) Skype For Business から通常の電話にかけられるようになるんだってさ。
他にもいろいろ機能がアップしてるんだってさ。
1ライセンスだけで E3 を契約してるボクには関係ない話だね。

年明けて時間があれば試してみようと思う。
てか自分で契約してる SharePoint Online 使えよとか思うけど、無償版なりに何ができるのかわからんので。
まぁ今時社内静的な HTML でシコシコ編集して社内ポータル後悔してるのもなんだかなだし、Expression Web に怒られっぱなしなソースだし、本職の人が見たら卒倒しちゃうようなソースだし、何の計画性もなく積み上げられた CSS だし。
このまま行くといつかは本文無しで単なる PDF ファイルへのリンク集になっちゃいそうだし。
オンプレミスで SharePoint Server を入れるほどの費用対効果もなさそうだしね。

一時期随分と悩んでいた件、sem さんからコメントにてお教えいただいたように、DB 側の remote query timeout の値を初期値の600 から無制限の 0 に変更したところ無事に完了するようになりました。
感謝です。
USE SUSDB ;
GO
EXEC sp_configure 'remote query timeout', 0 ;
GO
RECONFIGURE ;
GO

VMware で作成した Windows Server で Active DIrectory を構築しようとした。
ホストの物理ネットワークへは接続しないよう、独立した仮想ネットワークを設定。
VMnet2 をカスタマイズ。 (といってもローカル DHCP サーバーを無効にしただけ)
Windows Server をインストールし、決めておいた IP アドレスに設定。
dcpromo.exe のウィザードで Active Directory をインストール。
ウィザードの途中で 「IP アドレスが動的になってるけど、このまま動的で行っちゃう? yse / no」 とのダイアログが出たので迷わず [no] をクリックしたが、再び同じダイアログが表示されて前に進めない。
ipconfig /all してみると確かに固定アドレスも設定してあるが、自動構成でローカル アドレスが "(優先)" で振られてしまう。 ipconfig /all してみると確かに自動構成で 169.254. のローカル アドレスが付与されていて (優先) となっている。 自分で設定したアドレスのほうは末尾に (重複) と表示されている。

VMnet2 の設定を見直したところ 「ホスト オンリー」 になっていた。 つまり仮想マシンはホスト マシンとだけ通信が可能な設定。
ホスト マシンで ipconfig /all してみたら VMnet2 のアダプターにアドレスが振ってあり、そのアドレスが仮想マシンと被っていた。 ホスト マシン側の VMnet2 アダプターに明示的にアドレスを設定したつもりがなかったので気づかなかったよ。

ここ数日の成果物は PowerShell のスクリプト ファイル (*.ps1) と SQL Serve 用のスクリプト ファイル (*.sql) に分散してしまっている。
どうせなら PowerShell に一本化したいよね。
残念ながら Windows Server 2008 R2、WSUS 3.0、Windows Internal Database という我が WSUS 環境では PowerShell による管理が整備されきっていない時代の物らしく、WSUS はアセンブリを読み込んで .NET 的なアプローチをし、SQL Server は sqlcmd.exe に sql ファイルを流し込む事になるようです。
しかも sqlcmd.exe は Windows Internal Database ではインストールされないようなので別途無償版の SQL Server Management Studio Express とかをインストールしないとなりませんね。
Windows Server 2012 の WSUS 4.0 では PowerShell のコマンドレットが用意されているみたいですね。
Windows Internal Database はどうなんでしょうか。。。 SQL Server 2012 以降なら PowerShell 用の sqlps モジュールもありますが、WID ではダメなんでしょうか。。。 ダメかもわからんね。。。

スクリプト センターにある Re-index the WSUS 3.0 Database っていう SQL はデータベースのインデックスを再構成するためのメンテナンス スクリプトだけれど、こいつを流すと OS の表示が Windows 10 から Vista に戻っちゃうよ。
tbComputerTargetDetail テーブルの OSDescription 列の内容が戻っちゃうんだよね。
なので先日のスクリプトと合体させてみた。
USE SUSDB; 
GO 
SET NOCOUNT ON;

-- Rebuild or reorganize indexes based on their fragmentation levels 
DECLARE @work_to_do TABLE ( 
    objectid int 
    , indexid int 
    , pagedensity float 
    , fragmentation float 
    , numrows int 
) 

DECLARE @objectid int; 
DECLARE @indexid int; 
DECLARE @schemaname nvarchar(130);  
DECLARE @objectname nvarchar(130);  
DECLARE @indexname nvarchar(130);  
DECLARE @numrows int 
DECLARE @density float; 
DECLARE @fragmentation float; 
DECLARE @command nvarchar(4000);  
DECLARE @fillfactorset bit 
DECLARE @numpages int 
 
-- Select indexes that need to be defragmented based on the following 
-- * Page density is low 
-- * External fragmentation is high in relation to index size 
PRINT 'Estimating fragmentation: Begin. ' + convert(nvarchar, getdate(), 121)  
INSERT @work_to_do 
SELECT 
    f.object_id 
    , index_id 
    , avg_page_space_used_in_percent 
    , avg_fragmentation_in_percent 
    , record_count 
FROM  
    sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, 'SAMPLED') AS f 
WHERE 
    (f.avg_page_space_used_in_percent   < 85.0 and f.avg_page_space_used_in_percent/100.0 * page_count   < page_count - 1) 
    or (f.page_count > 50 and f.avg_fragmentation_in_percent > 15.0) 
    or (f.page_count > 10 and f.avg_fragmentation_in_percent > 80.0) 

PRINT 'Number of indexes to rebuild: ' + cast(@@ROWCOUNT as nvarchar(20)) 

PRINT 'Estimating fragmentation: End. ' + convert(nvarchar, getdate(), 121) 

SELECT @numpages = sum(ps.used_page_count) 
FROM 
    @work_to_do AS fi 
    INNER JOIN sys.indexes AS i ON fi.objectid = i.object_id and fi.indexid = i.index_id 
    INNER JOIN sys.dm_db_partition_stats AS ps on i.object_id = ps.object_id and i.index_id = ps.index_id 

-- Declare the cursor for the list of indexes to be processed. 
DECLARE curIndexes CURSOR FOR SELECT * FROM @work_to_do 

-- Open the cursor. 
OPEN curIndexes 

-- Loop through the indexes 
WHILE (1=1) 
BEGIN 
    FETCH NEXT FROM curIndexes 
    INTO @objectid, @indexid, @density, @fragmentation, @numrows; 
    IF @@FETCH_STATUS   < 0 BREAK; 

    SELECT  
        @objectname = QUOTENAME(o.name) 
        , @schemaname = QUOTENAME(s.name) 
    FROM  
        sys.objects AS o 
        INNER JOIN sys.schemas as s ON s.schema_id = o.schema_id 
    WHERE  
        o.object_id = @objectid; 

    SELECT  
        @indexname = QUOTENAME(name) 
        , @fillfactorset = CASE fill_factor WHEN 0 THEN 0 ELSE 1 END 
    FROM  
        sys.indexes 
    WHERE 
        object_id = @objectid AND index_id = @indexid; 

    IF ((@density BETWEEN 75.0 AND 85.0) AND @fillfactorset = 1) OR (@fragmentation   < 30.0) 
        SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REORGANIZE'; 
    ELSE IF @numrows >= 5000 AND @fillfactorset = 0 
        SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REBUILD WITH (FILLFACTOR = 90)'; 
    ELSE 
        SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REBUILD'; 
    PRINT convert(nvarchar, getdate(), 121) + N' Executing: ' + @command; 
    EXEC (@command); 
    PRINT convert(nvarchar, getdate(), 121) + N' Done.'; 
END 

-- Close and deallocate the cursor. 
CLOSE curIndexes; 
DEALLOCATE curIndexes; 

IF EXISTS (SELECT * FROM @work_to_do) 
BEGIN 
    PRINT 'Estimated number of pages in fragmented indexes: ' + cast(@numpages as nvarchar(20)) 
    SELECT @numpages = @numpages - sum(ps.used_page_count) 
    FROM 
        @work_to_do AS fi 
        INNER JOIN sys.indexes AS i ON fi.objectid = i.object_id and fi.indexid = i.index_id 
        INNER JOIN sys.dm_db_partition_stats AS ps on i.object_id = ps.object_id and i.index_id = ps.index_id 
    PRINT 'Estimated number of pages freed: ' + cast(@numpages as nvarchar(20)) 
END 
GO 

-- 不具合対応 ここから

-- Windows 8.1 の PC 情報を修正
UPDATE [SUSDB].[dbo].[tbComputerTargetDetail]
SET [OSDescription] = 'Windows 8.1'
WHERE [OSMajorVersion] = '6'
AND [OSMinorVersion] = '3'
AND [OldProductType] = '1'
AND ([OSDescription]   <> 'Windows 8.1' or [OSDescription] IS NULL) 

-- Windows Server 2012 R2 の PC 情報を修正
UPDATE [SUSDB].[dbo].[tbComputerTargetDetail]
SET [OSDescription] = 'Windows Server 2012 R2'
WHERE [OSMajorVersion] = '6'
AND [OSMinorVersion] = '3'
AND [OldProductType]   <> '1'
AND ([OSDescription]   <> 'Windows Server 2012 R2' or [OSDescription] IS NULL) 

-- Windows 10 の PC 情報を修正
UPDATE [SUSDB].[dbo].[tbComputerTargetDetail] 
SET [OSDescription] = 'Windows 10' 
WHERE [OSMajorVersion] = '10' 
AND [OSMinorVersion] = '0' 
AND [OldProductType] = '1' 
AND ([OSDescription]   <> 'Windows 10' or [OSDescription] IS NULL)
-- 不具合対応 ここまで --


--Update all statistics 
PRINT 'Updating all statistics.' + convert(nvarchar, getdate(), 121)  
EXEC sp_updatestats 
PRINT 'Done updating statistics.' + convert(nvarchar, getdate(), 121)  
GO 
まぁまぁいいんじゃない?

↑このページのトップヘ