Windows Server 2025で作ったActive Directory環境でldapsを使えるようにする

Windows Server 2025でActive Directory環境を作ってみた。

フォレスト/機能レベルはWindows Server 2016とした

この環境に対してAlmaLinux 9で作ったサーバから ldapsearchコマンドを実行したところ「ldap_bind: Strong(er) authentication required (8)」というエラーになった

# ldapsearch -x -D "cn=administrator,cn=users,dc=adsample,dc=local" -w "パスワード" -H ldap://192.168.122.10 -b "CN=testuser1,CN=Users,DC=adsample,dc=local" -s base
ldap_bind: Strong(er) authentication required (8)
        additional info: 00002028: LdapErr: DSID-0C0903CB, comment: The server requires binds to turn on integrity checking if SSL\TLS are not already active on the connection, data 0, v65f4
#

セキュリティ強化のためLDAP署名もしくはLDAPSに対応していないとダメになったようだ

[AD管理者向け] 2020 年 LDAP 署名と LDAP チャネルバインディングが有効化。確認を!
(上記ページ内でリンクされてるアドバイザリの正しいURL→「LDAP チャネル バインディングと LDAP 署名を有効にするためのマイクロソフト ガイダンス」)

じゃあ、とldapsでアクセスしてみるがエラー

# ldapsearch -x -D "cn=administrator,cn=users,dc=adsample,dc=local" -w "パスワード -H ldaps://192.168.122.10 -b "CN=testuser1,CN=Users,DC=adsample,dc=local" -s base
ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)
#

デバッグモードで接続のテストだけ行ってみる

