> 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).

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

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

### 一覧コマンド <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>

**コマンド:** `Not implemented`

**パラメータ**:

`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>


---

# 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 dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

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

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

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.
