diff --git a/lib/private/Files/Node/Folder.php b/lib/private/Files/Node/Folder.php
index 8b2a93ffdc2d2d8c55d098410bfb989c78c19bb6..4a134cdcdbf10932980f3da4a77edde532aa54fa 100644
--- a/lib/private/Files/Node/Folder.php
+++ b/lib/private/Files/Node/Folder.php
@@ -299,6 +299,9 @@ class Folder extends Node implements \OCP\Files\Folder {
 		}));
 
 		if (count($mountsContainingFile) === 0) {
+			if ($user === $this->getAppDataDirectoryName()) {
+				return $this->getByIdInRootMount((int) $id);
+			}
 			return [];
 		}
 
@@ -327,6 +330,47 @@ class Folder extends Node implements \OCP\Files\Folder {
 		});
 	}
 
+	protected function getAppDataDirectoryName(): string {
+		$instanceId = \OC::$server->getConfig()->getSystemValueString('instanceid');
+		return 'appdata_' . $instanceId;
+	}
+
+	/**
+	 * In case the path we are currently in is inside the appdata_* folder,
+	 * the original getById method does not work, because it can only look inside
+	 * the user's mount points. But the user has no mount point for the root storage.
+	 *
+	 * So in that case we directly check the mount of the root if it contains
+	 * the id. If it does we check if the path is inside the path we are working
+	 * in.
+	 *
+	 * @param int $id
+	 * @return array
+	 */
+	protected function getByIdInRootMount(int $id): array {
+		$mount = $this->root->getMount('');
+		$cacheEntry = $mount->getStorage()->getCache($this->path)->get($id);
+		if (!$cacheEntry) {
+			return [];
+		}
+
+		$absolutePath = '/' . ltrim($cacheEntry->getPath(), '/');
+		$currentPath = rtrim($this->path, '/') . '/';
+
+		if (strpos($absolutePath, $currentPath) !== 0) {
+			return [];
+		}
+
+		return [$this->root->createNode(
+			$absolutePath, new \OC\Files\FileInfo(
+				$absolutePath,
+				$mount->getStorage(),
+				$cacheEntry->getPath(),
+				$cacheEntry,
+				$mount
+		))];
+	}
+
 	public function getFreeSpace() {
 		return $this->view->free_space($this->path);
 	}