# ldapsearch -x -d -1 -H ldaps://192.168.122.10
ldap_url_parse_ext(ldaps://192.168.122.10)
ldap_create
ldap_url_parse_ext(ldaps://192.168.122.10:636/??base)
ldap_sasl_bind
ldap_send_initial_request
ldap_new_connection 1 1 0
ldap_int_open_connection
ldap_connect_to_host: TCP 192.168.122.10:636
ldap_new_socket: 3
ldap_prepare_socket: 3
ldap_connect_to_host: Trying 192.168.122.10:636
ldap_pvt_connect: fd: 3 tm: -1 async: 0
attempting to connect:
connect success
TLS trace: SSL_connect:before SSL initialization
tls_write: want=302 error=Connection reset by peer
TLS trace: SSL_connect:error in SSLv3/TLS write client hello
TLS: can't connect: .
ldap_err2string
ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)
#

証明書が設定されてないようだ

確認のためopenssl s_clientでも接続を試みる

# openssl s_client -connect  192.168.122.10:636
Connecting to 192.168.122.10
CONNECTED(00000003)
write:errno=104
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 302 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
This TLS version forbids renegotiation.
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---
#

接続できない

公式のドキュメントとしては「Active Directory Domain Services で SSL 経由で LDAP の証明書を構成する」となる。

この手順はすでにSSL証明書が発行され、Windows Serverに登録されている状態で行う手順となっている。このため、SSL証明書が用意されていない状態からの手順ではない。

自己証明書を作成してLDAP証明書とする、という手順は、DELLのサイトにある「Active Directory統合用にLDAPSを構成する方法」が大変わかりやすく作成されていたので、これを利用する。

まず、Active Directoryサーバにログインして、「ldp.exe」を実行し、接続先としてドメイン名、ポート389、SSLチェックは無しを指定して接続を試みる

これはldapでの接続テストとなる。

下記のように情報が取れれば問題ない

次にldapsでの接続をテストするため、SSLにチェックを入れ、ポート636で接続する

接続ができない、というエラーとなった。

このため、証明書の作成が必要、ということになる。

作成にはPowerShellから「New-SelfSignedCertificate -DnsName adtest.adsample.local,adtest -CertStoreLocation cert:\LocalMachine\My」を実行する

追記:「New-SelfSignedCertificate -DnsName adtest.adsample.local,adtest -CertStoreLocation cert:\LocalMachine\My -NotAfter (Get-Date).AddMonths(36)」で証明書の期限切れまで36ヶ月と設定した方がよい

-DnsNameの後ろは、Active DIrectoryサーバのFQDNとショートホスト名の2種類をカンマ区切りで指定する

これを実行すると「certlm.msc」の[個人]-[証明書]に証明書が発行される

注意点としては、証明書の有効期限が1年間となっているので、1年以内に更新する必要がある、という点。

期間を変更する場合、New-SelfSignedCertificateの-NotAfterオプションに終了日を指定する。

試してないがおそらく 「-NotAfter (Get-Date).AddMonths(36)」で3年間が作れた

この証明書を右クリックメニューのコピーをして

[信頼されたルート証明機関]-[証明書]にペースト

再度 ldp.exeから、ポート636, SSLチェックありで接続を試みて接続に成功することを確認

再びLinux側に戻って、まずはopenssl s_clientでの確認

# openssl s_client -connect  192.168.122.10:636
Connecting to 192.168.122.10
CONNECTED(00000003)
Can't use SSL_get_servername
depth=0 CN=adtest.adsample.local
verify error:num=18:self-signed certificate
verify return:1
depth=0 CN=adtest.adsample.local
verify return:1
---
<略>
    Start Time: 1744940383
    Timeout   : 7200 (sec)
    Verify return code: 18 (self-signed certificate)
    Extended master secret: no
    Max Early Data: 0
---
read R BLOCK
^C
#

証明書が設定されたことを確認できた。

改めてldapsearchを実行して、情報が取得できることを確認した

# ldapsearch -x -D "cn=administrator,cn=users,dc=adsample,dc=local" -w "パスワード" -H ldaps://192.168.122.10 -b "CN=testuser1,CN=Users,DC=adsample,dc=local" -s base
# extended LDIF
#
# LDAPv3
# base <CN=testuser1,CN=Users,DC=adsample,dc=local> with scope baseObject
# filter: (objectclass=*)
# requesting: ALL
#

# search result
search: 2
result: 32 No such object
matchedDN: CN=Users,DC=adsample,DC=local
text: 0000208D: NameErr: DSID-0310028F, problem 2001 (NO_OBJECT), data 0, best
 match of:
        'CN=Users,DC=adsample,DC=local'


# numResponses: 1
#

参考:Microsoft手順について

Active Directory Domain Services で SSL 経由で LDAP の証明書を構成する」の手順ですが、これは証明書が発行され、Windows Serverに登録されている状態で、それをLDAPの証明書として利用するための手順となっている。

このため、自己証明書を作成するところについては書かれていない。

なので、証明書がなにもない状態で手順を行うと下記の様になる。

certlm.msc を実行

[個人]の下で右クリックメニューから[すべてのタスク]-[新しい証明書の要求]を選択

ウィザードを進める

[システム管理者が構成します]-[Active Directory登録ポリシー]を選択し、[次へ]をクリック

登録出来る証明書がない、として終了する

次に、PowerShell 管理者モードで New-SelfSignedCertificateを実行して証明書作成した場合にどうなるか確認

PS C:\Users\Administrator> New-SelfSignedCertificate -DnsName adtest.samplead.local,adtest -CertStoreLocation cert:\LocalMachine\My -NotAfter (Get-Date).AddMonths(36)


   PSParentPath: Microsoft.PowerShell.Security\Certificate::LocalMachine\My

Thumbprint                                Subject
----------                                -------
809CEEBEF846D500F60FF6298C6046AD3183CB9E  CN=adtest.samplead.local



PS C:\Users\Administrator>

[個人]-[証明書]が作成される

左側の[個人]-[証明書]のアイコンの右クリックメニューから[すべてのタスク]-[新しい証明書の要求]を選択

やっぱりダメ

次に右側の登録されている証明書の右クリックメニューから[すべてのタスク]-[新しいキーで証明書を要求]を選択

ダメ

Active Directory Domain Services で SSL 経由で LDAP の証明書を構成する」の「サードパーティーCA」の「証明書をインストールする」を見てみると、[個人]-[証明書]にある証明書があればいいように見える

しかし、いま登録されている証明書は下記の状態となっている

目的に「サーバー認証」は含まれている

しかし、証明書の状態は「信頼されたルート証明書機関のストア」にないのでダメ、ということになっている

いまの状態でldapsearchでどうなるかを確認すると、証明書がないのでエラーになっている

[root@xxxxx ~]#  ldapsearch -x -H ldaps://192.168.1.77 -D "CN=administrator,CN=Users,DC=samplead,DC=local" -w "xxxxx" -b "CN=Users,DC=samplead,DC=local" "" samaaccountname
ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)
[root@xxxxx ~]#

