ショートカットを連続して入力した場合半透明へ
|
1 2 3 4 5 6 7 8 9 10 11 |
sc079 & Delete:: { If (A_PriorHotkey = A_ThisHotkey && 500 > A_TimeSincePriorHotkey) { WinSetTransparent 230, "A" } Else { WinSetTransparent "", "A" } } |
ショートカットを連続して入力した場合半透明へ
|
1 2 3 4 5 6 7 8 9 10 11 |
sc079 & Delete:: { If (A_PriorHotkey = A_ThisHotkey && 500 > A_TimeSincePriorHotkey) { WinSetTransparent 230, "A" } Else { WinSetTransparent "", "A" } } |
Googleの個人アカウントからWorkspaceに移行してみることにした。
個人アカウントはgmail.comで作成し、メインのメールはMuuMuuドメイン(このブログと同じドメイン)+Xserverで設定しGmailのPOP受信で利用していた。
Workspaceでもこのドメインを利用することとした。
・無料使用登録
https://workspace.google.com/intl/ja/
>無料使用を開始
会社名:個人名
従業員数:自分だけ
地域:日本
>次へ
姓名、メールアドレス(今回のドメインとは別のアドレス)を入力
>次へ
使用できるドメインがある
ドメインを入力
>次へ
このドメインを使ってアカウントを設定しますか?
>次へ
ログイン情報(ユーザー名、パスワード)を作成
>同意して続行
※ここで、メインのメールアドレスだと
“別のユーザー名を使用してください。この名前は予約されています。”
と表示され進めなかった。
予備メールから外したり、送信アカウントからも外してみたが登録できず、仕方がないので、一旦adminというユーザー名で作成した。
>同意して続行
Business Standard
14日間無料で試す
>同意して続行
・支払情報
お支払いプロファイルの作成
>同意して続行
カード情報入力する
ユーザーを追加
>今回はスキップ
・DNSレコード
所有権を証明する
ドメインで別のホストを使用している
>チェック
>続行
XserverのサーバーパネルからTXTレコードを追加する
※そのままGmailを有効にするかどうかが表示されるが、仮のadminユーザーのGmailなので無視してトップに戻る。
・ユーザー名変更
adminユーザーのユーザー名を本来予定したユーザー名に変更
・Gmail設定
管理画面のトップページに表示されるActiveGmailをクリック
自社ドメインでGmailの使用を開始する
>続行
xxxのすべてのユーザーに対してGmailを有効にする
>有効化を進める
メールを送受信するGmailを設定する
ドメインで別のホストを使用している
>続行
先ほど同様XserverのサーバーパネルからMXレコードを追加
>Gmailを有効にする
・Gmailから他のSMTP使う方法
※メインのメールアドレス以外に送受信するため
管理コンソール>アプリ>Google Workspace>Gmail>エンドユーザーのアクセス>ユーザーごとの送信ゲートウェイを許可
・Gmail移行
管理コンソール>データ>データのインポートとエクスポート>データ移行>Gmail
個人アカウントと作成したユーザーを指定し実行
※画面を閉じても処理は継続される。今回は数万件あったので、何時間もかかる。
・連絡先移行
個人アカウント>連絡先>エクスポート
Workspace>連絡先をインポート
・Calendar移行(一括エクスポート/インポート)
個人アカウント>右上歯車>設定>インポート/エクスポート>エクスポートWorkspaceア>右上歯車>設定>インポート/エクスポート>インポート
パソコンからファイルを選択で解凍したファイルを選択
※インポートすると、
“ファイルを読み込めません。数分後にもう一度お試しください”
となる。ファイルサイズが1MBを超えていたのでテキストエディタで分割してインポートしてみる。
・icsのファイル構造
|
1 2 3 4 5 6 7 8 9 10 11 |
BEGIN:VCALENDAR BEGIN:VTIMEZONE BEGIN:STANDARD END:STANDARD END:VTIMEZONE BEGIN:VEVENT ここにデータが入る END:VEVENT END:VCALENDAR |
BEGIN:VEVENT~END:VEVENT
単位でコピーする。
※分割してファイルサイズを1MB以下に落としても一部インポートできないファイルがでてしまった。
・Outlookに一度インポート
※一旦カレンダーのデータを削除し、Outlookに一度インポートして期間を指定してエクスポートしたicsを利用してみる。
Outlook>ファイル>開く/エクスポート>予定表で開く
ファイルを選択>インポート
※ここでエラーでいくつかでるけど無視
Outlook>ファイル>予定表の保存
表示されたダイアログ>その他オプション
から
期間:xxx – xxx
詳細情報:詳細情報
としてエクスポート
※この方法だと繰り返しの予定がうまく処理されなかった。指定した範囲外での繰り返しの予定がなくなってしまう。
・icsファイルサイズをもっと小さく分割してインポート
※再度カレンダーデータを削除して挑戦。
5,000行(100KB)程度ごとにBEGIN:VEVENT~END:VEVENTを手動で貼り付けたファイルではインポートできた。※icsファイルを最初から複数作成し、ヘッダ(BEGIN:VEVENT~END:VEVENT以外の部分)を貼り付けておくと楽。
・Chome
WorkspaceのプロファイルのChromeだとYoutubeだけ個人アカウントでログインができなかったので、個人アカウントのプロファイルのChromeで、Gmailなど必要なアプリだけWorkspaceという運用となっている。
1. 管理パスワード未設定
ユーザ名=空白 + パスワード=空白 → 管理者
ユーザ名=適当 + パスワード=空白 → NG
ユーザ名=空白 + パスワード=適当 → NG
2. 管理パスワード設定(123)
ユーザ名=空白 + パスワード=空白 → ユーザ名なし
ユーザ名=適当 + パスワード=空白 → NG
ユーザ名=空白 + パスワード=適当 → NG
ユーザ名=適当 + パスワード=123 → NG
ユーザ名=空白 + パスワード=123 → 管理者
3. ユーザ作成(user/abc)
ユーザ名=空白 + パスワード=空白 → ユーザ名なし
ユーザ名=適当 + パスワード=空白 → NG
ユーザ名=空白 + パスワード=適当 → NG
ユーザ名=空白 + パスワード=abc → NG
ユーザ名=user + パスワード=abc → user
ユーザ名=user + パスワード=123 → 管理者
ユーザ名=user + パスワード=空白 → NG
4. ユーザ(user)の管理ユーザへの昇格を不可へ
ユーザ名=user + パスワード=123 → NG
5. ユーザー名なしユーザーの管理ユーザへの昇格不可へ
ユーザ名=空白 + パスワード=123 → NG
※4まで進めると、user/123でログインできなくなる。
※5まで進めると管理者でログインできなくなる。
(ユーザ名なしログインは空白/123でログインするときにも適用される)
結果、
1.管理パスワードを設定(123)
2.ユーザを作成(user/abc)
3.ユーザ名なしユーザーの管理ユーザへの昇格不可へ
※接続方法の許可=すべて許可しない←この設定だけでOK(ユーザ名なしユーザーが実質無効化となるので)
これでユーザ名+パスワードの種類でユーザの種類が決まる。
空白/空白=NG
空白/123=NG
空白/abc=NG
user/123=管理ユーザ
user/abc=user(一般)
・LAN1ポート(8ポート)
スイッチングハブ機能を持つ8つ
・LAN2ポート(1ポート)
通常はWAN接続用
・LAN3ポート(1ポート)
LAN2と同様
WAN/LANどちらも可
コマンドの場合、
>cold start
全面3つのボタンを押しながら再起動
・電源を落とす
・全面3つのボタンを押したまま電源を入れる。
SSHだとuser/abcしか利用できないログイン後にadministratorと入力。
console lines infinity
console character ja.utf8
save
telnetd service off
sshd service off
※今回はSSH使わない
・管理者パスワード設定
アクセス管理>ユーザーの設定
管理パスワードの設定>設定
新しいパスワード:123
>確認
# WebGUIからは実行不可
administrator password
>123
・一般ユーザー(user)を作成
アクセス管理>ユーザーの設定>
ユーザーの設定>新規
ユーザー名:user
新しいパスワード:abc
(以下デフォルトのまま)
管理ユーザーへの昇格:許可する
接続方法の許可:すべて許可する
接続を許可する端末の制限:すべて許可する
自動ログアウトまでの時間:5分
Web GUI 画面の閲覧の許可:すべて許可する
同一ユーザー名による複数接続:許可する
>確認
# WebGUIからは実行不可
>login user user
>abc
・ユーザー名なしユーザーのログイン無効化+管理ユーザー昇格無効化
>user attribute administrator=off connection=off
※user/123=管理ユーザ
※user/abc=一般ユーザー(user)
※SSHの場合、user/abcでログイン後にadministratorと入力
管理>アクセス管理>ユーザーの設定>設定
自動ログアウトまでの時間を長くする。
MR600がSIMでインターネットにアクセス
MR600はDHCPが動いており、ネットワーク範囲が192.168.1.0/24。
MR600のLANポートとRTX1210のLAN2ポートを接続。
RTX1210はDHCPが動いており、ネットワーク範囲が192.168.100.0/24。
RTX1210のLAN1ポートにPCを接続。
PCはRTXのDHCPでIPアドレスを取得し、MR600を経由してインターネットアクセスしている状態。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
# LAN2は外部ルーター(上位)からIPを自動取得 # プロバイダが固定IPの場合ip lan2 address xxx.xxx.xxx.xxx/xxなど ip lan2 address dhcp # (工場出荷設定済) # DHCPサービス有効化 # dhcp service server # LAN1のIPアドレス配布範囲 # scope1はlan1用だと自動で判断される dhcp scope 1 192.168.12.2-192.168.12.254/24 # LAN2からDHCPで取得したデフォルトゲートウェイをルーターのデフォルトルートとして設定 # LAN2が固定の場合 ip route default gateway xxx.xxx.xxx.xx lan2 ip route default gateway dhcp lan2 # DNSサーバーはLAN2で取得したものを利用するように設定 dns server dhcp lan2 # 外部DNSを利用 # 変更する場合は no dns server でリセットしてから # dns server 1.1.1.1 # dns server 1.0.0.1 # NATディスクリプタ1をマスカレード(NAPT)方式で動作させる nat descriptor type 1 masquerade # NATディスクリプタ1のインターネット側のIPアドレスにprimaryを設定。 # primaryはディスクリプタに関連付けられたインターフェースに設定されているプライマリIPアドレス nat descriptor address outer 1 primary # (工場出荷設定済) # NATディスクリプタ1のLAN側のIPアドレス範囲を設定。 # NAT処理の対象となるローカルネットワークのIPアドレス範囲を指定。 # nat descriptor address inner 1 192.168.11.1-192.168.11.254 # nat descriptor address inner 1 auto # LAN2の通信に対してNATディスクリプタ1で定義されたNATを適用。 ip lan2 nat descriptor 1 # LAN1のアドレスを設定 # LAN1に接続した機器のゲートウェイとなる # この設定を最後にしないと切断してしまう # 工場出荷時 ip lan1 address 192.168.100.1/24 ip lan1 address 192.168.12.1/24 |
実行結果。最低限これでけでネットに繋がる。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
administrator password encrypted * login user user * user attribute administrator=off connection=off user attribute user connection=serial,telnet,remote,ssh,sftp,http gui-page=dashboard,lan-map,config login-timer=300 ip route default gateway dhcp lan2 ip lan1 address 192.168.12.1/24 ip lan2 address dhcp ip lan2 nat descriptor 1 nat descriptor type 1 masquerade nat descriptor address outer 1 primary nat descriptor address inner 1 auto telnetd host lan dhcp service server dhcp server rfc2131 compliant except remain-silent dhcp scope 1 192.168.12.2-192.168.12.254/24 dns server dhcp lan2 statistics traffic on |
もしダブルルータの設定を流用するなら競合の設定を削除。
|
1 2 3 4 |
no ip route default gateway dhcp lan2 no ip lan2 nat descriptor 1 no dns server dhcp lan2 no ip lan2 address dhcp |
GUIだと実行できないコマンドがあるのでTeraTermから
文字化けする場合は、漢字コード>送受信Shift_JIS
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
administrator # PPPインターフェースpp1を選択 pp select 1 # 終了pp select none # 常時接続設定 pp always-on on # PPPoE接続に使う物理インターフェースを指定(ONU接続ポート) pppoe use lan2 # 認証方式の許可(PAPとCHAP) pp auth accept pap chap # ISPから指示された認証情報を設定 pp auth myname <ユーザー名> <パスワード> # PPP IPCPによるIPアドレス取得許可 ppp ipcp ipaddress on # LCP MRUの設定 ppp lcp mru on 1454 # PPPのMTU設定 ip pp mtu 1454 # NATディスクリプタ1をマスカレード(NAPT)方式で動作させる nat descriptor type 2 masquerade # pp1インターフェースのグローバルIPをNAT外側アドレスに設定 # nat descriptor address outer 2 pp 1 nat descriptor address outer 2 primary # NAT利用時のIPマスカレード設定 ip pp nat descriptor 2 # pp1インターフェースを有効化 pp enable 1 # DNSサーバーはPPPoEのIPCPから dns server pp 1 # ルーターのデフォルトルートをpp1に設定 ip route default gateway pp 1 # LAN1のIPアドレス配布範囲 dhcp scope 1 192.168.12.2-192.168.12.254/24 # LAN1のアドレスを設定 ip lan1 address 192.168.12.1/24 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
# ipsecはトンネルを作るためのプロトコル群 # ikeはipsecの前準備のためのプロトコル # saはikeによって合意した通信ルールの定義書 # トンネル1の設定モード tunnel select 1 description <名称> # tunnel1でipsecを利用する ipsec tunnel 1 # 最初の1はsaポリシー番号、次の1はike番号 # ike番号、sa番号を紐づける ipsec sa policy 1 1 esp aes-cbc sha256 # ike1でikeのバージョン2を利用する ipsec ike version 1 2 # ike1に対してキープアライブ機能を有効化する ipsec ike keepalive use 1 on # ike1のキープアライブ関連イベントをログ出力する ipsec ike keepalive log 1 on # ike1のdpd監視を10秒周期で行い、3回連続で応答が無ければ対向ダウン ipsec ike dpd interval 1 10 retry 3 # ike1でnat越えを使ってipsec/ikeを通す機能を有効化 ipsec ike nat-traversal 1 on # ikeのエンドポイントIPを決める(結果ipsec全体のエンドポイント) # ppoeならauto ipsec ike local address 1 <A拠点WANのインタフェースIPまたはauto> # ike1のidをkey-id方式でbranch-aにする(複数のikeのどれかを識別するため) # ipsec ike local id 1 fqdn a-site.example.local ipsec ike local id 1 key-id branch-a # ike1の接続先 ipsec ike remote address 1 <B拠点のグローバルIPまたはFQDN> # ike1の接続先のidはkey-id方式でbranch-b # ipsec ike remote id 1 fqdn b-site.example.local ipsec ike remote id 1 key-id branch-b # 両方の拠点で同じ文字列(20文字目安) ipsec ike pre-shared-key 1 text <強固な共有鍵> # ike1のike saの寿命を3600秒(1時間) ipsec ike sa lifetime 1 3600 # ike1のipsec saの寿命を3600秒(1時間) ipsec sa lifetime time 1 3600 # ike1のipsec seでpfsを使う ipsec sa pfs group14 1 # tcpセッションのmss値を自動調整 ip tunnel tcp mss limit auto # tunnel1を有効化 tunnel enable 1 # ルーティング ip route 192.168.21.0/24 tunnel 1 # トンネル1の設定モード終了 exit |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
ipv6 routing on # 1. 上流からIPv6情報を受け取る設定 ipv6 lan2 address dhcp ipv6 lan2 dhcp service client # 2. 受け取った情報を元に、LAN1側へ配布するプレフィックスを定義 ipv6 prefix 1 dhcp-prefix@lan2::/64 # 3. LAN1インターフェースにIPv6アドレスを割り当て ipv6 lan1 address dhcp-prefix@lan2::1/64 # 4. LAN1配下のPCに対してIPv6アドレスを自動配布(RA) ipv6 lan1 rtadv send 1 o_flag=on ipv6 lan1 dhcp service server |
・SIMカードを指す
・LAMケーブルを指す。
・WiFiは使わないのでボタンでオフにする
192.168.1.1にアクセスする。
パスワードを求められるので決める。
・設定画面が開く
(今回はau)
詳細設定>ネットワーク>インターネット>プロフィール作成
プロファイル名:au
PDPタイプ:IPv4
APNタイプ:静的
APN:uad5gn.au-net.ne.jp
ユーザー名:au@uad5gn.au-net.ne.jp
パスワード:au
認証タイプ:CHAP
リセットする場合はリセットボタン長押し
(今回はmineo/softbank)
詳細設定>ネットワーク>インターネット>プロフィール作成
プロファイル名:mineo
PDPタイプ:IPv4
APNタイプ:静的
APN:mineo-s.jp
ユーザー名:mineo@k-opti.com
パスワード:mineo
認証タイプ:CHAP
Vaultwardenで利用したVPSに追加の別サブドメインでMeshCentralをインストールしてみる。
・Azure DNSゾーン
対象のドメインを選択
>+子ゾーン
>確認および作成
>作成
作成されたゾーンを選択
Aレコードに、sub.domainを追加する。
>レコードセット
>+追加
種類:A
IPアドレス:対象のアドレス
として作成。
・caddy
|
1 |
sudo vim /etc/caddy/Caddyfile |
|
1 2 3 4 5 6 |
※ここにはVaulwardenの設定がある sub.domain { reverse_proxy localhost:8081 tls メールアドレス } |
|
1 |
sudo systemctl restart caddy |
取得できているかどうか
|
1 |
sudo ls -la /var/lib/caddy/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory |
・Docker
|
1 2 3 |
sudo mkdir meshcentral cd meshcentral sudo vim docker-compose.yml |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
services: meshcentral: container_name: meshcentral image: ghcr.io/gurucomputing/meshcentral-docker:latest restart: "always" volumes: - ./container-data/meshcentral-data:/meshcentral/meshcentral-data - ./container-data/meshcentral-files:/meshcentral/meshcentral-files - ./container-data/meshcentral-backup:/meshcentral/meshcentral-backup - /etc/localtime:/etc/localtime:ro environment: - MONGODB_URL=mongodb://meshcentral-db:27017 - MONGODB_NAME=meshcentral - DB_ENCRYPT_KEY=ランダム文字列 - REVERSE_PROXY=true - REVERSE_PROXY_TLS_TERMINATION=true ports: - "8081:443" networks: - meshcentral-nw meshcentral-db: container_name: meshcentral-db image: mongo:latest restart: "always" volumes: - ./container-data/db:/data/db - /etc/localtime:/etc/localtime:ro networks: - meshcentral-nw networks: meshcentral-nw: |
|
1 |
sudo docker compose up -d |
・MeshCentral
|
1 |
sudo vim container-data/meshcentral-data/config.json |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
{ "settings": { "Port": 443, "AgentPort": 443, "TlsOffload": "127.0.0.1", "Cert": "sub.domain", "mongoDb": "mongodb://meshcentral-db:27017", "mongoDbName": "meshcentral" }, "domains": { "": { "certUrl":"https://sub.domain" } } } |
・ダウンロードしたAgentのwss://domain:port/agent.ashxが以下で変わる。
AgentPortは、portの部分、Certはdomainの部分。
ここでCertを指定しないとLANだけの動作になる。
●Agent
・MeshCentral>ログインしてアカウントを作成
・デバイスグループを作成>デバイスを作成
・Agentインストーラーをダウンロード>実行
・プログラムフォルダに作成されたプログラムを起動し、インストール
※インストーラーが起動しない場合、
システム>オプション機能>機能を表示>
WMICを追加する
●メモ
再起動する場合
sudo docker compose restart meshcentral
sudo docker compose restart meshcentral-db
・エラー発生した場合
コンテナID確認
sudo docker ps
コンテナ停止
sudo docker container stop コンテナID
コンテナを削除
sudo docker rm コンテナID
ログ
sudo docker logs コンテナID
・Indigoで新規インスタンスを生成
Ubuntu 24.04
2vCPU/2GB/40GB
・TeraTermからSSHアクセス
・Docker
|
1 2 3 4 5 6 7 |
sudo apt update sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" sudo apt-get update sudo apt install docker-ce docker-ce-cli containerd.io docker --version |
・Docker Compose
|
1 2 |
sudo apt install docker-compose-plugin docker compose version |
・DNS設定
Azure>DNSゾーン>+子ゾーン
名前のところにサブドメインにしたい値を入れて、確認及び作成
作成したサブドメイン付きのドメインのレコードセットを編集
AレコードでVPSのIPアドレスを指定
・Caddy
|
1 2 |
sudo apt install -y caddy sudo vim /etc/caddy/Caddyfile |
|
1 2 3 4 5 |
ドメイン { reverse_proxy /notifications/hub localhost:3012 reverse_proxy localhost:8080 tls メールアドレス } |
|
1 |
sudo systemctl start caddy |
・Vaultwarden
|
1 2 3 |
sudo mkdir vaultwarden cd vaultwarden sudo vim docker-compose.yml |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
services: vaultwarden: image: vaultwarden/server:latest container_name: vaultwarden environment: - TZ=Asia/Tokyo env_file: - ./vaultwarden.env volumes: - ./vw-data:/data ports: - 8080:80 - 3012:3012 restart: always |
|
1 2 |
sudo vim vaultwarden.env ADMIN_TOKEN='40文字のランダム文字列' |
|
1 |
sudo docker compose up -d |
これでhttps://sub.domainでアクセスできる。
・ufw
|
1 2 3 4 |
sudo ufw allow 22/tcp sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw enable |
sudo vim /etc/default/ufw
IPV6=no
|
1 2 |
sudo ufw reload sudo ufw status |
・ssh
sudo vim /etc/ssh/sshd_config
・PasswordAuthentication
・ChallengeResponseAuthentication
・GSSAPIAuthentication
3つともnoへ
|
1 |
sudo service ssh restart |
・Dockerコマンドメモ
全てのコンテナ
sudo docker compose ps -a
全てのコンテナストップ
sudo docker stop $(sudo docker ps -q)
全てのコンテナ削除
sudo docker container prune
・Caddyメモ
caddy設定ファイル
|
1 2 3 |
sudo ls -la /var/lib/caddy/.local/share/caddy/acme/acme-v02.api.letsencrypt.org-directory/users/ ※表示されたメールアドレスを入力して実行 sudo cat /var/lib/caddy/.local/share/caddy/acme/acme-v02.api.letsencrypt.org-directory/users/メールアドレス/メールアドレス@より前.json |
Microsoftの職場・学校用アカウントで使えるExchange Onlineに余っていたドメインを設定してみる。
今回はMuuMuuで取得したドメイン→AzureDNSゾーンだった。
Microsoft 365 管理センター>ドメイン
https://admin.microsoft.com/adminportal/home#/Domains
から対象ドメインを追加する。
所有者の確認があるので、
AzureのDNSゾーン>レコードセット>追加
から以下の設定
指定のTXTレコードを追加
名前:空白
TTL:1時間
値:指定の値
Azureで操作しているユーザーのロール不足だったので、DNSゾーン>アクセス制御の画面から、ユーザーに所有者ロールを付与する。
表示されたCNAME,MX,TXTをAzure>DNSゾーンから追加する。このドメインはConoHaのMattermostテンプレートで利用していたので、Aレコードはすでに設定済みだったが問題なかった。
このタイミングで、以前からAzureでユーザーに利用していたドメインも新しいドメインに変更するため、新しいドメインでユーザーを作成し、グローバル管理者のロールを追加する。
DNSゾーンなど設定が新しいユーザーからでも見えるように、リソースグループ、サブスクリプショングループのページのアクセス制御から、新しいユーザーを追加する。
更新プログラムの画面で”このPCでの更新プログラムは組織が管理しています”と表示される場合、
gpedit.msc>コンピュータの構成>管理用テンプレート>Windowsコンポーネント>WindowsUpdate
以下のサブフォルダの設定をすべて未構成にしてあるかどうか確認。
復元処理中、容量不足でエラー表示。
まず、
compmgmt.msc>記憶域>ディスク管理>C:>ボリュームの拡張
を実施(環境によって、通常効果はない)
次に、2回に分けて復元し、圧縮を実施した。(1度目の復元後に下記実施し、残りを復元)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
USE master; -- master データベースに接続。sys.databases ビューを参照するため。 GO -- データベース名を格納する変数を宣言 DECLARE @DBName NVARCHAR(MAX); -- カーソルを宣言して、システムデータベースを除外したすべてのデータベース名を取得 DECLARE db_cursor CURSOR FOR SELECT name FROM sys.databases WHERE name NOT IN ('master', 'model', 'msdb', 'tempdb') -- システムデータベースを除外 -- カーソルを開く(データベースのリストを準備) OPEN db_cursor; -- 最初のデータベース名をカーソルから取得 FETCH NEXT FROM db_cursor INTO @DBName; -- カーソルで取得したすべてのデータベースに対して繰り返し処理を実行 WHILE @@FETCH_STATUS = 0 BEGIN -- 圧縮コマンドを格納する変数を宣言 DECLARE @SQL NVARCHAR(MAX); -- DBCC SHRINKDATABASE コマンドを動的SQLとして構築 -- ここでは、10% の空き領域を残して圧縮する設定(必要に応じて変更可能) SET @SQL = 'DBCC SHRINKDATABASE ("' + @DBName + '", 10);'; -- 実行されるコマンドを確認するために出力(オプション) PRINT @SQL; -- 実際の圧縮コマンドが何か確認したい場合に役立つ -- 構築した SQL コマンドを実行 EXEC sp_executesql @SQL; -- 次のデータベース名をカーソルから取得 FETCH NEXT FROM db_cursor INTO @DBName; END; -- カーソル操作が完了したら閉じる CLOSE db_cursor; -- カーソルのメモリを解放 DEALLOCATE db_cursor; GO |
もし一括でDBを削除する場合
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
USE master; -- master データベースに接続 GO DECLARE @DatabaseName NVARCHAR(128); DECLARE @SQL NVARCHAR(MAX); -- カーソルを宣言して、削除対象のデータベース名を取得 DECLARE db_cursor CURSOR FOR SELECT name FROM sys.databases WHERE name NOT IN ('master', 'model', 'msdb', 'tempdb') -- システムデータベースを除外 -- カーソルを開く OPEN db_cursor; -- 最初のデータベース名を取得 FETCH NEXT FROM db_cursor INTO @DatabaseName; -- すべてのデータベースに対して繰り返し処理 WHILE @@FETCH_STATUS = 0 BEGIN -- データベースをシングルユーザーモードに設定し、接続を強制切断 SET @SQL = 'ALTER DATABASE "' + @DatabaseName + '" SET SINGLE_USER WITH ROLLBACK IMMEDIATE;'; PRINT @SQL; -- 実行されるコマンドを確認(オプション) EXEC sp_executesql @SQL; -- データベースを削除 SET @SQL = 'DROP DATABASE "' + @DatabaseName + '";'; PRINT @SQL; -- 実行されるコマンドを確認(オプション) EXEC sp_executesql @SQL; -- 次のデータベース名を取得 FETCH NEXT FROM db_cursor INTO @DatabaseName; END; -- カーソルを閉じて解放 CLOSE db_cursor; DEALLOCATE db_cursor; GO |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
function deleteTriggers() { writeLog("trigger削除"); let triggers = ScriptApp.getProjectTriggers(); for(let i = 0; i < triggers.length; i++){ ScriptApp.deleteTrigger(triggers[i]); } } function writeLog(x){ let ss = SpreadsheetApp.getActiveSheet(); let range = ss.getRange("B1:C100"); let values = range.getValues(); for(let r = 0; r < values.length; r++){ if (values[r][0] == ""){ range.getCell(r+1,1).setValue(x); range.getCell(r+1,2).setValue( new Date().toTimeString().slice(0, 8) ); break; } } } function main() { // クリア let ss = SpreadsheetApp.getActiveSheet(); ss.clear(); ss.getRange("A1").setValue(0); writeLog("main開始"); deleteTriggers(); ScriptApp.newTrigger('trigger').timeBased().after(1000).create(); writeLog("trigger登録"); writeLog("main終了"); } function trigger() { writeLog("trigger開始"); let startTime = new Date().getTime(); while (SpreadsheetApp.getActiveSheet().getRange("A1").getValue() <= 20) { Utilities.sleep(1000); // 1秒 SpreadsheetApp.getActiveSheet().getRange("A1").setValue( SpreadsheetApp.getActiveSheet().getRange("A1").getValue() + 1 ); writeLog(SpreadsheetApp.getActiveSheet().getRange("A1").getValue()); let elapsedTime = (new Date().getTime() - startTime) / 1000; if (elapsedTime > 5){ deleteTriggers(); ScriptApp.newTrigger('trigger').timeBased().after(1000).create(); writeLog("trigger登録"); return; } } deleteTriggers(); writeLog("trigger終了"); } |