> For the complete documentation index, see [llms.txt](https://docs.keeper.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.keeper.io/keeperpam/jp/commander-sdk/keeper-commander-sdks/sdk-command-reference/nested-shared-folder-commands.md).

# 階層型共有サブフォルダコマンド

階層型共有サブフォルダ機能に関するSDKコマンド

**ロールベースのフォルダ権限を備えた階層型共有サブフォルダ**の導入に伴い、ボルトのフォルダ、共有、権限モデルを一から再構築し、すべてのユーザーとチームがより柔軟でスケールしやすい体験を得られるようになります。

### 一覧コマンド <a href="#list-command" id="list-command"></a>

ローカルにキャッシュされた階層型共有サブフォルダのフォルダとレコードを一覧表示します。既定ではフォルダとレコードの両方が表示されます。`--folders` または `--records` フラグで絞り込み、`--format` で出力形式を制御できます。

<details>

<summary>DotNet CLI</summary>

**コマンド:** `nsf-list`

**パラメータ:**

| パラメータ       | 説明                                  |
| ----------- | ----------------------------------- |
| `--folders` | フォルダのみ表示                            |
| `--records` | レコードのみ表示                            |
| `--format`  | 出力形式: `table` (既定)、`csv`、または `json` |
| `--output`  | 出力ファイルのパス (`table` 形式では無視)          |

**例:**

{% code expandable="true" %}

```bash
My Vault> nsf-list

=== Keeper NSF Summary ===
  Folders: 1
  Records: 1

--- Folders ---
FolderUid               Name                   ParentUid               Subfolders  Records
----------------------  ---------------------  ----------------------  ----------  -------
F1lX8kCMx--W0ndcmeaX6w  Child-folder           eRcyzWqxQhMlieLuRq29nA  0           0      

--- Records ---
RecordUid               Name          Type   Revision  Version  Shared  FileSize  ThumbnailSize
----------------------  ------------  -----  --------  -------  ------  --------  -------------
LTVdDDvuSKLmWYiNbKjrYg  Notes1234     login  5017162   3        False   0         0

```

{% endcode %}

</details>

<details>

<summary>DotNet SDK</summary>

**メソッド:**

```csharp
var vault = new VaultOnline(auth);
await vault.SyncDown();
Console.WriteLine($"Folders: {vault.KeeperNSFFolderCount}, Records: {vault.KeeperNSFRecordCount}");
foreach (var folder in vault.KeeperNSFFolderNodes)
{
    Console.WriteLine($"[Folder] {folder.FolderUid}  {folder.Name}");
}
foreach (var record in vault.KeeperNSFRecordEntries)
{
    Console.WriteLine($"[Record] {record.RecordUid}  {record.Name}  v{record.Version}");
}
if (vault.TryGetKeeperNSFFolder("folderUid1", out var f))
{
    Console.WriteLine($"Found folder: {f.Name}");
}
if (vault.TryResolveKeeperNSFRecord("MyLogin", out var r))
{
    Console.WriteLine($"Resolved record: {r.RecordUid}");
}
```

</details>

<details>

<summary>Power Commander</summary>

**コマンド:** `Get-KeeperNSFList`

**別名:** `nsf-list`

**パラメータ:**

| パラメータ      | 説明                                  |
| ---------- | ----------------------------------- |
| `-Folders` | フォルダのみ表示                            |
| `-Records` | レコードのみ表示                            |
| `-Format`  | 出力形式: `table` (既定)、`csv`、または `json` |
| `-Output`  | 出力ファイルのパス (`table` 形式では無視)          |

**例:**

{% code expandable="true" %}

```
PS > Get-KeeperNSFList
PS > nsf-list -Folders
PS > nsf-list -Records -Format json -Output nsf-records.json
PS > nsf-list -Format csv -Output nsf.csv
```

{% endcode %}

</details>

<details>

<summary>Python CLI</summary>

**コマンド:** `nsf-list`

**パラメータ**:\
`--folders` フォルダのみ表示\
`--records` レコードのみ表示\
`--format` {table,csv,json}\
`--output` OUTPUT 出力ファイルのパス (`table` 形式では無視)

**例:**

```shellscript
My Vault> nsf-list
  #  Item type    UID                     Title                                      Type                     Description
---  -----------  ----------------------  -----------------------------------------  -----------------------  -------------
  1  Folder       <folder_uid>            Folder Title
  2  Record       <record_uid>            new test nsf                               login
```

</details>

<details>

<summary>Python SDK</summary>

**関数:** `list_nsf_items`

```python
    INCLUDE_FOLDERS = True
    INCLUDE_RECORDS = True

    rows = nsf_management.list_nsf_items(
        vault,
        include_folders=INCLUDE_FOLDERS,
        include_records=INCLUDE_RECORDS,
    )
    if not rows:
        print("No NSF folders or records found. Run sync-down first.")
        return
    print(f"{'Type':<8} {'UID':<28} {'Title':<30} {'Record Type':<15} {'Location'}")
    print("-" * 100)
    for row in rows:
        print(
            f"{row.item_type:<8} {row.uid:<28} {row.title[:28]:<30} "
            f"{(row.record_type or '')[:15]:<15}"
        )
    print(f"\nTotal items: {len(rows)}")
```

</details>

### 取得コマンド <a href="#get-command" id="get-command"></a>

UIDまたは名前で指定したKeeper NSFレコードまたはフォルダの詳細 (メタデータ、ユーザー権限、共有管理者を含む) を取得します。

<details>

<summary>DotNet CLI</summary>

**コマンド:** `nsf-get`

**パラメータ:**

| パラメータ      | 説明                                              |
| ---------- | ----------------------------------------------- |
| `--uid`    | 検索するレコードまたはフォルダのUID                             |
| `--name`   | 検索するレコードまたはフォルダ名 (大文字小文字を区別しない。一致しない場合は部分一致で検索) |
| `--format` | 出力形式: `detail` (既定) または `json`                  |

**例:**

{% code expandable="true" %}

```bash
MyVault> nsf-get --uid GS3J1s9ARg1-P5LRQOeRTA

                  UID: GS3J1s9ARg1-P5LRQOeRTA
                 Type: login
                Title: Record-Share
             Password: ********
           Folder UID: AAAAAAAAAAAAAAAAAALjjA
          Folder Name: (unknown)
          Folder Path:
          
          User Permissions:

                 User: example1@keepersecurity.com
                Owner: Yes
            Shareable: Yes
            Read-Only: No

                 User: example2@keepersecurity.com
                 Role: full-manager
            Shareable: Yes
            Read-Only: No

                 User: example3@keepersecurity.com
                 Role: viewer
            Shareable: No
            Read-Only: Yes

Share Admins (5, showing first 2):
  example4@keepersecurity.com
  example5@keepersecurity.com
  ... and 3 more
```

{% endcode %}

</details>

<details>

<summary>DotNet SDK</summary>

**メソッド:**

```csharp
var vault = new VaultOnline(auth);
await vault.SyncDown();
if (vault.TryGetKeeperNSFRecord(recordUid, out var record))
{
    Console.WriteLine($"Record: {record.RecordUid} ({record.Name}) v{record.Version}");
    foreach (var access in vault.Storage.KdRecordAccesses.GetLinksForSubject(record.RecordUid))
    {
        Console.WriteLine($"  user-uid={access.AccessTypeUid}  owner={access.Owner}  " +
                          $"edit={access.CanEdit}  view={access.CanView}  delete={access.CanDelete}");
    }
}
if (vault.TryResolveKeeperNSFFolder(folderUidOrName, out var folder))
{
    var stored = vault.Storage.KdFolders.GetEntity(folder.FolderUid);
    Console.WriteLine($"Folder: {folder.FolderUid} ({folder.Name})  owner={stored?.OwnerUsername}");
}
```

</details>

<details>

<summary>Power Commander</summary>

**コマンド:** `Get-KeeperNSFRecord`

**別名:** `nsf-get`

**パラメータ:**

| パラメータ     | 説明                                              |
| --------- | ----------------------------------------------- |
| `-Uid`    | 検索するレコードまたはフォルダのUID                             |
| `-Name`   | 検索するレコードまたはフォルダ名 (大文字小文字を区別しない。一致しない場合は部分一致で検索) |
| `-Format` | 出力形式: `detail` (既定) または `json`                  |

**例:**

{% code expandable="true" %}

```ps1
PS > nsf-get oqf7DOKZvSYuwhwFc6qvOw
                                                   
                  UID: oqf7DOKZvSYuwhyqtewFc6qvOw
                 Type: databaseCredentials
                Title: 1234
             Password: ********
                 Host: hostName: 1.2.3.4, port: 1234
           Folder UID: wbxwceZdbqhusyPVcyuR-7IybjA
          Folder Name: QWE-test
          Folder Path: /QWE-test

     User Permissions:

                 User: example1@keepersecurity.com
                Owner: Yes
            Shareable: Yes
            Read-Only: No

                 User: example2@keepersecurity.com
                 Role: full-manager
            Shareable: Yes
            Read-Only: No

                 User: example3@keepersecurity.com
                 Role: viewer
            Shareable: No
            Read-Only: Yes

Share Admins (5, showing first 2):
  example4@keepersecurity.com
  example5@keepersecurity.com
  ... and 3 more
```

{% endcode %}

</details>

<details>

<summary>Python CLI</summary>

**コマンド:** `nsf-get`

パラメータ:

`uid` レコードUID、フォルダUID、またはタイトル\
`--format` {detail, json} 出力形式: detail (既定) または json\
`--verbose, -v` 各アクセサーの権限内訳をすべて表示\
`--unmask` マスクされたフィールド値 (パスワード、シークレット) を表示

例:

```shellscript
My Vault> nsf-get <record_uid>

                 UID: <record_uid>
                Type: pamNetworkConfiguration
               Title: Test Configuration
              Folder: Folder - Users
        Pamresources: controllerUid: <controller_uid>, folderUid: <folder_uid>

User Permissions:

  User: email@keepersecurity.com
  Owner: Yes
  Shareable: Yes
  Read-Only: No
```

</details>

<details>

<summary>Python SDK</summary>

**関数:** `get_nsf_item`

```python
    ITEM_UID_OR_TITLE = "<record_uid_or_title>"  # Record/folder UID or title

    detail = nsf_management.get_nsf_item(vault, ITEM_UID_OR_TITLE)
    print(json.dumps(detail, indent=2, default=str))
```

</details>

### ショートカットコマンド <a href="#shortcut-command" id="shortcut-command"></a>

すべてのKeeper NSFフォルダとレコードのリンクを走査し、2つ以上のフォルダに存在するレコードを一覧表示します。特定のレコード (UID/タイトル) またはフォルダ (UID/名前) で絞り込めます。

<details>

<summary>DotNet CLI</summary>

**コマンド:** `nsf-shortcut-list`

**パラメータ:**

| パラメータ        | 説明                                          |
| ------------ | ------------------------------------------- |
| `position 0` | 結果を絞り込む任意のレコードUID、レコードタイトル、フォルダUID、またはフォルダ名 |
| `-Format`    | 出力形式: `table` (既定)、`csv`、または `json`         |
| `-Output`    | 出力ファイルのパス (`table` 形式では無視)                  |

**例:**

{% code expandable="true" %}

```bash
My Vault> nsf-shortcut-list
No shortcut records found.
```

{% endcode %}

**コマンド:** `nsf-shortcut-keep`

**説明:** 複数のKeeper NSFフォルダに存在するレコードについて、指定したフォルダに残し、それ以外からリンクを解除します。

**パラメータ:**

| パラメータ        | 説明                          |
| ------------ | --------------------------- |
| `position 0` | レコードのUIDまたはタイトル (必須)        |
| `position 1` | レコードを残すフォルダUIDまたはフォルダ名 (必須) |
| `--force`    | 確認プロンプトをスキップ                |

</details>

<details>

<summary>DotNet SDK</summary>

**メソッド:**

```csharp
var vault = new VaultOnline(auth);
await vault.SyncDown();

foreach (var entry in vault.GetKeeperNSFShortcuts())
{
    Console.WriteLine($"{entry.RecordUid}  {entry.Title}  [{entry.Folders.Count} folders]");
    foreach (var f in entry.Folders)
    {
        Console.WriteLine($"  - {f.Name} ({f.FolderUid})");
    }
}

var keepResult = await vault.KeepKeeperNSFRecordInFolder(recordUid, keepFolderUid);
foreach (var removal in keepResult.Removals)
{
    Console.WriteLine($"{(removal.Success ? "[OK]" : "[FAIL]")} {removal.FolderName} ({removal.FolderUid})");
}
```

</details>

<details>

<summary>Power Commander</summary>

**コマンド:** `Get-KeeperNSFShortcut`

**別名:** `nsf-shortcut-list`

**パラメータ:**

| パラメータ     | 説明                                          |
| --------- | ------------------------------------------- |
| `-Target` | 結果を絞り込む任意のレコードUID、レコードタイトル、フォルダUID、またはフォルダ名 |
| `-Format` | 出力形式: `table` (既定)、`csv`、または `json`         |
| `-Output` | 出力ファイルのパス (`table` 形式では無視)                  |

**例:**

{% code overflow="wrap" expandable="true" %}

```powershell
PS > Get-KeeperNSFShortcut                    
No shortcut records found.
```

{% endcode %}

**コマンド:** `Set-KeeperNSFShortcutKeep`

**別名:** `nsf-shortcut-keep`

**説明:** 複数のKeeper NSFフォルダに存在するレコードについて、指定したフォルダに残し、それ以外からリンクを解除します。

**パラメータ:**

| パラメータ        | 説明                          |
| ------------ | --------------------------- |
| `-RecordUid` | レコードのUIDまたはタイトル (必須)        |
| `-FolderUid` | レコードを残すフォルダUIDまたはフォルダ名 (必須) |
| `-Force`     | 確認プロンプトをスキップ                |

**例:**

{% code overflow="wrap" expandable="true" %}

```ps1
PS > Set-KeeperNSFShortcutKeep -RecordUid <RECORD_UID> -FolderUid <FOLDER_UID>
PS > nsf-shortcut-keep <RECORD_TITLE> <FOLDER_NAME> -Force
```

{% endcode %}

</details>

<details>

<summary>Python CLI</summary>

**コマンド:** `nsf-shortcut`

**パラメータ**:

`target` レコードUIDまたはタイトル

`folder` 残すフォルダ (既定: 現在のフォルダ)

`-f, --force` 確認プロンプトをスキップ

**例**:

```shellscript
My Vault> nsf-shortcut keep <record_uid> <folder_uid>
Will keep record in <record_uid> and remove from 1 other folder(s).
Do you want to proceed? [y/n]: y
Removed record from 1 folder link(s).
My Vault>
```

</details>

<details>

<summary>Python SDK</summary>

**関数:** `Not implemented`

```python
##### NSF SHORTCUT LIST
    TARGET_FILTER = None  # Optional record or folder filter

    rows = nsf_folder_records.list_nsf_shortcuts(vault, target=TARGET_FILTER)
    if not rows:
        print("No NSF shortcut records found")
        return
    view = vault.nsf_data
    for row in rows:
        folder_names = []
        for fuid in row.folder_uids:
            folder = view.get_folder(fuid) if view else None
            fname = folder.name if folder and folder.name else fuid
            folder_names.append(f"{fname} ({fuid})")
        print(f"{row.record_uid} | {row.title} | {', '.join(folder_names)}")
        
        
#### NSF SHORTCUT KEEP
    RECORD_UID_OR_TITLE = "My NSF Login"
    FOLDER_UID_OR_NAME = "Projects"  # Folder to keep the record in
    FORCE = True

    shortcuts = nsf_folder_records.get_nsf_shortcut_map(vault)
    record_uid = nsf_management.resolve_nsf_record_uid(vault, RECORD_UID_OR_TITLE)
    if not record_uid:
        raise ValueError(f'Record "{RECORD_UID_OR_TITLE}" not found')
    keep_folder = nsf_management.resolve_nsf_folder_uid(vault, FOLDER_UID_OR_NAME) or FOLDER_UID_OR_NAME
    to_remove = [f for f in shortcuts.get(record_uid, set()) if f != keep_folder]
    if not to_remove:
        print("Nothing to do — record is already in only one folder.")
        return
    if not FORCE:
        answer = input(
            f"Keep record in {FOLDER_UID_OR_NAME} and remove from {len(to_remove)} folder(s)? [y/N]: "
        ).strip().lower()
        if answer not in ("y", "yes"):
            print("Aborted.")
            return
    results = nsf_folder_records.keep_nsf_shortcut_in_folder(
        vault, RECORD_UID_OR_TITLE, FOLDER_UID_OR_NAME
    )
    print(f"Removed record from {len(results)} folder link(s).")

```

</details>

### レコード権限の付与/取り消しコマンド <a href="#grant-revoke-record-permissions-command" id="grant-revoke-record-permissions-command"></a>

Keeper NSFフォルダ内のすべてのレコードに対して、レコード単位の共有権限を一括で付与または取り消します。各レコードの現在のアクセス権を取得し、必要な変更内容を計算して計画を表示したうえで、確認後に変更を適用します。

<details>

<summary>DotNet CLI</summary>

**コマンド:** `nsf-record-permission`

**パラメータ:**

| パラメータ         | 説明                                                                                                                                           |
| ------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| `position 0`  | レコードを含むフォルダUIDまたは名前。省略時はルートレベルのレコードを対象                                                                                                       |
| `--action`    | `grant` または `revoke` (必須)                                                                                                                    |
| `--role`      | アクセスロール: `viewer`、`shared-manager`、`content-manager`、`content-share-manager`、`full-manager`。`grant` では必須。`revoke` では、そのロールを持つユーザーへの取り消しに限定可能 |
| `--recursive` | サブフォルダ内のレコードを含める                                                                                                                             |
| `--force`     | 確認プロンプトをスキップ                                                                                                                                 |
| `-dry-run`    | 変更を適用せず、変更内容のみ表示                                                                                                                             |

**例:**

{% code expandable="true" %}

```bash
My Vault> nsf-record-permission MQ8GwV3F1sQvGmXt-4zv2A --action grant --role viewer

Request to GRANT 'viewer' permission(s) in 'MQ8GwV3F1sQvGmXt-4zv2A' folder only
No permission changes are needed.
```

{% endcode %}

</details>

<details>

<summary>DotNet SDK</summary>

**メソッド:**

```csharp
var vault = new VaultOnline(auth);
await vault.SyncDown();

var plan = await vault.UpdateKeeperNSFRecordPermissions(
    folderUid: folderUid,
    action:    "grant",
    role:      "viewer",
    recursive: true,
    dryRun:    true);

Console.WriteLine($"Plan: {plan.Grants.Count} grants, {plan.Revokes.Count} revokes, {plan.Skipped.Count} skipped");

if (plan.Grants.Count + plan.Revokes.Count > 0)
{
    var result = await vault.UpdateKeeperNSFRecordPermissions(
        folderUid: folderUid,
        action:    "grant",
        role:      "viewer",
        recursive: true,
        dryRun:    false);

    foreach (var g in result.Grants)
    {
        Console.WriteLine($"{(g.Success ? "[OK]" : "[FAIL]")} {g.RecordUid}  {g.Email}  {g.CurrentRole} -> {g.NewRole}");
    }
}
```

</details>

<details>

<summary>Power Commander</summary>

**コマンド:** `Set-KeeperNSFRecordPermission`

**別名:** `nsf-record-permission`

**パラメータ:**

| パラメータ        | 説明                                                                                                                                           |
| ------------ | -------------------------------------------------------------------------------------------------------------------------------------------- |
| `-FolderUid` | レコードを含むフォルダUIDまたは名前。省略時はルートレベルのレコードを対象                                                                                                       |
| `-Action`    | `grant` または `revoke` (必須)                                                                                                                    |
| `-Role`      | アクセスロール: `viewer`、`shared-manager`、`content-manager`、`content-share-manager`、`full-manager`。`grant` では必須。`revoke` では、そのロールを持つユーザーへの取り消しに限定可能 |
| `-Recursive` | サブフォルダ内のレコードを含める                                                                                                                             |
| `-Force`     | 確認プロンプトをスキップ                                                                                                                                 |
| `-DryRun`    | 変更を適用せず、変更内容のみ表示                                                                                                                             |

**例:**

{% code overflow="wrap" expandable="true" %}

```ps1
PS > Set-KeeperNSFRecordPermission -FolderUid wbxwceZdbPVcyuR-7IybjA -Action grant -Role viewer -Recursive

Request to GRANT 'viewer' permission(s) in 'wbxwceZdbPVcyuR-7IybjA' folder recursively

  PLANNED GRANTS (1):
    oqf7DOKZvSYuwhwFc6qvOw  example1@keepersecurity.com  shared-manager -> viewer
Are you sure you want to apply the above changes? (yes/No): yes

  GRANT (1):
    [OK] oqf7DOKZvSYuwhwFc6qvOw  apohane@keepersecurity.com  shared-manager -> viewer

Summary: 1 succeeded, 0 failed, 0 skipped
```

{% endcode %}

</details>

<details>

<summary>Python CLI</summary>

**コマンド:** `nsf-record-permission`

**パラメータ**:

`folder` フォルダUIDまたは名前

`--dry-run` 実行せず変更内容を表示

`-f, --force` 確認プロンプトをスキップ\
`-R, --recursive` サブフォルダ内のレコードを含める\
`-a, --action` {grant, revoke}\
`-r, --role` {viewer, share-manager, content-manager, content-share-manager, full-manager}

**例**:

```shellscript
My Vault> nsf-record-permission -a revoke <folder_uid>

REVOKE:
  <record_uid> user@keepersecurity.com content-manager
Do you want to proceed with these permission changes? [y/n]: y
revokes <record_uid> user@keepersecurity.com: ok
My Vault>
```

</details>

<details>

<summary>Python SDK</summary>

**関数:** `apply_nsf_record_permissions`

```python
    FOLDER_UID_OR_NAME = "Projects"
    ACTION = "grant"  # grant or revoke
    ROLE = "viewer"  # Required for grant
    RECURSIVE = False
    FORCE = True
    DRY_RUN = False

    plan = nsf_sharing.plan_nsf_record_permissions(
        vault,
        FOLDER_UID_OR_NAME,
        action=ACTION,
        role=ROLE,
        recursive=RECURSIVE,
        current_user=current_user,
    )
    if not plan.updates and not plan.creates and not plan.revokes:
        print("No permission changes are needed.")
        return
    for label, items in (
        ("SKIP", plan.skipped),
        ("GRANT/UPDATE", plan.updates + plan.creates),
        ("REVOKE", plan.revokes),
    ):
        if not items:
            continue
        print(f"\n{label}:")
        for item in items:
            line = f"  {item.get('record_uid')} {item.get('email', '')} {item.get('cur_role', '')}"
            if item.get("new_role"):
                line += f" -> {item['new_role']}"
            print(line)
    if DRY_RUN:
        return
    if not FORCE:
        answer = input("Proceed with permission changes? [y/N]: ").strip().lower()
        if answer not in ("y", "yes"):
            print("Aborted.")
            return
    outcomes = nsf_sharing.apply_nsf_record_permissions(vault, plan)
    for bucket, rows in outcomes.items():
        for item, result in rows:
            status = "ok" if result.get("success") else result.get("message")
            print(f"{bucket} {item.get('record_uid')} {item.get('email')}: {status}")
```

</details>

### 移動コマンド <a href="#move-command" id="move-command"></a>

Keeper NSF (階層型共有フォルダ) のレコードまたはフォルダを、1件ずつ別のフォルダへ移動します。移動対象と移動先フォルダを指定するだけで、指定した対象がフォルダかレコードかはコマンドが自動的に判別します。

<details>

<summary>DotNet CLI</summary>

**コマンド**: `nsf-move`

**パラメータ**:

<table><thead><tr><th width="82">位置</th><th width="191">名前</th><th>説明</th></tr></thead><tbody><tr><td>0</td><td><code>Src</code></td><td>移動するレコードまたはフォルダのUIDまたは名前。</td></tr><tr><td>1</td><td><code>Dst</code></td><td>移動先フォルダのUIDまたは名前。階層型共有フォルダツリーの最上位に移動する場合は<code>root</code>を指定します。</td></tr></tbody></table>

**例**:

{% code expandable="true" %}

```bash
My Vault> nsf-move AbCdEfGhIjnagKlMnOp123 XyZ987654321UjuhaidHere
```

{% endcode %}

</details>

<details>

<summary>DotNet SDK</summary>

**関数:** レコード移動

```csharp
public async Task<KeeperNSFRecordMoveResult> MoveKeeperNSFRecord(
            string recordUidOrTitle, string sourceFolderUidOrName, string targetFolderUidOrName)
        {
            if (string.IsNullOrWhiteSpace(recordUidOrTitle))
            {
                throw new ArgumentException("Record UID or title is required.", nameof(recordUidOrTitle));
            }

            if (sourceFolderUidOrName == null)
            {
                throw new ArgumentException(
                    "Source folder UID or name is required; use \"\", \"/\", or \"root\" for the Keeper NSF root.",
                    nameof(sourceFolderUidOrName));
            }

            if (targetFolderUidOrName == null)
            {
                throw new ArgumentException(
                    "Target folder UID or name is required; use \"\", \"/\", or \"root\" for the Keeper NSF root.",
                    nameof(targetFolderUidOrName));
            }

            var record = recordUidOrTitle.Trim();
            var sourceFolder = sourceFolderUidOrName.Trim();
            var targetFolder = targetFolderUidOrName.Trim();

            var move = new KeeperNSFRecordMoveRequest
            {
                SourceFolderUid = sourceFolder,
                TargetFolderUid = targetFolder,
                RecordUid = record,
            };

            var results = await MoveKeeperNSFRecords(new[] { move }).ConfigureAwait(false);
            return results.FirstOrDefault() ?? new KeeperNSFRecordMoveResult
            {
                SourceFolderUid = sourceFolder,
                TargetFolderUid = targetFolder,
                RecordUid = record,
                Status = "unknown",
                Message = "No response received",
                Success = false,
            };
        }
```

**関数**: フォルダ移動

{% code expandable="true" %}

```csharp
        public async Task<KeeperNSFFolderMoveResult> MoveKeeperNSFFolder(
            string folderUidOrName, string targetParentUidOrName)
        {
            if (string.IsNullOrWhiteSpace(folderUidOrName))
            {
                throw new ArgumentException("Folder UID or name is required.", nameof(folderUidOrName));
            }

            if (targetParentUidOrName == null)
            {
                throw new ArgumentException(
                    "Target parent UID or name is required; use \"\", \"/\", or \"root\" for the Keeper NSF root.",
                    nameof(targetParentUidOrName));
            }

            var folder = folderUidOrName.Trim();
            var targetParent = targetParentUidOrName.Trim();

            var move = new KeeperNSFFolderMoveRequest
            {
                FolderUid = folder,
                TargetParentUid = targetParent,
            };

            var results = await MoveKeeperNSFFolders(new[] { move }).ConfigureAwait(false);
            return results.FirstOrDefault() ?? new KeeperNSFFolderMoveResult
            {
                FolderUid = folder,
                TargetParentUid = targetParent,
                Status = "unknown",
                Message = "No response received",
                Success = false,
            };
        }
```

{% endcode %}

</details>

<details>

<summary>Power Commander</summary>

**コマンド**: `Move-KeeperNSFItem`

**別名**: `nsf-move`

**パラメータ:**

<table><thead><tr><th width="96">位置</th><th width="166">名前</th><th>説明</th></tr></thead><tbody><tr><td>0</td><td><code>Src</code></td><td>移動するレコードまたはフォルダのUIDまたは名前。</td></tr><tr><td>1</td><td><code>Dst</code></td><td>移動先フォルダのUIDまたは名前。階層型共有フォルダツリーの最上位に移動する場合は<code>root</code>を指定します。</td></tr></tbody></table>

**例**:

{% code overflow="wrap" expandable="true" %}

```ps1
PS > Move-KeeperNSFItem -Src "Invoices 2024" -Dst "Archive"
PS > nsf-move <recordUid> <targetFolderUid>
```

{% endcode %}

</details>

<details>

<summary>Python CLI</summary>

**コマンド:** 近日公開

</details>

<details>

<summary>Python SDK</summary>

**関数:** 近日公開

</details>

### フォルダとレコードのアクセス詳細の読み込み <a href="#load-folder-and-record-access-details" id="load-folder-and-record-access-details"></a>

すべてのNSFレコードおよびフォルダのアクセス詳細を取得してキャッシュに保存し、APIコールを頻繁に呼び出す必要を減らします。

<details>

<summary>Python CLI</summary>

**コマンド**: `nsf-load-access`

**フラグ**:

`--folders` フォルダのアクセス詳細を読み込み

`--records` レコードのアクセス詳細を読み込み

**例**:

```shellscript
My Vault> nsf-load-access --folders --records
Loaded access details for 15 folder(s) and 27 record(s) into the NSF cache
My Vault>
```

</details>

<details>

<summary>Python SDK</summary>

**関数**: `load_nsf_access_details`

**例**:

```python
nsf_management.load_nsf_access_details(vault, load_folder=load_folder, load_record=load_record)
```

</details>

### フォルダとレコードのアクセス詳細の取得 <a href="#fetch-folder-and-record-access-details" id="fetch-folder-and-record-access-details"></a>

APIを呼び出さずに、キャッシュからNSFレコードおよびフォルダのアクセス詳細を取得する関数です。

<details>

<summary>Python SDK</summary>

```python
def nsf_access_list(
    vault: vault_online.VaultOnline,
    folder_uids: List[str],
    record_uids: List[str],
) -> None:
    load_folder = bool(folder_uids)
    load_record = bool(record_uids)
    view = vault.nsf_data
    if view is None:
        print("NSF storage is not available on this vault.")
        return
    nsf_management.load_nsf_access_details(vault, load_folder=load_folder, load_record=load_record)

    for folder_uid in folder_uids:
        folder = view.get_folder(folder_uid)
        print(f"\nFolder: {folder.name if folder else '(NSF Folder)'}")
        print(f"UID:    {folder_uid}")
        folder_access_detail = view.get_nsf_folder_access_detail(folder_uid)
        accessors = (folder_access_detail or {}).get("accessors")
        if not accessors:
            print("Access: No cached access details found.")
            continue
        print("Access:")
        for access in accessors:
            print(
                f"  - accessor_uid={access.get('accessor_uid')}"
                f" | access_type={access.get('access_type')}"
                f" | role={access.get('role')}"
                f" | inherited={access.get('inherited')}"
                f" | hidden={access.get('hidden')}"
                f" | owner={access.get('owner', False)}"
            )
            permissions = access.get("permissions")
            if permissions:
                print(f"    permissions={json.dumps(permissions)}")

    for record_uid in record_uids:
        print(f"\nRecord UID: {record_uid}")
        record_access_detail = view.get_nsf_record_access_detail(record_uid)
        if not record_access_detail:
            print("Access: No cached access details found.")
            continue
        print("Access:")
        for access in record_access_detail:
            print(
                f"  - accessor_uid={access.get('access_type_uid')}"
                f" | access_type={access.get('access_type')}"
                f" | role={access.get('access_role_type')}"
                f" | owner={access.get('owner')}"
                f" | inherited={access.get('inherited')}"
                f" | denied={access.get('denied_access')}"
            )
            permissions = {
                "can_view_title": access.get("can_view_title"),
                "can_view": access.get("can_view"),
                "can_edit": access.get("can_edit"),
                "can_list_access": access.get("can_list_access"),
                "can_update_access": access.get("can_update_access"),
                "can_delete": access.get("can_delete"),
                "can_change_ownership": access.get("can_change_ownership"),
                "can_request_access": access.get("can_request_access"),
                "can_approve_access": access.get("can_approve_access"),
            }
            print(f"    permissions={json.dumps(permissions)}")
```

</details>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.keeper.io/keeperpam/jp/commander-sdk/keeper-commander-sdks/sdk-command-reference/nested-shared-folder-commands.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