ということで、これを信頼済みにするにはDELL手順にあるように[個人]-[証明書]の下にある証明書の右クリックメニューから[コピー]を選び

[信頼されたルート証明機関]-[証明書]の右クリックメニューから[貼り付け]を選んで、証明書をコピー

コピーされたことを確認

証明書はコピーした後の目的表示については変化なし

ルート証明機関に関するエラーがないことを確認

この後にldapsearchを実行すると実行ができる

[root@xxxxx ~]#  ldapsearch -x -H ldaps://192.168.1.77 -D "CN=administrator,CN=Users,DC=samplead,DC=local" -w "xxxxx" -b "CN=Users,DC=samplead,DC=local" "" samaaccountname
# extended LDIF
#
# LDAPv3
# base <CN=Users,DC=samplead,DC=local> with scope subtree
# filter: (objectclass=*)
# requesting:  samaaccountname
#

# Users, samplead.local
dn: CN=Users,DC=samplead,DC=local

# DnsUpdateProxy, Users, samplead.local
dn: CN=DnsUpdateProxy,CN=Users,DC=samplead,DC=local

# DnsAdmins, Users, samplead.local
dn: CN=DnsAdmins,CN=Users,DC=samplead,DC=local

# Administrator, Users, samplead.local
dn: CN=Administrator,CN=Users,DC=samplead,DC=local

# Guest, Users, samplead.local
dn: CN=Guest,CN=Users,DC=samplead,DC=local

# krbtgt, Users, samplead.local
dn: CN=krbtgt,CN=Users,DC=samplead,DC=local

# Domain Computers, Users, samplead.local
dn: CN=Domain Computers,CN=Users,DC=samplead,DC=local

# Domain Controllers, Users, samplead.local
dn: CN=Domain Controllers,CN=Users,DC=samplead,DC=local

# Schema Admins, Users, samplead.local
dn: CN=Schema Admins,CN=Users,DC=samplead,DC=local

# Enterprise Admins, Users, samplead.local
dn: CN=Enterprise Admins,CN=Users,DC=samplead,DC=local

# Cert Publishers, Users, samplead.local
dn: CN=Cert Publishers,CN=Users,DC=samplead,DC=local

# Domain Admins, Users, samplead.local
dn: CN=Domain Admins,CN=Users,DC=samplead,DC=local

# Domain Users, Users, samplead.local
dn: CN=Domain Users,CN=Users,DC=samplead,DC=local

# Domain Guests, Users, samplead.local
dn: CN=Domain Guests,CN=Users,DC=samplead,DC=local

# Group Policy Creator Owners, Users, samplead.local
dn: CN=Group Policy Creator Owners,CN=Users,DC=samplead,DC=local

# RAS and IAS Servers, Users, samplead.local
dn: CN=RAS and IAS Servers,CN=Users,DC=samplead,DC=local

# Allowed RODC Password Replication Group, Users, samplead.local
dn: CN=Allowed RODC Password Replication Group,CN=Users,DC=samplead,DC=local

# Denied RODC Password Replication Group, Users, samplead.local
dn: CN=Denied RODC Password Replication Group,CN=Users,DC=samplead,DC=local

# Read-only Domain Controllers, Users, samplead.local
dn: CN=Read-only Domain Controllers,CN=Users,DC=samplead,DC=local

# Enterprise Read-only Domain Controllers, Users, samplead.local
dn: CN=Enterprise Read-only Domain Controllers,CN=Users,DC=samplead,DC=local

# Cloneable Domain Controllers, Users, samplead.local
dn: CN=Cloneable Domain Controllers,CN=Users,DC=samplead,DC=local

# Protected Users, Users, samplead.local
dn: CN=Protected Users,CN=Users,DC=samplead,DC=local

# Key Admins, Users, samplead.local
dn: CN=Key Admins,CN=Users,DC=samplead,DC=local

# Enterprise Key Admins, Users, samplead.local
dn: CN=Enterprise Key Admins,CN=Users,DC=samplead,DC=local

# \E3\83\95\E3\82\A9\E3\83\AC\E3\82\B9\E3\83\88\E4\BF\A1\E9\A0\BC\E3\82\A2\E3\8
 2\AB\E3\82\A6\E3\83\B3\E3\83\88\20, Users, samplead.local
