2018年11月19日月曜日

browserify の ParseError はどこから来るのか

.
.

 ↓ エラーはこちらです。

export var b = {};
^
ParseError: 'import' and 'export' may appear only with 'sourceType: module

↓ 大元の発生源はここですね…

@node_modules\browserify\index.js

Browserify.prototype._syntax = function () {
...
            var err = syntaxError(row.source, row.file || row.id);
            if (err) return this.emit('error', err);

syntax-error から acorn-node に接続するようです。

↓ 停止位置はこちらでした。 

@node_modules\acorn-node\node_modules\acorn\dist\acorn.js

// Parse a single statement.
//
// If expecting a statement and finding a slash operator, parse a
// regular expression literal. This is to handle cases like
// `if (foo) /blah/.exec(foo)`, where looking at the previous token
// does not help.

pp$1.parseStatement = function(context, topLevel, exports) {
...
  case types._import:
    if (!this.options.allowImportExportEverywhere) {
      if (!topLevel)
        { this.raise(this.start, "'import' and 'export' may only appear at the top level"); }
      if (!this.inModule)
        { this.raise(this.start, "'import' and 'export' may appear only with 'sourceType: module'"); }

総括しますと、

importexport 構文を許可しないことが問題なのではなく、
import → require
export → module.exports
になっていない ES6 (ES2015) 形式の javascript を投入したことが問題なのです…

仮に import と export を許可するように修正した場合、つぎのような export が混じったコードを生成します。

(function () {
    function r(e, n, t) {
        function o(i, f) {
            if (!n[i]) {
                if (!e[i]) {
                    var c = "function" == typeof require && require;
                    if (!f && c)
                        return c(i, !0);
                    if (u)
                        return u(i, !0);
                    var a = new Error("Cannot find module '" + i + "'");
                    throw a.code = "MODULE_NOT_FOUND", a
                }
                var p = n[i] = {
                    exports: {}
                }; e[i][0].call(
                    p.exports,
                    function (r) {
                        var n = e[i][1][r];
                        return o(n || r)
                    }, p, p.exports, r, e, n, t)
            }
            return n[i].exports
        }
        for (var u = "function" == typeof require && require, i = 0; i < t.length; i++)
            o(t[i]);
        return o
    }
    return r
})()({
    1: [function (require, module, exports) {
        var b = require('./b');
    }, { "./b": 2 }], 2: [function (require, module, exports) {
        export var b = {};
    }, {}]
}, {}, [1]);


export があるので、これでは Web ブラウザーでは実行ができませんね…

という訳で、require や module.exports を採用している CommonJS 形式のものを使用しましょう…

ここは無理矢理 babelify で片づけるという手もありますが…
Object.defineProperty() という ES3 (Internet Explorer 8 (Windows XP)) 殺しの言語仕様が出現することになります…

2018年11月15日木曜日

AWS Lambda プロキシ統合 + Node.js 8.10 index.handler

Lambda プロキシ統合での 関数コード例:

exports.handler = async(event) => {
    const addr = require('./addr.json');
    const keywords = event.queryStringParameters.q.replace(/-/, "").trim().split(/\s+/);
 ...
 const response = {
  statusCode: 200,
  body: JSON.stringify(patterns),
 };
 return response;
};

メモ
- response.body は文字列で返します。

Lambda プロキシ統合での event 内容例:

{
  "resource": "/Yubin2",
  "path": "/Yubin2",
  "httpMethod": "GET",
  "headers": null,
  "multiValueHeaders": null,
  "queryStringParameters": {
    "q": "123"
  },
  "multiValueQueryStringParameters": {
    "q": [
      "123"
    ]
  },
  "pathParameters": null,
  "stageVariables": null,
  "requestContext": {
    "path": "/Yubin2",
    "accountId": "ACCOUNT1",
    "resourceId": "ID1",
    "stage": "test-invoke-stage",
    "domainPrefix": "testPrefix",
    "requestId": "ID2",
    "identity": {
      "cognitoIdentityPoolId": null,
      "cognitoIdentityId": null,
      "apiKey": "test-invoke-api-key",
      "cognitoAuthenticationType": null,
      "userArn": "arn:aws:iam::ACCOUNT1:root",
      "apiKeyId": "test-invoke-api-key-id",
      "userAgent": "aws-internal/3 aws-sdk-java/1.11.432 Linux/4.9.124-0.1.ac.198.71.329.metal1.x86_64 OpenJDK_64-Bit_Server_VM/25.181-b13 java/1.8.0_181",
      "accountId": "ACCOUNT1",
      "caller": "ACCOUNT1",
      "sourceIp": "test-invoke-source-ip",
      "accessKey": "ID5",
      "cognitoAuthenticationProvider": null,
      "user": "ACCOUNT1"
    },
    "domainName": "testPrefix.testDomainName",
    "resourcePath": "/Yubin2",
    "httpMethod": "GET",
    "extendedRequestId": "ID3",
    "apiId": "ID4"
  },
  "body": null,
  "isBase64Encoded": false
}

2018年10月23日火曜日

EPPlus xlsx スタイリング まとめ

幅 Width 高さ Height は Excel のそれと同じ。
Width = 半角フォントの文字数
Height = ポイント単位

最初にこれ
totalSheet.Cells.Style.Font.Name = "游ゴシック";
totalSheet.Cells.Style.Font.Size = 11;
スタイルの適用順序: 全体 → 列 or 行ごと → セルごと

通貨、単位なし、小数点四捨五入
totalSheet.Column(5).Style.Numberformat.Format = "#,##0;[Red]-#,##0";


2018年9月29日土曜日

MSBuild の各要素・アイテム・プロパティーの俯瞰と逆引き大辞典

Target は ターゲット
 
Message とか Execタスク
 
AfterTargets="Build" にしておくと、ビルド後に実行してくれます。

<Target Name="BuildEncoder" 
        AfterTargets="Build">
  <Message Importance="Normal" 
           Text="Encoder: %(Encoder.Identity) → $(OutputPath)%(Encoder.OutputTo)" />
  <Exec Command="Encoder.exe %(Encoder.Identity) $(OutputPath)%(Encoder.OutputTo)" />
</Target>

%(Encoder.Identity) の Encoder は ItemGroup の中に定義した Encoder という名の Item
%(Encoder.Identity) の Identity は 既知のアイテム メタデータ
%(Encoder.OutputTo) の OutputTo は自分で定義したメタデータ
 
$(OutputPath) の OutputPath は プロパティー
↑ 環境変数を参照することがあります。
↑ $(…) の … は プロパティ関数 の場合があります: $(VER.Replace('.','_'))

      <ItemGroup>
        <Encoder Include="File.txt">
          <OutputTo>File.bin</OutputTo>
        </Encoder>
      </ItemGroup>




Encoder は Item に変換
方法: ビルドするファイルを選択する

OutputTo はメタデータ


アイテムリスト

@(ABC)
@(ABC, ';')
@(ABC, ', ')
方法: 項目リストをコンマ区切りで表示する


アイテムの種類を変換

@(ItemForMyTool->'&quot;%(FullPath)&quot;', ' ')
メタデータを使用してアイテムの種類を変換する



アイテム用の関数

@(theItem->IndexOf('r'))
項目用の関数



jQuery をつかうと Web ページからのリンク抽出と、変換が楽にできますね…
(この prettier.io は一行 JavaScript をキレイにフォーマットしてくれます!)
 
  • $.map($("main").find("a"), function(a) {
      return $("<a>")
        .attr("target", "_blank")
        .attr("href", a.href)
        .append(
          $("<code>")
            .addClass("word")
            .text(a.innerText)
        )
        .prop("outerHTML");
    }).join("\n");
  • $.map($("table#user-content-tasksTable").find("a"), function(a) {
      return $("<a>")
        .attr("target", "_blank")
        .attr("href", a.href)
        .append(
          $("<code>")
            .addClass("word")
            .text(a.innerText)
        )
        .prop("outerHTML");
    }).join("\n");
  • $.map($("div#divTree").find("a"), function(a) {
      return a.innerText.endsWith(" Class")
        ? $("<a>")
            .attr("target", "_blank")
            .attr("href", a.href)
            .append(
              $("<code>")
                .addClass("word")
                .text(a.innerText)
            )
            .prop("outerHTML")
        : null;
    }).join("\n");


お約束のタグクラウドです。

MSBUILD のタスク
Task 基本クラス TaskExtension 基本クラス ToolTaskExtension 基本クラス AL (アセンブリ リンカー) タスク AspNetCompiler タスク AssignCulture タスク AssignProjectConfiguration タスク AssignTargetPath タスク CallTarget タスク CombinePath タスク ConvertToAbsolutePath タスク Copy タスク CreateCSharpManifestResourceName タスク CreateItem タスク CreateProperty タスク CreateVisualBasicManifestResourceName タスク Csc タスク Delete タスク DownloadFile タスク Error タスク Exec タスク FindAppConfigFile タスク FindInList タスク FindUnderPath タスク FormatUrl タスク FormatVersion タスク GenerateApplicationManifest タスク GenerateBootstrapper タスク GenerateDeploymentManifest タスク GenerateResource タスク GenerateTrustInfo タスク GetAssemblyIdentity タスク GetFrameworkPath タスク GetFrameworkSdkPath タスク GetReferenceAssemblyPaths タスク LC タスク MakeDir タスク Message タスク Move タスク MSBuild タスク ReadLinesFromFile タスク RegisterAssembly タスク RemoveDir タスク RemoveDuplicates タスク RequiresFramework35SP1Assembly タスク GenerateResource タスク GenerateResource task ResolveAssemblyReference タスク ResolveComReference タスク ResolveKeySource タスク ResolveManifestFiles タスク ResolveNativeReference タスク ResolveNonMSBuildProjectOutput タスク SGen タスク SignFile タスク Touch タスク UnregisterAssembly タスク Unzip タスク UpdateManifest タスク Vbc タスク Warning タスク WriteCodeFragment タスク WriteLinesToFile タスク XmlPeek タスク XmlPoke タスク XslTransformation タスク ZipDirectory タスク
MSBuildTasks
Add AppPoolController AppPoolCreate AppPoolDelete AssemblyInfo Attrib Divide EmbedNativeResource FileUpdate FtpUpload FxCop GetSolutionProjects ILMerge Mail Multiple MV NDoc NUnit NUnit3 RegexMatch RegexReplace RegistryRead RegistryWrite Script ServiceController ServiceQuery Sleep SqlExecute Subtract SvnCheckout SvnClient SvnCommit SvnExport SvnInfo SvnUpdate SvnVersion TaskSchema TemplateFile Time Unzip Version VssAdd VssCheckin VssCheckout VssClean VssDiff VssGet VssHistory VssLabel VssUndoCheckout WebDirectoryCreate WebDirectoryDelete WebDownload XmlRead XmlUpdate Xslt Zip
MSBuild.Extension.Pack
BaseAppDomainIsolatedTask Class BaseTask Class Utilities Class BizTalkAdaptor Class BizTalkApplication Class BizTalkAssembly Class BizTalkHost Class BizTalkHostInstance Class BizTalkReceiveHandler Class BizTalkSendHandler Class FxCop Class NUnit Class NUnit3 Class StyleCop Class Email Class Ftp Class MSMQ Class Cab Class DNZip Class Zip Class ActiveDirectory Class ComponentServices Class EnvironmentVariable Class EventLog Class EventSource Class HostsFile Class Network Class PerformanceCounters Class Process Class Registry Class SystemDrive Class WindowsService Class WshShell Class Data Class DataMap Class Organization Class Solution Class Detokenise Class File Class FileVersion Class FindUnder Class Folder Class RoboCopy Class Share Class Assembly Class AssemblyInfo Class AsyncExec Class CommandLine Class ConfigManager Class DateAndTime Class DynamicExecute Class Gac Class GenericTool Class Guid Class ILMerge Class Metadata Class MSBuildHelper Class Parallel Class Path Class Signing Class SmartExec Class TextString Class Thread Class XProduct Class Clone Class SecureFileLogger Class SqlLogger Class XmlFileLogger Class Wmi Class Sound Class Packager Class Maths Class Certificate Class AnalysisServices Class Database Class Server Class AnalysisServices Class Database Class Server Class AnalysisServices Class Database Class Server Class BuildDeploymentManifest Class BuildNumber Class SqlCmd Class SqlExecute Class SqlVersion Class SqlVersionDataClass Class Svn Class DlrTaskFactory Class PowerShellTaskFactory Class TeamBuild Class TeamBuild Class Console Class Dialog Class SourceSafe Class TfsSource Class TfsSourceAdmin Class TfsVersion Class VB6 Class VC6 Class VSDevEnv Class HttpWebRequest Class Iis6AppPool Class Iis6ServiceExtensionFile Class Iis6VirtualDirectory Class Iis6Website Class Iis7Application Class Iis7AppPool Class Iis7Binding Class Iis7Website Class WebClient Class XmlFile Class XmlTask Class

2018年8月22日水曜日

NSPLookupServiceBegin への lpqsRestrictions

SVCID_HOSTNAME
= {0002A800-0000-0000-C000-000000000046}

SVCID_INET_HOSTADDRBYINETSTRING
= {0002A801-0000-0000-C000-000000000046}

SVCID_INET_SERVICEBYNAME
=  {0002A802-0000-0000-C000-000000000046}

SVCID_INET_HOSTADDRBYNAME
= {0002A803-0000-0000-C000-000000000046}

#include <SvcGuid.h>
SET_TCP_SVCID_RR(&guid, 53, 12);
SVCID_DNS_TYPE_PTR
= {00090035-0000-000C-C000-000000000046}

GetAddrInfoW(L"ABC", nullptr, nullptr, &info);

 

gethostbyname("ABC"); 

lpqsRestrictions->lpafpProtocols[1] の iAddressFamily = 2, iProtocol = 6

gethostbyaddr("\x01\x02\x03\x04", 4, AF_INET);

lpqsRestrictions->lpafpProtocols[1] の iAddressFamily = 2, iProtocol = 6

gethostbyaddr("\x1\x2\x3\x4\x5\x6\x7\x8\x9\xa\xb\xc\xd\xe\xf\x10", 16, AF_INET6);

GetNameInfoW IPv4


GetNameInfoW IPv6


gethostname






2018年8月21日火曜日

Windows 名前解決 NET VIEW, Network Providers, Namespace Service Providers

NET VIEW

NetServerEnum を使っているようです。

しかし深部の実装がカーネルモード依存 (非公開の DeviceIoControl コード使用) なので、手の出しようがありません。

Network Providers

ユーザーモードの Network Provider API で実装するプロバイダーです。
この API の守備範囲はとても広いですが… 今回気にしているのは Enumeration Functions だけです。

NPOpenEnum 等を実装することで、WNetOpenEnum での列挙に対応できます。

詰まるところ、ネットワーク一覧に希望のホストを追加できます。


しかしこの先の処理 (UNC パスを作出したり、DOS デバイスを定義したりする処理) にはカーネルモードの関与が必要だと思われます…

Namespace Service Providers

ユーザーモードの Namespace Service Providers を実装する DLL です。Winsock から直接利用されます。

NSPStartup 関数と NSPLookupServiceBegin 等を実装することで、名前解決プロセスに参加できます。

こちらは
「ホストリストの作成」というよりは、
「名前解決(ホスト名 ⇔ IP アドレス)」の意味合いが強いです。

対象の名前空間は NS_DNS ですが…
Bluetooth 関連 (NS_BTH) の情報の方が多い印象を受けました。

アプリからのサービス問い合わせ (WSALookupServiceBegin 呼び出し) に対し、サービス (WSAQUERYSET で定義する情報) の列挙を可能にします。サービス ID の例:
  • SVCID_HOSTNAME
  • SVCID_INET_HOSTADDRBYINETSTRING
  • SVCID_INET_HOSTADDRBYNAME
See also: リクエスト例

勿論 Winsock の GetAddrInfoW 関数でも NSP を使用しますので、NSP を実装することは有用です。

ping.exe でも通用しました。

2018年7月18日水曜日

net view システム エラー 1231 ネットワークに到達できません。

C:\Users\USER>net view
システム エラー 1231 が発生しました。

ネットワークに到達できません。ネットワークのトラブルシューティングについては、Windows ヘルプを参照してください。
解決方法は
「Windows の機能の有効化または無効化」より
『SMB 1.0/CIFS クライアント』をインストールすることです…

※ (2020/12/8 追記) Windows 10 Pro 環境下で、既にチェック済みの場合は、別の原因… レジストリ値の変更が必要な場合があります。
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters]
"AllowInsecureGuestAuth"=dword:00000001
情報引用源: Windows10からパスワード無しの共有フォルダやNASに接続できない | よもやま話



そして Windows 10 を再起動…

このように、net view がリストできるようになりました…


代わりに、つぎのようなエラーが発生する場合もあります:
net view
システム エラー 53 が発生しました。

ネットワーク パスが見つかりません。

2018年6月22日金曜日

バックアップエラーをシミュレーションしたい

大変便利なミラーバックアップ。

しかし、もしコピー元のディスクが部分的に読み取り不能になっていたら…?

コピー先のファイルがすべてなくなってしまう…!? という事件が実際にありました。

という訳で、シミュレーションをしたくなりました。

Windows API はどのようなエラーを返すのか。

実際に遭遇した。ReadFile で
  • ERROR_CRC (23, 0x00000017, Check)
    Data error (cyclic redundancy check).
こちらも:

1117, 0x0000045D, Check
  • ERROR_IO_DEVICE
    The request could not be performed because of an I/O device error.



https://github.com/Microsoft/Windows-driver-samples/tree/master/filesys/fastfat を査読して。

STATUS_FILE_CORRUPT_ERROR
STATUS_DATA_ERROR
STATUS_IN_PAGE_ERROR
STATUS_DISK_CORRUPT_ERROR
STATUS_EA_CORRUPT_ERROR
STATUS_EA_LIST_INCONSISTENT

STATUS_UNMAPPABLE_CHARACTER
STATUS_MEDIA_WRITE_PROTECTED

https://blog.csdn.net/whf727/article/details/2121582

ERROR_CRC
ERROR_FILE_CORRUPT
ERROR_DISK_CORRUPT
ERROR_EA_LIST_INCONSISTENT
ERROR_NO_UNICODE_TRANSLATION
ERROR_WRITE_PROTECT

Linux でそういったデバイスを作成

dd if=/dev/zero of=~/disk bs=60KiB count=1
mkfs.ext2 ~/disk
...
sudo losetup -f ~/disk
losetup -l
sudo dmsetup create bad_disk < form
sudo mount -t ext2 /dev/mapper/bad_disk /mnt/

form:
0 118 linear /dev/loop1 0
118 1 error
119 1 linear /dev/loop1 119

なんか Samba は FindFirstFile FindNext でエラー返してくれないです。

2018年4月13日金曜日

何故 NancyFx をえらんだのか… につきまして

自動登録をサービスプロセスで実装しています。
- GUI がございません。
- ではどのようにして状況を確認できるようにするか… Web サーバーを実装するしかない。

何故サービスプロセスなのか…
- 各クライアント PC での Verup が大変だからです。
- サーバーで動作させるようにした。
- さらーに『本来クライアントで動作する NisImp を、サーバーで動かしてほしい!』というご要望があり、「お客さんは GUI を欲していないのかもしれない」という結論に行き着いたため。

何故ナンシーか…
- では他になにが…?

質問してきた彼によると →
- Frameworks
- Jasper
- Nancy
- SignalR
- WebApi
- WebSharper
- DuoVia.Http
- Simplify.Web
- Wisej

Nancy のメリットとして
- stackoverflow など情報量が多い。



ここから by KU

当初からつぎの 2 つに的を絞っていた…
Kayak
Nancy

「『軽量な C# Web サーバー』で考えていたため」
軽量な:
- ワンプロセスで完結する
- 別途のインストールが不要(そう。Apache とか php とか PostgreSQL とかいったもの)

評価の結果、Kayak がいい感じと思っていた。しかし、開発が止まっていた。
評価
- (URL の予約に)管理者権限が必要になる HttpListener を使っているか。
 → 使っていない。自分で TCP ポートを使用
 → 👍

結局 Nancy にした。

2018年4月12日木曜日

xxx.dll.a ではなく xxx.notdll.a へ

xxx.dll.a はインポートライブラリーです。
これをリンクすると xxx.dll を配布することになります。

しかし、意図的に xxx.a をスタティックリンクしたい場合があります。
xxx.dll を配布したくない場合など。

そこで xxx.notdll.a をリンクすることで、
xxx.dll → xxx.a へリダイレクションしたい。

具体的には:
; _deflate
extern _deflate
global __imp__deflate
__imp__deflate:
 dd _deflate
__imp__deflate はポインターです。
_deflate のアドレスを設定するような .asm を書き、
.obj にコンパイルして、
.notdll.a ライブラリを作成する方法をとりました。

こちらの内容を自動化する、
xxx.dll.a から xxx.notdll.a を作出するスクリプト notdll.sh を開発しました。https://gist.github.com/kenjiuno/bdbd6c3311f4abc94e6ad1b3ac74bdbf

---
ちなみに依存している xxx.dll たちを収集したい場合のコマンドはこちら。

$ cygcheck.exe ./pdftoppm.exe | tr -d '\r' | tr '\\' '/' | grep -vi "system32" | xargs -L1 -I{} cp {} .
今日のバージョン

$ cygcheck.exe ./smbclient | grep -Eoe "cyg[^\.]+\.dll" | uniq | xargs which | xargs.exe -I "SRC" cp SRC .

---
MinGW32 (32 ビット版)

cdecl
  • C ソースコードでは malloc 
  • .lib (.dll.a) ファイルでは _malloc 
  • DLL では malloc


stdcall
  • C ソースコードでは GetProcAddress
  • .lib (.dll.a) ファイルでは _GetProcAddress@8
  • DLL では GetProcAddress

$ objdump -t /mingw32/i686-w64-mingw32/lib/libmsvcrt.a | grep "malloc"
[  7](sec  1)(fl 0x00)(ty   0)(scl   2) (nx 0) 0x00000000 _malloc

$ objdump -p /c/Windows/SysWOW64/msvcrt.dll | grep "malloc"
        [1279] malloc

$ objdump.exe -t /mingw32/lib/libz.dll.a | grep "deflate"
[  6](sec  1)(fl 0x00)(ty   0)(scl   2) (nx 0) 0x00000000 _deflate
[  7](sec  3)(fl 0x00)(ty   0)(scl   2) (nx 0) 0x00000000 __imp__deflate

$ objdump.exe -t /mingw32/lib/libz.a | grep "deflate"
[ 16](sec  1)(fl 0x00)(ty  20)(scl   2) (nx 0) 0x00001670 _deflate

$ objdump.exe -p /mingw32/bin/zlib1.dll | grep "deflate"
        [  17] deflate

stdcall 規約関数にも付くようようです。

$ objdump -t /mingw32/i686-w64-mingw32/lib/libkernel32.a | grep "GetProcAddress"
[  7](sec  1)(fl 0x00)(ty   0)(scl   2) (nx 0) 0x00000000 _GetProcAddress@8
[  8](sec  5)(fl 0x00)(ty   0)(scl   2) (nx 0) 0x00000000 __imp__GetProcAddress@8

$ objdump -p /c/Windows/SysWOW64/kernel32.dll | grep "GetProcAddress"
        a3a58      21  GetProcAddress
        [ 684] GetProcAddress

インポートライブラリを作成したい Make import library

Microsoft Visual C++ 方式で

foo.def を作成↓
LIBRARY postgres.exe
EXPORTS CurrentMemoryContext

lib を使って、インポートライブラリを作成↓
lib /out:x64\foo.lib /def:foo.def /machine:x64
lib /out:x86\foo.lib /def:foo.def /machine:ix86

作ったインポートライブリを使って、リンクします。

参考: http://openlab.ring.gr.jp/tsuneo/soft/tar32_1/tar32_1/SDK/DLL2LIB.TXT

参考: x64用のdllファイルからインポートライブラリ(.lib)を生成

MinGW 方式で

ZwFsControlFile を

ZwFsControlFile.def

LIBRARY NTDLL.DLL
EXPORTS ZwFsControlFile@40

$ dlltool.exe -mi386 -d ZwFsControlFile.def -Ak -l ZwFsControlFile.lib

ZwFsControlFile64.def

LIBRARY NTDLL.DLL
EXPORTS ZwFsControlFile

$ dlltool.exe -mi386:x86-64 -d ZwFsControlFile64.def -l ZwFsControlFile64.lib


2018年3月26日月曜日

Windows 名前解決の謎 NET VIEW 編

NET VIEW で出力されるリストは恐らく次の様にして作出されます:
  • \MAILSLOT\BROWSE により、Get Backup List Request を送信。
  • \MAILSLOT\BROWSE により、Get Backup List Response を受信。
  • そこに対して Session Setup と Tree Connect (\\SERVER\IPC$) を送信。
  • NetServerEnum2 Request を送信。
  • NetServerEnum2 Response を受信。ここに Server の一覧が格納されています。
問題点 1:
 ところが最近の壊れた Windows 10 Creators Update では、NetServerEnum2 Response の内容が Status: Unknown (2184) になって戻って来ます。
これが『サービスが開始していません。』に変換されて、あたかも NET VIEW が失敗しているような印象を与えています…

問題点 2:
 両方 SMB 2.0 対応だと何故か NetServerEnum2 Request を送信しない…
 修正方法がわかりました。SMB 1.0 を有効にします。

Note: マスターブラウザーに server list を尋ねているのではなくて、バックアップブラウザーの 1 つに server list を尋ねている点が興味深い…

ーーー

対策案 1: 「ネットワーク探索」を有効にします。姿が見えない方の Windows で操作。今後主流になるであろう WSD で発見できるようにします。



 
対策案 2: 壊れた Windows 10 にバックアップブラウザーをさせまい。
  1. MaintainServerList → No
  2. Computer Browser サービスを再起動 or サービスを停止→無効化
参考サイト https://eglsoft.com/browse.html

Note: MasterBrowserResetRequest を送信して、問題の Windows にマスターブラウザーを強制的に放棄させることはできます。しかし、同じ Windows がマスターブラウザーになってしまうので、意味がありませんでした。

Note: マスターブラウザーを調べる方法
nbtscan を使うと割と確実に調査できます。

例:
nbtscan-1.0.35.exe -f 192.168.2.0/24

192.168.2.999   WORKGROUP\DD7                   SHARING
  DD7            <20> UNIQUE File Server Service
  DD7            <00> UNIQUE Workstation Service
  WORKGROUP      <00> GROUP  Domain Name
  WORKGROUP      <1e> GROUP  Browser Service Elections
  WORKGROUP      <1d> UNIQUE Master Browser
  ..__MSBROWSE__.<01> GROUP  Master Browser

このようなものをリスト出力してきます。ワークグループ名と Master Browser のペアが把握できるので便利です。
かの browstat.exe は XP/2003 Server でしか動作しないという曰く付きですが、nbtscan は OS に関係なく動作します。

2018年2月20日火曜日

.NET Framework 4 Client Profile に含まれないアセンブリ

<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client"/>
で欠けていると考えられるアセンブリ:

ISymWrapper.dll
Microsoft.Build.Conversion.v4.0.dll
Microsoft.Build.Engine.dll
Microsoft.Build.Framework.dll
Microsoft.Build.Tasks.v4.0.dll
Microsoft.Build.Utilities.v4.0.dll
Microsoft.Build.dll
Microsoft.VisualC.STLCLR.dll
PresentationBuildTasks.dll
System.Data.Entity.Design.dll
System.Data.OracleClient.dll
System.Data.Services.Design.dll
System.Data.Services.dll
System.Design.dll
System.Drawing.Design.dll
System.Runtime.Caching.dll
System.ServiceModel.Activation.dll
System.ServiceModel.Web.dll
System.Web.Abstractions.dll
System.Web.DataVisualization.Design.dll
System.Web.DataVisualization.dll
System.Web.DynamicData.Design.dll
System.Web.DynamicData.dll
System.Web.Entity.Design.dll
System.Web.Entity.dll
System.Web.Extensions.Design.dll
System.Web.Extensions.dll
System.Web.Mobile.dll
System.Web.RegularExpressions.dll
System.Web.Routing.dll
System.Web.dll
System.Windows.Forms.DataVisualization.Design.dll
System.Workflow.Activities.dll
System.Workflow.ComponentModel.dll
System.Workflow.Runtime.dll
System.WorkflowServices.dll
XamlBuildTask.dll

2018年1月9日火曜日

WSD LLMNR SSDP の送信元プロセスにつきまして

名前解決に関する通信の調査。
Process Monitor で追跡。
(参考: Windows 名前解決の謎 NET VIEW 編)

WSD

svchost.exe
fdPHost
Function Discovery Provider Host
DD36:52632 -> ff02::c:ws-discovery
DD36:52631 -> 239.255.255.250:ws-discovery
wsdapi.dll か
UDP port 3702

LLMNR

svchost.exe
いずれか: CryptSvc, Dnscache, LanmanWorkstation, NlaSvc, TapiSrv, TermService

DD36:53097 -> ff02::1:3:llmnr
DNSAPI.dll か
UDP port 5355

SSDP

svchost.exe
SSDPSRV
SSDP Discovery
DD36:52669 -> ff02::c:ssdp
ssdpsrv.dll か
UDP port 1900