dn:: Q04944OV44Kp44Os44K544OI5L+h6aC844Ki44Kr44Km44Oz44OIXCAsQ049VXNlcnMsREM9c
 2FtcGxlYWQsREM9bG9jYWw=

# \E5\A4\96\E9\83\A8\E4\BF\A1\E9\A0\BC\E3\82\A2\E3\82\AB\E3\82\A6\E3\83\B3\E3\8
 3\88\20, Users, samplead.local
dn:: Q0495aSW6YOo5L+h6aC844Ki44Kr44Km44Oz44OIXCAsQ049VXNlcnMsREM9c2FtcGxlYWQsR
 EM9bG9jYWw=

# search result
search: 2
result: 0 Success

# numResponses: 27
# numEntries: 26
[root@xxxxx ~]#

Proxmoxで作った仮想マシンのsnapshotはどうやって見えるのか?

Proxmoxで仮想マシンを作った場合、仮想マシンのsnapshotの作られ方が仮想マシンを置く場所(データストア)によって異なっている。

zfsについては簡単に確認できたが、それ以外についてどうなるのかを確認した。

まず、proxmoxのWeb UIからスナップショットを作成した

これをコマンドで確認していく

まず、Proxmox VE側のコマンドで仮想マシンにsnapshotがあるかどうかは「qm listsnapshot <VMID>」を実行して確認できる。これは各ファイルシステムで共通となる。

root@pve3:~# qm listsnapshot 103
`-> test                        2025-04-17 15:19:16     no-description
 `-> current                                            You are here!
root@pve3:~#

次に各ファイルシステムごとにそれぞれ確認していく手法が違う。

ZFSの場合

例えばzfsの場合であれば 「zfs list -t snapshot」で確認できる。

root@pve3:~# qm listsnapshot 101
`-> zfs-test-snap               2025-04-17 15:39:18     no-description
 `-> current                                            You are here!
root@pve3:~# zfs list -t snapshot
NAME                                     USED  AVAIL  REFER  MOUNTPOINT
rpool/data/vm-101-disk-0@zfs-test-snap     0B      -   139K  -
rpool/data/vm-101-disk-1@zfs-test-snap     0B      -  22.8G  -
rpool/data/vm-101-disk-2@zfs-test-snap     0B      -  22.1M  -
rpool/data/vm-101-disk-3@zfs-test-snap     0B      -  85.2K  -
root@pve3:~#

NFSの場合

NFSの場合、仮想マシンをqcow2形式で作成した場合のみsnapshot作成が可能となる。

まず仮想マシンの設定を確認

root@pve3:~# qm config 105
agent: 1
boot: order=sata0;ide0;ide2;net0
cores: 2
cpu: x86-64-v2-AES
ide0: none,media=cdrom
ide2: none,media=cdrom
machine: pc-i440fx-9.2+pve1
memory: 2048
meta: creation-qemu=9.2.0,ctime=1744345484
name: wintest3-nfs
net0: e1000=BC:24:11:FD:D4:F3,bridge=vmbr0,firewall=1
numa: 0
ostype: win10
parent: nfs-snap
sata0: ontap:105/vm-105-disk-0.qcow2,size=40G
scsihw: virtio-scsi-single
smbios1: uuid=7a3e58d8-be9e-4e03-a040-bd1635aa3dfe
sockets: 1
vmgenid: f361fff2-f474-4260-99ac-586c42db009b
root@pve3:~# qm listsnapshot 105
`-> nfs-snap                    2025-04-17 15:39:29     no-description
 `-> current                                            You are here!
root@pve3:~#

該当する領域をlsコマンドで確認

root@pve3:~# ls -l /mnt/pve/ontap/images/105
total 13607536
-rw-r----- 1 root root 45504004165 Apr 17 15:36 vm-105-disk-0.qcow2
root@pve3:~#

見た目には1ファイルしかないように見える。

このファイルに対して「qemu-img snapshot -l ファイル名」を実行するとsnapshotが作成されているかどうかがわかる。

root@pve3:~# qemu-img snapshot -l /mnt/pve/ontap/images/105/vm-105-disk-0.qcow2
Snapshot list:
ID      TAG               VM_SIZE                DATE        VM_CLOCK     ICOUNT
1       nfs-snap              0 B 2025-04-17 15:39:29  0000:00:00.000          0
root@pve3:~#

cephの場合

cephの場合、rbdコマンドのオプションでいろいろ指定していくのだが、確認がちょっとめんどい

まずは、仮想マシンの設定を「qm config <VMID>」を実行して確認する。

root@pve3:~# qm config 103
agent: 1
boot: order=scsi0;ide2;net0
cores: 2
cpu: x86-64-v2-AES
ide2: none,media=cdrom
memory: 2048
meta: creation-qemu=9.2.0,ctime=1744338514
name: linux2-ceph
net0: virtio=BC:24:11:3A:D1:9E,bridge=vmbr0,firewall=1
numa: 0
ostype: l26
parent: test
scsi0: cephpool:vm-103-disk-0,iothread=1,size=40G
scsihw: virtio-scsi-single
smbios1: uuid=37f0d81e-3ed1-417a-9a10-3d8f556e3b37
sockets: 1
vmgenid: 0ea7ac3f-7b05-49d0-90c0-fbba87cc63ae
root@pve3:~# qm listsnapshot 103
`-> test                        2025-04-17 15:19:16     no-description
 `-> current                                            You are here!
root@pve3:~#

scsi0の行にある「cephpool」が使用しているデータストア名となる。

Ceph RDBが使用しているOSD Pool名を「ceph osd pool ls」を実行して確認する

root@pve3:~# ceph osd pool ls
.mgr
cephpool
cephfs_data
cephfs_metadata
root@pve3:~#

cephfs_dataとcephfs_metadataはCeph FSのほうで使っているデータで、仮想マシンをおくデータストアはcephpool のほうとなる。

cephpoolにある仮想マシン用のディスクを「rbd ls cephpool」で確認する

root@pve3:~# rbd ls cephpool
vm-103-disk-0
root@pve3:~#

この仮想マシンについて、snapshotが作成されているかは「rbd snap ls cephpool/<仮想ディスク名>」で確認する

root@pve3:~# rbd snap ls cephpool/vm-103-disk-0
SNAPID  NAME  SIZE    PROTECTED  TIMESTAMP
    10  test  40 GiB             Thu Apr 17 15:19:16 2025
root@pve3:~#

PowerShellでファイルの詳細情報をとる

excelやwordファイルのプロパティを見ると「詳細」タブにいろいろ情報が入っている。

これをPowerShellでファイル情報を収集する際に載せれるように調査した。

面倒なのがPowerShellの標準機能では収集できず、Shell.Application を使って収集するのだが、ストレートに各ファイルの情報をとるのではなく、そのファイルが置いてあるフォルダ情報のなかから取得する、という手法をとる必要がある。

$shell = New-Object -COMObject Shell.Application
$Getfolder = $shell.Namespace("フォルダパス")
$Getfile = $Getfolder.ParseName("調査したいファイル名")

...で、 $Getfile.ExtendedProperty('名前') でいろいろ取れる

ExtendedPropertyで取れる項目についていい感じでまとまってる資料は発見できず

詳細プロパティ取得するときに指定するもの
タイトル$Getfile.ExtendedProperty(‘System.Title’)
件名$Getfile.ExtendedProperty(‘System.Subject’)
作成者[string]$Getfile.ExtendedProperty(‘System.Author’)
前回保存者$Getfile.ExtendedProperty(‘System.Document.LastAuthor’)
コンテンツの作成日時$Getfile.ExtendedProperty(‘System.Document.DateCreated’)
前回保存日時$Getfile.ExtendedProperty(‘System.Document.DateSaved’)
前回印刷日$Getfile.ExtendedProperty(‘System.Document.DatePrinted’)
ファイル所有者$Getfile.ExtendedProperty(‘System.FileOwner’)
ファイル作成日時$Getfile.ExtendedProperty(‘System.DateCreated’)
ファイル更新日時$Getfile.ExtendedProperty(‘System.DateModified’)
ファイルアクセス日時$Getfile.ExtendedProperty(‘System.DateAccessed’)

実際に取得したものからドキュメントを調べてみるとWindows Property System に関するもの、ということが判明

System.Titleなどの最上位階層についてのSystem.Coreに関するドキュメント
System.Documentに関するドキュメント

今回使わなかった値については、上記のドキュメント群を調べればわかる


前回作った「PowerShellを使ってドロップしたフォルダ内にあるファイル一覧をテキストファイルに保存する」を修正したものがこちら

# ドラッグされたフォルダの中にあるファイル一覧をつくるやつ
#
# 使い方
#  1. このファイルを保存する
#  2. このファイルのショートカットを作成する
#  3. ショートカットのプロパティを開き"リンク先"の項目の先頭に「powershell.exe -NoProfile -ExecutionPolicy RemoteSigned -File 」をつけて保存
#  4. 作成されたショートカットの上に、フォルダをドロップすると、ウィンドウが開いて確認される
#  5. 作成するファイルリストの保存ファイル名を指定する
#  6. 出力される
#
$Args | foreach{
    echo $_.GetType()
    $searchdir = Get-Item -LiteralPath $_
}

Write-Host $searchdir.FullName "のファイル一覧を作成します"
pause

$shell = New-Object -COMObject Shell.Application

# https://pg-note.com/archives/1144 より
# 必要なアセンブリを読み込む
Add-Type -AssemblyName System.Windows.Forms 
$dialog = New-Object Windows.Forms.SaveFileDialog 

$dialog.Title = "CSVファイルの保存" 
$dialog.Filter = "テキストファイル(*.txt)|*.txt|csvファイル(*.csv)|*.csv|全てのファイル|*.*" 
$dialog.InitialDirectory = [Environment]::GetFolderPath("MyDocuments")
$dialog.FileName = $searchdir.Name

$ret = $dialog.ShowDialog() 
$outputfile=$dialog.FileName

# CSV出力向けの処理
$results=@()
$linecount=0
#


if ($ret -eq "OK"){
    Write-Host ("保存するファイル名、" + $outputfile) 

    # ディレクトリの検索 start
    Get-ChildItem -Recurse $searchdir -Attributes Hidden,System,Archive,ReadOnly,Normal,Compressed,SparseFile| ForEach-Object {
    $filename=$_.FullName
    $fileobject=$_

        if( !$_.PSIsContainer ){
            Write-Host $filename
            
            # CSV向け処理 start
            $output = New-Object -TypeName PSObject
            $output | Add-Member -MemberType NoteProperty -Name "ファイル名" -Value $filename
            $output | Add-Member -MemberType NoteProperty -Name "作成日" -Value ($fileobject.CreationTime|Get-Date -Format "yyyy-MM-dd HH:mm:ss")  # $fileobject.CreationTimeUtc
            $output | Add-Member -MemberType NoteProperty -Name "サイズ" -Value $fileobject.Length
            $output | Add-Member -MemberType NoteProperty -Name "ハッシュ(sha256)" -Value (Get-FileHash -LiteralPath $filename -Algorithm SHA256).Hash

            $Getfolder = $shell.Namespace($fileobject.DirectoryName)
            $Getfile = $Getfolder.ParseName($fileobject.Name)
            $output | Add-Member -MemberType NoteProperty -Name "タイトル" -Value $Getfile.ExtendedProperty('System.Title')
            $output | Add-Member -MemberType NoteProperty -Name "件名" -Value $Getfile.ExtendedProperty('System.Subject')
            #$output | Add-Member -MemberType NoteProperty -Name "作成者" -Value ([string]$Getfile.ExtendedProperty('System.Author'))
            #  なぜか直接出力すると System.strings になるので、 string に変換
            $tmps=[string]$Getfile.ExtendedProperty('System.Author')
            $output | Add-Member -MemberType NoteProperty -Name "作成者" -Value $tmps
            $output | Add-Member -MemberType NoteProperty -Name "前回保存者" -Value $Getfile.ExtendedProperty('System.Document.LastAuthor')
            $output | Add-Member -MemberType NoteProperty -Name "コンテンツの作成日時" -Value $Getfile.ExtendedProperty('System.Document.DateCreated')
            $output | Add-Member -MemberType NoteProperty -Name "前回保存日時" -Value $Getfile.ExtendedProperty('System.Document.DateSaved')
            $output | Add-Member -MemberType NoteProperty -Name "前回印刷日" -Value $Getfile.ExtendedProperty('System.Document.DatePrinted')
            #$output | Add-Member -MemberType NoteProperty -Name "ファイル所有者" -Value $Getfile.ExtendedProperty('System.FileOwner')
            #$output | Add-Member -MemberType NoteProperty -Name "ファイル作成日時" -Value $Getfile.ExtendedProperty('System.DateCreated')
            #$output | Add-Member -MemberType NoteProperty -Name "ファイル更新日時" -Value $Getfile.ExtendedProperty('System.DateModified')
            #$output | Add-Member -MemberType NoteProperty -Name "ファイルアクセス日時" -Value $Getfile.ExtendedProperty('System.DateAccessed')

            $results+=$output
            $linecount++
            # CSV向け処理 end

            if(($linecount % 1000) -eq 0 ){
                $results | Export-Csv $outputfile -Encoding UTF8 -NoTypeInformation -Append -NoClobber
                $results = @()
            }
        }
    }
    # ディレクトリの検索 end

    $results | Export-Csv $outputfile -Encoding UTF8 -NoTypeInformation -Append -NoClobber
} else {
    Write-Host ("キャンセル") 
}


pause

VMware Flingsにあったソフトウェアがbroadcomになって移転した先

ESXi for ARM EditionやUSB Network Native Driver for ESXi といった以前VMware Flings http://flings.vmware.com にあったソフトウェアは、2023年10月に https://developer.vmware.com/samples にリダイレクトされるようになった。

このURLは、 https://developer.broadcom.com/samples にリダイレクトされるのだが、2025年4月2日時点では、errorとなっている。

では、以前VMware Flings にあったものがどこにあるのかというと Broadcom communityの「Welcome to the new home for Flings!」にあった

2024年8月に更新されたvSphere GPU Monitoring を最後に更新はないように見えたけど、

よくみてみたら「Nested ESXi Virtual Appliance」は ESXi 8.0 Update 3c VAが出てた


2025/09/17追記

5月にまた構造変更があったようで、フォーラム とBroadcom SupportのFree Downloadsに追加された「Flings」となりました

PowerShellを使ってドロップしたフォルダ内にあるファイル一覧をテキストファイルに保存する

指定したフォルダ内にあるファイルリストを作りたい、という相談を受けた

引数で渡す処理にしてもよかったんだが、簡単に使えるようにするには、ドラック&ドロップ処理でリストが取れるようにした方がいいだろうな、ということで実装した。

また、作成したファイルリストは保存先とファイル名を容易に指定できるようにダイアログを出すようにした。参考にしたのは プログラム★ノートの「PowerShell ファイル保存ダイアログを使用する方法

保存先は基本的にマイドキュメント以下として、ファイル名はドロップしたフォルダ名を使うようにした。

また、作成したPowerShellファイル(ps1)ファイルに直接ドロップしてもうまくいかないので、ショートカットを作成して、リンク先を修正して使用するようにしている。

なお、今回は使用している内容の都合上、Windows OS上でのみ動作することになってるはず。

# ドラッグされたフォルダの中にあるファイル一覧をつくるやつ
#
# 使い方
#  1. このファイルを保存する
#  2. このファイルのショートカットを作成する
#  3. ショートカットのプロパティを開き"リンク先"の項目の先頭に「powershell.exe -NoProfile -ExecutionPolicy RemoteSigned -File 」をつけて保存
#  4. 作成されたショートカットの上に、フォルダをドロップすると、ウィンドウが開いて確認される
#  5. 作成するファイルリストの保存ファイル名を指定する
#  6. 出力される
#
$Args | foreach{
    echo $_.GetType()
    $searchdir = Get-Item -LiteralPath $_
}

Write-Host $searchdir.FullName "のファイル一覧を作成します"
pause

# https://pg-note.com/archives/1144 より
# 必要なアセンブリを読み込む
Add-Type -AssemblyName System.Windows.Forms 
$dialog = New-Object Windows.Forms.SaveFileDialog 

$dialog.Title = "ファイルの保存" 
$dialog.Filter = "テキストファイル(*.txt)|*.txt|csvファイル(*.csv)|*.csv|全てのファイル|*.*" 
$dialog.InitialDirectory = [Environment]::GetFolderPath("MyDocuments")
$dialog.FileName = $searchdir.Name

$ret = $dialog.ShowDialog() 

if ($ret -eq "OK"){
    Write-Host ("保存するファイル名、" + $dialog.FileName) 

    # ディレクトリの検索 start
    Get-ChildItem -Recurse $searchdir | ForEach-Object {
    $filename=$_.FullName
    
        if( !$_.PSIsContainer ){
            Write-Host $filename
            $filename|Out-File -FilePath $dialog.FileName -Append
        }
    }
    # ディレクトリの検索 end
} else {
    Write-Host ("キャンセル") 
}

pause